<?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>Software Engineering Archives - ShiftMag</title>
	<atom:link href="https://shiftmag.dev/category/software-engineering/feed/" rel="self" type="application/rss+xml" />
	<link>https://shiftmag.dev/category/software-engineering/</link>
	<description>Insightful engineering content &#38; community</description>
	<lastBuildDate>Wed, 02 Sep 2026 12:49:33 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://shiftmag.dev/wp-content/uploads/2024/08/cropped-ShiftMag-favicon-32x32.png</url>
	<title>Software Engineering Archives - ShiftMag</title>
	<link>https://shiftmag.dev/category/software-engineering/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>The phrase that ruins every eCommerce project: &#8220;Just connect it to our ERP.&#8221;</title>
		<link>https://shiftmag.dev/the-phrase-that-ruins-every-ecommerce-project-just-connect-it-to-our-erp-11689/</link>
		
		<dc:creator><![CDATA[Bruno Zagorščak]]></dc:creator>
		<pubDate>Wed, 02 Sep 2026 12:18:13 +0000</pubDate>
				<category><![CDATA[Backend]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[Legacy Systems]]></category>
		<category><![CDATA[system integration]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=11689</guid>

					<description><![CDATA[<p>What sounds like a small API task is usually a full integration problem: sequencing, sync vs async, edge cases, and an old system nobody fully trusts.</p>
<p>The post <a href="https://shiftmag.dev/the-phrase-that-ruins-every-ecommerce-project-just-connect-it-to-our-erp-11689/">The phrase that ruins every eCommerce project: &#8220;Just connect it to our ERP.&#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 fetchpriority="high" decoding="async" width="1774" height="887" src="https://shiftmag.dev/wp-content/uploads/2026/08/ChatGPT-Image-Aug-27-2026-11_36_15-AM.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/ChatGPT-Image-Aug-27-2026-11_36_15-AM.png 1774w, https://shiftmag.dev/wp-content/uploads/2026/08/ChatGPT-Image-Aug-27-2026-11_36_15-AM-300x150.png 300w, https://shiftmag.dev/wp-content/uploads/2026/08/ChatGPT-Image-Aug-27-2026-11_36_15-AM-1024x512.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/ChatGPT-Image-Aug-27-2026-11_36_15-AM-768x384.png 768w" sizes="(max-width: 1774px) 100vw, 1774px" /></figure>


<p class="wp-block-paragraph">Four words show up in almost every eCommerce project we take on here at Neuralab: <em>&#8220;</em>Just connect it to our ERP.<em>&#8220;</em> They usually drop near the end of a kickoff call, tossed out as casually as asking for the Wi-Fi password.</p>



<p class="wp-block-paragraph">The word doing all the heavy lifting (and all the damage) there is <strong><em>just</em></strong>. It’s the word that turns a monolithic beast of a legacy system that nobody in the room fully understands into a neat little line item some project manager expects to close in a two-week sprint.</p>



<p class="wp-block-paragraph">I want to make an argument that sounds painfully obvious once you say it out loud, yet gets completely ignored on most projects: <strong>building a new store and connecting it to the systems already running the business are not the same sport</strong>. Heck, they&#8217;re barely the same project!</p>



<p class="wp-block-paragraph">A new storefront is greenfield. Clear ground with no legacy baggage. You plan the architecture and data model upfront and mostly hold to the plan. An <a href="https://www.linkedin.com/feed/update/urn:li:activity:7450095049377300482" target="_blank" rel="noreferrer noopener">integration with an existing ERP or CRM</a> is brownfield by default. It&#8217;s an archaeological dig into an old system you didn&#8217;t build, that&#8217;s poorly structured, still running, and troublesome in ways nobody ever bothered to write down. Treat the second like the first and you get an integration that works beautifully in the demo and completely shits the bed the first time a real order does something unexpected.</p>



<p class="wp-block-paragraph"><strong>There is a fix</strong>, and it comes down to timing more than technique. I&#8217;ll get to it, but first you need to see what you&#8217;re actually up against.&nbsp;</p>



<h2 class="wp-block-heading"><span id="the-integration-layer-breaks-because-no-one-owns-the-handoffs-between-systems">The integration layer breaks because no one owns the handoffs between systems</span></h2>



<p class="wp-block-paragraph">Let’s start with what the integration layer actually is. The storefront takes the order &#8211; the gateway authorizes the cash &#8211; the tax engine figures out the state’s cut &#8211; the ERP opens a sales order and reserves stock &#8211; accounting generates an invoice &#8211; the warehouse picks and packs &#8211; the CRM logs it all so customer support has something to stare at next week.</p>



<p class="wp-block-paragraph">Every single one of those systems has an owner. But <strong>the handoff between them has no real owner at all</strong>. That’s what the integration layer is: the unowned seams. And seams are exactly where the fabric tears, because it&#8217;s the one place where two systems that were designed in total isolation have to agree on something in real-time, having never formally met.</p>



<h2 class="wp-block-heading"><span id="sometimes-system-takes-the-money-a-beat-before-the-order-exists">Sometimes system takes the money a beat before the order exists</span></h2>



<p class="wp-block-paragraph">Payment authorization must happen synchronously, meaning the customer needs an immediate response while they are waiting on the checkout screen. The payment gateway typically has up to a minute to confirm whether the transaction is approved or declined. But <strong>everything <em>after</em> the payment </strong>&#8211; opening the ERP order, reserving stock, pinging the warehouse &#8211;<strong> has to be asynchronous</strong>. You simply can&#8217;t make a paying customer wait on an ancient ERP API that answers whenever it feels like it. You are accepting eventual consistency by default here, simply because holding synchronous cross-system locks will butcher your conversion rates.&nbsp;</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">So, the confirmation page fires the instant the payment clears, telling the customer &#8220;you&#8217;re all set&#8221; a beat before the system actually knows if it can deliver on that promise. Without explicit architectural patterns to handle that gap you&#8217;re just playing infrastructure roulette.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>Most of the time, this gap closes in milliseconds and nobody&#8217;s the wiser. But sometimes it doesn&#8217;t</strong>. The payment clears, but the queued job to create the order times out or drops on the floor without a sound. Now you’ve taken their money with no order behind it.</p>



<p class="wp-block-paragraph">That failure rarely hits the dev team first. Instead, an account manager has to act as human middleware &#8211; cross-referencing payment logs, re-typing order data into the ERP, and calling the warehouse floor to check on a shipment. Forcing humans to manually heal a cracking system is the most expensive bottleneck of a poorly planned integration.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="683" src="https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP01-1024x683.jpg?x32039" alt="" class="wp-image-11795" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP01-1024x683.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP01-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP01-768x512.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP01.jpg 1535w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>The fixes here aren&#8217;t exotic</strong> but they do need to be explicitly planned, and budgeted upfront, a line item almost nobody includes until after their first major post-launch fire drill.</p>



<h2 class="wp-block-heading"><span id="the-old-system-is-the-business%e2%80%99s-memory-not-clutter">The old system is the business’s memory, not clutter</span></h2>



<p class="wp-block-paragraph">Any ERP or CRM that&#8217;s been running a real business for a few years has grown a <strong>thick layer of weird behavior that exists nowhere in its documentation</strong>. By that I mean a product-code field that silently clips at forty characters, so anything longer has been quietly losing its last digits since 2019. Or a nightly cron job that only works because some guy manually restarts it every Tuesday. Or an &#8220;order status&#8221; column that encodes five completely different business meanings depending on which department touched it last.</p>



<p class="wp-block-paragraph">An outside team scoping a connection to that system on day one is just looking at a facade. They can read the API docs and see the tables, but they cannot see which of those unmapped load-bearing walls their integration is about to lean on. So the scope gets written against the version of the system that exists on paper, not the one coughing in production.</p>



<p class="wp-block-paragraph">There’s a concept worth borrowing here: <a href="https://en.wikipedia.org/wiki/Lindy_effect" target="_blank" rel="noreferrer noopener">The Lindy effect</a>. The longer something has already survived, <strong>the longer it&#8217;s likely to keep going</strong>. That 15-year-old ERP is still there precisely because too much depends on it for anyone to risk ripping it out. Its longevity is proof of its necessity.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">When you arrive with a shiny new tech stack, the temptation is to treat the old system as dead weight and a dumb obstacle overdue for replacement. Resist that instinct! The old system has survived contact with the actual business for a decade and a half. It knows things your new build doesn&#8217;t know yet, encoded in all those annoying quirks you keep tripping over. <a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/" target="_blank" rel="noreferrer noopener">Treat it as a battle-tested opponent</a> rather than a nuisance and try to untangle its accumulated weirdness.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="build-first-audit-second-integrate-last"><strong>Build first, audit second, integrate last</strong></span></h2>



<p class="wp-block-paragraph">Put the greenfield and brownfield halves together and the most common planning error becomes glaringly obvious. Clients, and plenty of agencies, scope the new build and the integration as one single piece of work. Same estimate, same timeline, same assumption that they&#8217;re the same species of task.</p>



<p class="wp-block-paragraph">They are not, and <strong>if you bundle them together you actively poison the integration</strong>.</p>



<p class="wp-block-paragraph">When you write that combined scope, the new platform&#8217;s data model doesn&#8217;t even exist yet. Its catalog structure, content architecture, and the actual shape of the data are completely unsettled. So you&#8217;re designing an integration against a guess, layered on top of the fog already surrounding the old ERP. Guess wrong on either end, and you&#8217;re in for massive rework right when the deadline is breathing down your neck &#8211; which is exactly when developers start reaching for shortcuts that become those fragile seams everyone has to live with afterward.</p>



<p class="wp-block-paragraph">The fix is a sequencing decision, and it’s almost boringly simple:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Build the new thing first. While that&#8217;s happening, send an analyst into the existing systems to do a pure audit. Figure out what the system <em>actually</em> does and where the unmapped walls are. Once the new platform is close to finished and its data model is a fact rather than a weekly weather forecast, <em>then</em> you scope the integration. Now both ends are known.</p>
</blockquote>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="569" src="https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP02-1024x569.jpg?x32039" alt="" class="wp-image-11796" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP02-1024x569.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP02-300x167.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP02-768x427.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/08/justConnectToERP02.jpg 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">I&#8217;ll be honest, we learned this the expensive way at <a href="https://www.neuralab.net/" target="_blank" rel="noreferrer noopener">Neuralab</a>. Years ago, we used to bundle the two into one scope to give a client a tidier number upfront. We’d then spend all that &#8220;saved&#8221; time back with massive interest during the last three weeks of the project, desperately discovering what the old system actually does.</p>



<h2 class="wp-block-heading"><span id="question-the-legacy-workflow-before-you-automate-it">Question the legacy workflow before you automate it</span></h2>



<p class="wp-block-paragraph">Even if sequenced right, <strong>integrations are the hardest work we estimate in Neuralab</strong> because there’s a quiet trap that inflates the scope from the inside.</p>



<p class="wp-block-paragraph">A client has an existing, complicated internal process. The natural instinct for both the developer and the business analyst is to lock onto that process and faithfully rebuild it in the new system, because a concrete process sitting in front of you is a satisfying puzzle to solve.</p>



<p class="wp-block-paragraph">The question almost nobody asks is <a href="https://en.wikipedia.org/wiki/Chesterton's_fence" target="_blank" rel="noreferrer noopener">whether that process still needs to exist at all.</a> Was half of it just scaffolding for a limitation the new system doesn&#8217;t even have? Faithfully cloning a bad process that shouldn&#8217;t survive the migration just relocates the waste into a more expensive place and bills you for the move.</p>



<p class="wp-block-paragraph">We saw this clearly with one of our large pharmacy clients. Their original plan was to manage and edit all rich product details such as marketing copy, attributes, or extended specifications inside their legacy ERP, and then force all that content downstream to the web store. But standard ERPs are notoriously bad at managing complex eCommerce datasets and rich visual content.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Instead of building a fragile, over-engineered integration to force an old ERP into doing a PIM&#8217;s job, we redrew the architectural boundaries. The ERP stayed strictly in its lane: holding SKUs, core titles, pricing, and stock quantities. Meanwhile, WooCommerce became the single source of truth for rich product content. It was essentially functioning as a lightweight PIM for all media and marketing data.&nbsp;</p>
</blockquote>



<p class="wp-block-paragraph">By questioning the legacy workflow instead of blindly automating it, <strong>we saved months of painful integration wor</strong>k and gave their team an architecture that actually fits how they work today.&nbsp;</p>



<h2 class="wp-block-heading"><span id="the-seams-between-systems-need-their-own-memory">The seams between systems need their own memory.</span></h2>



<p class="wp-block-paragraph">So how do you actually wire this stuff together? Point-to-point custom code between each pair of systems is the wrong default. It works great right up until the day an order gets stuck, a client asks what happened, and your honest answer is that the event passed between two systems and vanished into the ether.</p>



<p class="wp-block-paragraph">What actually holds up is an <strong>explicit orchestration layer sitting in the middle</strong> &#8211; whether that’s an event pipeline like n8n which we heavily use, a separately hosted application with its own logging and event-handling capabilities, or a messaging platform such as Kafka, Amazon SQS, or RabbitMQ.&nbsp; Its job is to own the sequencing, handle retries, and log every single event as it passes, so the whole flow can be inspected on its own.</p>



<p class="wp-block-paragraph">When something breaks, you shouldn&#8217;t need write access to the ERP and an open database console on the storefront just to reconstruct the story. You should have <strong>one central place that already holds the receipts</strong>. Intentional middleware is the architecture <a href="https://www.neuralab.net/about/team/" target="_blank" rel="noreferrer noopener">our team defaults to now</a> (usually reaching for custom applications or n8n to drive it). But the tool is just execution! The principle is the real point: the seams between systems deserve their own memory, because nobody else is taking notes.</p>



<h2 class="wp-block-heading">The &#8220;J&#8221; word comes last</h2>



<p class="wp-block-paragraph">The client isn&#8217;t wrong to want a &#8220;just.&#8221; A boring, invisible connection nobody ever thinks about is exactly what a good integration looks like from the outside. That simplicity is the finish line &#8211; you only reach it after someone goes down into the old system, maps the weak walls, and quietly absorbs the complexity so the business doesn&#8217;t have to.</p>



<p class="wp-block-paragraph">So <strong>don&#8217;t argue with the person who says it</strong>, take it as the brief. Do enough excavation upfront so that a year from now, connecting to that ERP genuinely <em>is</em> simple, and the manual re-keying, the spreadsheets, and the cron job someone babysits every Tuesday become an old war story instead of your next Monday.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://shiftmag.dev/the-phrase-that-ruins-every-ecommerce-project-just-connect-it-to-our-erp-11689/">The phrase that ruins every eCommerce project: &#8220;Just connect it to our ERP.&#8221;</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Is Only as Good as the Document Pipeline Behind It</title>
		<link>https://shiftmag.dev/ai-is-only-as-good-as-the-document-pipeline-behind-it-11538/</link>
		
		<dc:creator><![CDATA[Marko Crnjanski]]></dc:creator>
		<pubDate>Thu, 20 Aug 2026 13:28:26 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Apryse]]></category>
		<category><![CDATA[Data Pipelines]]></category>
		<category><![CDATA[Document Processing]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[OCR]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=11538</guid>

					<description><![CDATA[<p>Everyone is busy asking how big the model is, but the real question is what you fed it first - because if your PDFs are mangled and your OCR is sloppy, even the smartest LLM starts from the wrong answer.</p>
<p>The post <a href="https://shiftmag.dev/ai-is-only-as-good-as-the-document-pipeline-behind-it-11538/">AI Is Only as Good as the Document Pipeline Behind It</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">At the WeAreDevelopers World Congress 2026 in Berlin, I spoke with <strong>Luca Mancinelli (Solutions Engineer, Apryse)</strong>, about a part of the AI stack that tends to receive far less attention than models themselves:<strong> </strong>the document pipeline.</p>



<p class="wp-block-paragraph">As companies move more of their knowledge into AI applications, PDFs, scans, reports, and invoices are becoming key data sources. The real challenge is <strong>preserving enough structure and context</strong> for AI systems to understand them properly.</p>



<h1 class="wp-block-heading"><span id="document-extraction-is-becoming-key-in-ai-applications">Document extraction is becoming key in AI applications</span></h1>



<p class="wp-block-paragraph">For much of the history of enterprise software, documents typically sat at the end of a process. An application generated a report, invoice, or contract, and the PDF was the finished product. Mancinelli believes AI is changing that relationship:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Documents used to be the output &#8211; for example, a PDF you’d print or send out. Now they’re also a structured input that powers AI systems.</p>
</blockquote>



<p class="wp-block-paragraph">More precisely, the challenge for developers is turning documents that are often unstructured or semi-structured into <strong>structured information that downstream systems can use</strong>.</p>



<p class="wp-block-paragraph">An LLM can ingest raw text, but simply extracting characters from a file does not always preserve what makes the original document meaningful. A heading has a different role from a paragraph. A value in a table depends on its row and column. A number beside “Total” means something different from the same number appearing somewhere else on the page.</p>



<p class="wp-block-paragraph">That is why document extraction is becoming an important preprocessing layer in AI applications. The goal is not just to recover text, but to give models cleaner, better-organized context.</p>



<h1 class="wp-block-heading"><span id="bad-pdf-parsing-can-lose-information-that-even-a-stronger-model-cannot-recover">Bad PDF parsing can lose information that even a stronger model cannot recover</span></h1>



<p class="wp-block-paragraph">Anyone who has tried to build a production pipeline around real-world PDFs quickly discovers that <strong>documents are far less predictable than API responses or database records</strong>. Mancinelli points to three recurring problems:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">First are complex layouts: you can have headers, tables, and different formats in the same document, and that creates a huge challenge for systems. Second is poor OCR, which can produce messy output. Third is the loss of context.</p>
</blockquote>



<p class="wp-block-paragraph">This distinction becomes especially important with RAG systems and other LLM-powered applications. If a document is badly parsed before it reaches a model, a more powerful model cannot necessarily recover information that was lost earlier in the pipeline.</p>



<p class="wp-block-paragraph">For developers, that means<strong> data quality becomes an architectural issue </strong>rather than simply an AI-model issue.</p>



<h1 class="wp-block-heading"><span id="document-processing-depends-on-the-use-case">Document processing depends on the use case</span></h1>



<p class="wp-block-paragraph">Where document processing happens is another architectural decision that becomes more important as AI moves into regulated and data-sensitive environments.</p>



<p class="wp-block-paragraph">Mancinelli argues against treating cloud and self-hosted processing as an either-or decision. <strong>The right model depends on the application, its infrastructure, and the type of data involved</strong>.</p>



<p class="wp-block-paragraph">For organizations working with particularly sensitive documents, processing files within their own environment can reduce the amount of data that has to move outside their infrastructure. Cloud services, meanwhile, can lower the infrastructure burden and make experimentation easier in some projects.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">It&#8217;s not one or the other; each solution has its own merit. It depends on the use case.</p>
</blockquote>



<p class="wp-block-paragraph">That may sound obvious, but it becomes a meaningful engineering trade-off once document pipelines start handling contracts, financial records, healthcare documents, or other sensitive enterprise information. Privacy requirements, latency, scalability, and operational complexity <strong>all have to be considered alongside extraction accuracy</strong>.</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="Why Documents Are the NEW AI Data Layer" width="500" height="281" src="https://www.youtube.com/embed/NKAbUc5s_BU?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>



<h1 class="wp-block-heading"><span id="a-powerful-sdk-is-useless-if-developers-struggle-to-integrate-it">A powerful SDK is useless if developers struggle to integrate it</span></h1>



<p class="wp-block-paragraph">There is also a more familiar developer problem: integration. No matter how sophisticated a document-processing engine is, developers eventually have to put it into a real application, maintain it, and debug it.</p>



<p class="wp-block-paragraph">For Mancinelli, good documentation is therefore <strong>one of the most important characteristics of a production-ready SDK</strong>. Practical examples matter as well: developers should be able to see realistic implementations and adapt them instead of building every integration from scratch.</p>



<p class="wp-block-paragraph">He also points to higher-level APIs as a way of reducing unnecessary implementation complexity:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The point is particularly relevant as AI infrastructure becomes more fragmented. Developers already have to connect models, vector databases, data sources, evaluation systems, observability tools, and application logic. Adding another complicated layer to the stack can quickly increase both development and maintenance costs.</p>
</blockquote>



<p class="wp-block-paragraph">A useful document SDK therefore has to solve two problems at once: the difficult underlying document-processing problem and the developer-experience problem surrounding it.</p>



<h1 class="wp-block-heading"><span id="data-pipelines-will-become-increasingly-important">Data pipelines will become increasingly important </span></h1>



<p class="wp-block-paragraph">Predicting what software development will look like several years from now is difficult, and Mancinelli avoids picking a single technology that will dominate.</p>



<p class="wp-block-paragraph">Instead, he expects data pipelines to become increasingly important as companies process larger and more complex collections of information.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">One thing is sure: the complexity of the data is going to increase, and the amount of data is going to increase as well. That means data management pipelines will become even more critical.</p>
</blockquote>



<p class="wp-block-paragraph">For developers working with AI, that may be the more practical takeaway.</p>



<p class="wp-block-paragraph">&#8220;The industry tends to focus heavily on what happens inside the model: larger context windows, new reasoning capabilities, faster inference, and increasingly capable agents. But production AI systems also depend on everything that happens before a prompt reaches the model&#8221;, Mancinelli said.</p>



<p class="wp-block-paragraph">If the input is incomplete, badly extracted, or stripped of its structure, <strong>even an advanced LLM starts from a disadvantage</strong>.</p>



<p class="wp-block-paragraph">As enterprise AI matures, document processing may become less a peripheral PDF problem&nbsp;and more&nbsp;<strong>a core part of the AI data stack</strong>, one where developers have to think carefully about structure, privacy, deployment, and, above all, context.</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/08/luca_1_.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/luca_1_.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/08/luca_1_-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/08/luca_1_-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/luca_1_-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure><p>The post <a href="https://shiftmag.dev/ai-is-only-as-good-as-the-document-pipeline-behind-it-11538/">AI Is Only as Good as the Document Pipeline Behind It</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Netlify&#8217;s CTO: You learn more from shipping 30 imperfect apps than from one perfect tutorial</title>
		<link>https://shiftmag.dev/dana-lawson-shift-conference-11301/</link>
		
		<dc:creator><![CDATA[Anastasija Uspenski]]></dc:creator>
		<pubDate>Tue, 11 Aug 2026 12:46:13 +0000</pubDate>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Infobip Shift 2026]]></category>
		<category><![CDATA[Netlify]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=11301</guid>

					<description><![CDATA[<p>Dana Lawson argues that AI has lowered the barrier to software development so much that the best way to learn is by building, shipping imperfect apps, and improving them along the way.</p>
<p>The post <a href="https://shiftmag.dev/dana-lawson-shift-conference-11301/">Netlify&#8217;s CTO: You learn more from shipping 30 imperfect apps than from one perfect tutorial</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/08/Dana.Netlify.jpg?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">Last autumn, <a href="https://shiftmag.dev/unlock-your-true-full-stack-potential-with-ai-agents-6887/" target="_blank" rel="noreferrer noopener">I had the chance to speak with <strong>Dana Lawson</strong></a>, CTO at Netlify, for ShiftMag. This year, I was thrilled to learn that she’ll be joining us as a speaker at <a href="https://shift.infobip.com/?%7CEU%7C-Shift_Zadar_2024-%5BTy:G_Brand_Search;Lng:EN;Bid:MAN_eCPC%5D" target="_blank" rel="noreferrer noopener">Infobip Shift</a> in Zadar &#8211; and ShiftMag readers can get a <a href="https://www.entrio.hr/en/event/infobip-shift-2026-27033?pc=MAG15" target="_blank" rel="noreferrer noopener">special discount</a>.</p>



<p class="wp-block-paragraph">Ahead of her talk, I wanted to talk to her about <a href="https://x.com/Netlify/status/2062165455104618982" target="_blank" rel="noreferrer noopener">Hot App Summer</a>, Netlify’s community challenge that encouraged developers to <strong>ship one AI-assisted or vibecoded app every day for 30 days</strong> in June, because it’s a great example of how AI is changing the way we learn, build, and experiment with software.</p>



<h2 class="wp-block-heading"><span id="netlify-got-1-000-000-users-in-three-weeks">Netlify got 1.000.000 users in three weeks</span></h2>



<p class="wp-block-paragraph">Netlify recently crossed 16 million users, adding <a href="https://lnkd.in/p/dtErY2gR" target="_blank" rel="noreferrer noopener">1 million of them in just three weeks</a>. For Dana, the milestone itself is less interesting than the pace of growth &#8211; and what it says about who is building software today:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The number is exciting, but the pace tells the real story: it points to a fundamental shift in how software gets built.</p>
</blockquote>



<p class="wp-block-paragraph">As Netlify&#8217;s CEO Mett Billman in his post says, when Netlify crossed 10 million users, much of the growth was driven by developers discovering the platform through coding agents. </p>



<p class="wp-block-paragraph">That wave hasn’t slowed, but <strong>the audience is expanding beyond professional developers</strong>: finance teams are building dashboards, sales teams are creating prototypes for prospects, and customer success teams are shipping tools they once would have needed engineering to build.</p>



<p class="wp-block-paragraph">AI is lowering the barrier to software development to the point where building is no longer reserved for people with deep technical expertise. Someone with an idea, a spreadsheet, and an internet connection can increasingly turn that idea into working software in hours.</p>



<h2 class="wp-block-heading"><span id="we-can-now-learn-by-shipping">We can now learn by shipping</span></h2>



<p class="wp-block-paragraph">That shift was on full display in <a href="https://lnkd.in/p/d9kvmgEM" target="_blank" rel="noreferrer noopener">Hot App Summer</a>, which started as a &#8220;build one app a day&#8221; challenge and grew into a <strong>community where people publicly shared their projects and experiences</strong>. As Lawson put it, &#8220;People were not competing, they were inspiring each other.&#8221;</p>



<p class="wp-block-paragraph">What stood out to Dana most was what that revealed about how people learn today:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">People learn by shipping.&nbsp;You can build something on Monday, discover what you still don’t know on Tuesday, improve it on Wednesday, and then repeat the process.</p>
</blockquote>



<p class="wp-block-paragraph">As she put it, you learn more from thirty imperfect apps than from one perfect tutorial, because every project exposes something new to solve.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="959" height="1024" src="https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-10-at-15.51.36-959x1024.png?x32039" alt="" class="wp-image-11378" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-10-at-15.51.36-959x1024.png 959w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-10-at-15.51.36-281x300.png 281w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-10-at-15.51.36-768x820.png 768w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-10-at-15.51.36.png 1188w" sizes="auto, (max-width: 959px) 100vw, 959px" /></figure>



<h2 class="wp-block-heading"><span id="now-even-small-problems-can-be-solved-with-software"><strong>Now, even small problems can be solved with software</strong></span></h2>



<p class="wp-block-paragraph">Looking back at the projects created during challenge, Dana points out that most were <strong>not attempts to build the next billion-dollar startup</strong>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Many focused on solving small, everyday problems &#8211; from time management and business processes to family coordination and content creation.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>That part of the software market has often been underserved</strong> because custom solutions were not always worth building financially.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">AI suddenly makes these niche problems economically viable to solve.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="engineers-are-not-disappearing-their-role-is-expanding">Engineers are not disappearing, their role is expanding</span></h2>



<p class="wp-block-paragraph">Netlify’s CTO believes this lower barrier to entry points to a much bigger shift across the industry: <strong>computer literacy is changing</strong>. It used to mean knowing how to use technology, but today it also means knowing how to create with it.</p>



<p class="wp-block-paragraph">This allows experts from different fields to solve problems in their own areas without waiting for someone else to create the tools they need:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">A CFO can build a forecasting system, a teacher can create a classroom tool, a small business owner can create their own software instead of waiting for someone else to build it.</p>
</blockquote>



<p class="wp-block-paragraph">In her view, more people creating software does not make engineers less important and at <a href="https://shift.infobip.com/?%7CEU%7C-Shift_Zadar_2024-%5BTy:G_Brand_Search;Lng:EN;Bid:MAN_eCPC%5D" target="_blank" rel="noreferrer noopener">Shift in Zadar</a>, <strong>she is going to challenge the idea that AI makes professional engineers less valuable</strong>. Her point is the opposite: as more people start building software, strong infrastructure, security, and engineering practices matter even more:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Engineers are not disappearing, their role is expanding. They are becoming the people who build platforms, guardrails, and systems that allow millions of others to develop software safely.</p>
</blockquote>



<h3 class="wp-block-heading"><span id="get-your-ticket-for-shift-conference-with-aspecial-discount-for-shiftmag-readers">Get your ticket for Shift conference with a&nbsp;<a href="https://www.entrio.hr/en/event/infobip-shift-2026-27033?pc=MAG15" target="_blank" rel="noreferrer noopener">special discount for ShiftMag readers</a>!</span></h3>


<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify.jpg?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/Dana.Netlify-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure><p>The post <a href="https://shiftmag.dev/dana-lawson-shift-conference-11301/">Netlify&#8217;s CTO: You learn more from shipping 30 imperfect apps than from one perfect tutorial</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What If the Biggest Bottleneck Behind AI&#8217;s 10× Promise Is the Human Engineer?</title>
		<link>https://shiftmag.dev/what-if-the-biggest-bottleneck-behind-ais-10x-promise-is-the-human-engineer-11165/</link>
		
		<dc:creator><![CDATA[Kristina Valjak]]></dc:creator>
		<pubDate>Tue, 04 Aug 2026 13:26:42 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Developer Experience]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=11165</guid>

					<description><![CDATA[<p>Engineering teams are starting to resemble legacy Java apps hitting thread exhaustion. I believe change is unavoidable, and we need a better way to organize the work.</p>
<p>The post <a href="https://shiftmag.dev/what-if-the-biggest-bottleneck-behind-ais-10x-promise-is-the-human-engineer-11165/">What If the Biggest Bottleneck Behind AI&#8217;s 10× Promise Is the Human Engineer?</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/08/10x-developer-1.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/10x-developer-1.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/08/10x-developer-1-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/08/10x-developer-1-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/10x-developer-1-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">For the last year, a bold sentence has hung over engineers’ heads: with tools like Claude Code, <strong>we will speed up our delivery by up to 10x</strong>. I even personally wrote:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">It is no longer impossible to think that one engineer with Claude Code can produce what a team of three developers did 18 months ago. Our old ceremonies and structures were designed for a different era. We need to think outside of the box and habits, and think critically about HOW we operate.</p>
</blockquote>



<p class="wp-block-paragraph">Expectations were set, and the year of execution began. But what should be read between the lines is that <strong>a developer is not the same as an engineer</strong>.</p>



<h2 class="wp-block-heading"><span id="the-myth-of-the-10x-developer">The myth of the 10x developer</span></h2>



<p class="wp-block-paragraph">Yes, we now have tools that can generate code and handle developer tasks, but this is just part of the engineering lifecycle, which now has a clear price. The new AI era demands even more from engineers;<strong> engineers on steroids</strong> <strong>are now expected</strong>. But no matter how advanced they are, engineers are still single-threaded by human design.</p>



<p class="wp-block-paragraph">Processes built around the development cycle are complex. The architecture built around physical-layer restrictions is complex. The 10x claim is a tempting goal, but it can still be applied only to code-generation throughput, not to the surrounding engineering system that keeps pace.</p>



<p class="wp-block-paragraph">What I realized is that we, across the industry, are <strong>treating engineers the way developers used to treat legacy Java applications</strong>: by pushing an infinite stream of requests into a rigid, single-threaded system. At this point, we cannot state that we actually automated an engineering job; we have just dramatically increased the concurrency of our cognitive load. And this will not stop; this will continue to expand.</p>



<p class="wp-block-paragraph"><strong>The analogy with Java&#8217;s evolution is impossible to ignore</strong>. I will use a Java evolution comparison to further explain the complexity we need to overcome. </p>



<p class="wp-block-paragraph">What will happen if we just keep adding threads to a limited pool without upgrading the consumer’s architecture? <strong>System failure is a mathematical certainty</strong>. To fix thread exhaustion, we need to implement bounded queues (limiting Work-in-Progress) and strict rate-limiting on context switching. Sounds familiar?</p>



<h2 class="wp-block-heading"><span id="why-the-old-java-model-couldn%e2%80%99t-scale">Why the old Java model couldn’t scale</span></h2>



<p class="wp-block-paragraph">To understand how to navigate this new era of AI acceleration, we have to look at <strong>how software engineers solved the problem of scale decades ago</strong>. </p>



<p class="wp-block-paragraph">In the early days of Java, handling concurrent traffic relied on a straightforward architecture: the <strong>Thread-per-Request model</strong>. When a user interacted with a web application, the server spun up a dedicated operating system (OS) thread to handle that request from start to finish. It was simple, sequential, and highly predictable. </p>



<p class="wp-block-paragraph">But as the demand grew, this model hit a physical wall. OS threads are expensive; they require a fixed amount of system memory and CPU overhead to maintain. If a downstream datasystem also became slow, those <strong>fast-moving request threads began to queue up</strong>, block, and wait. Instead of processing code, the CPU spent all its energy swapping memory contexts between thousands of stalled threads. This led to <strong>Thread Exhaustion</strong> and system-wide livelocks.</p>



<h2 class="wp-block-heading"><span id="putting-the-complexity-on-developers">Putting the complexity on developers</span></h2>



<p class="wp-block-paragraph">The Java Threading issue was not fixed by trying to force hardware to do the impossible, as we would demand of our human engineers to just type faster. Instead, the language underwent a <strong>massive architectural evolution over the years</strong>.</p>



<p class="wp-block-paragraph">Thread pools were introduced to strictly limit the amount of active work. Besides Java core changes, the dominant answer to thread exhaustion was reactive and <strong>asynchronous programming frameworks like RxJava, Project Reactor, and Spring WebFlux</strong>. These models worked by making blocking explicit: instead of a thread waiting, the code itself was restructured into chains of callbacks and non-blocking I/O operations. </p>



<p class="wp-block-paragraph">The result was dramatically better hardware utilization. The cost was equally dramatic: code became harder to read, harder to debug, and cognitively expensive to write correctly. <strong>You solved the thread blocking problem by moving the complexity into the developer’s mind</strong>.</p>



<h2 class="wp-block-heading"><span id="new-human-operating-system">New human operating system</span></h2>



<p class="wp-block-paragraph">Project Loom is Java’s answer to that bargain. Virtual Threads give you the hardware efficiency of reactive programming without the cognitive overhead. The code still reads as sequential, but the scheduler handles the yielding. </p>



<p class="wp-block-paragraph">Project Loom didn&#8217;t redefine what a thread does, but how it&#8217;s scheduled. Instead of tying one heavy, expensive OS thread to a single task, Java changed the underlying execution framework by <strong>introducing a massive abstraction layer</strong>. </p>



<p class="wp-block-paragraph">Across the industry, AI-assisted engineering is forcing us to rethink the trade-off between speed and structure. This is no longer just about managers assigning tasks; it is about designing a human operating model where AI amplifies human capability, rather than replacing it.</p>



<h2 class="wp-block-heading"><span id="ai-is-exhausting-engineers">AI is exhausting engineers?</span></h2>



<p class="wp-block-paragraph"><strong>We cannot patch the human brain to expand its working memory</strong>, nor can we download more RAM into an engineer’s skull. When we try to force an engineer to context-switch across five complex initiatives at once, we are essentially trying to run legacy, heavy OS threads without an abstraction layer. </p>



<p class="wp-block-paragraph">The human brain blocks, thrashes, and enters <strong>a state of total exhaustion</strong>. </p>



<p class="wp-block-paragraph">When we brought Claude Code into our workflow, we fundamentally changed the execution speed of our inputs. An engineer can now use an assistant to generate a massive Pull Request in minutes, rather than days. </p>



<p class="wp-block-paragraph">While <strong>the input and generation path is running at warp speed</strong>, the specification, review, validation, and integration paths are still human and heavily constrained by the cognitive memory limits of our skilled engineers and their well-being. </p>



<p class="wp-block-paragraph">We don’t need to slow down the AI, nor can we change human biology. Instead, just like the Java architects of the past, we need to <strong>rewrite the architecture of how work flows through our teams</strong>. </p>



<p class="wp-block-paragraph">Our job is to design a human runtime environment that can handle this new level of concurrency. </p>



<p class="wp-block-paragraph">If we don’t adapt how teams are structured and how work is prioritized, the human side of the system can quickly become overloaded.</p>



<p class="wp-block-paragraph">They run at <strong>100% mental capacity trying to manage the noise</strong>, while their actual throughput on long-term technical architecture stalls.</p>



<h2 class="wp-block-heading"><span id="we-need-to-redesign-the-system-not-the-engineers">We need to redesign the system, not the engineers</span></h2>



<p class="wp-block-paragraph">The first challenge before us is to understand <strong>what work is best done by humans and what is better left to AI agents</strong>. </p>



<p class="wp-block-paragraph">I started exploring these questions with my teams. The first thing we challenged was our Scrum ceremonies. We found that Kanban-like boards, with clearly prioritized topics and explicit engineering ownership, were a better fit, while keeping the sprint cadence intact. </p>



<p class="wp-block-paragraph">We also started bringing engineering into product discussions much earlier, <strong>making sure engineers understood the &#8220;why&#8221; before diving into the &#8220;how&#8221;</strong>. At first glance, this may seem unrelated, but it leads to better specifications and helps us classify different types of work more effectively. And once we understand those different contexts, we can make much better decisions about context switching within the same sprint. </p>



<p class="wp-block-paragraph">However, changing the scaffolding is only half the battle. To truly scale this new environment, we also need to <strong>introduce highly skilled orchestrators </strong>who deeply understand the system we are building, individuals capable of dynamically delegating tasks between human minds and AI assistants based on cost, complexity, and risk. <strong>Brand-new engineering roles are emerging.</strong></p>



<p class="wp-block-paragraph">These engineers aren’t just writing code anymore, they are <strong>acting as the “Team Core Architects” of our teams</strong>, designing the very concurrency abstractions and execution rules that keep our human operating system from collapsing under its own speed. </p>



<p class="wp-block-paragraph">In an ideal future state, when a “Team Core Architect” designs a workflow, they <strong>build an environment in which a human can step in to perform deep, high-value cognitive processing</strong>, not to be wasted on something that can be automated. </p>



<p class="wp-block-paragraph">We aren’t asking our engineers to work harder or faster, we are changing the scheduling abstraction above them so that their finite mental energy is utilized only where it matters most.</p>



<h2 class="wp-block-heading"><span id="the-human-project-loom-framework">The Human Project Loom framework</span></h2>



<p class="wp-block-paragraph">Transitioning to a “Human Project Loom” framework does not happen overnight by simply buying more enterprise Claude licenses. In reality, we quickly learned that <strong>throwing tools at a burning team only increases the noise</strong>. </p>



<p class="wp-block-paragraph">Instead, the true value of AI assistants over the past year was <strong>buying us precious breathing room</strong>. We needed our human time to draft ideas on how to work now vs. next period and turn ideas into concrete execution plans. </p>



<p class="wp-block-paragraph">But as we began rolling out this new architecture as an idea, we quickly realized: as the machine layer can grow faster, <strong>humans require even more human interaction, mentoring, and deliberate guidance</strong>. To safely scale our human platform threads without hitting a memory crash, we need to stop treating “software engineering” as a single, uniform role. </p>



<p class="wp-block-paragraph">Just as the Java Virtual Machine relies on a multi-layered stack, we will need to <strong>redefine our engineering roles</strong>. One option is to separate them into distinct, specialized layers of capability as an additional dimension on top of the traditional engineering roles.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="886" src="https://shiftmag.dev/wp-content/uploads/2026/07/Screenshot-2026-07-30-at-11.39.47-1024x886.png?x32039" alt="" class="wp-image-11192" srcset="https://shiftmag.dev/wp-content/uploads/2026/07/Screenshot-2026-07-30-at-11.39.47-1024x886.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/07/Screenshot-2026-07-30-at-11.39.47-300x260.png 300w, https://shiftmag.dev/wp-content/uploads/2026/07/Screenshot-2026-07-30-at-11.39.47-768x664.png 768w, https://shiftmag.dev/wp-content/uploads/2026/07/Screenshot-2026-07-30-at-11.39.47.png 1276w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



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



<p class="wp-block-paragraph">At the foundation is the Engineer. In the legacy world, these individuals were predominantly in “developer mode”. Today, <strong>we are stretching them into topic owners</strong>, not just as architectural discovery phase owners, but to those who are starting their work with the thought: &#8220;Let us understand why we are doing this.&#8221;</p>



<p class="wp-block-paragraph">They are using AI context windows to rapidly learn system architecture, trace deep code dependencies, and upskill themselves at a pace that was previously impossible. </p>



<p class="wp-block-paragraph"><strong>Perk</strong>: They can now possess the technical knowledge of higher roles much sooner. </p>



<p class="wp-block-paragraph"><strong>Cost</strong>: They still need experience to gain seniority and mentoring investment. The skills of a senior engineer last year are not the same this year. </p>



<h2 class="wp-block-heading"><span id="the-orchestrator-engineer">The Orchestrator Engineer</span></h2>



<p class="wp-block-paragraph">The next level is the Orchestrator Engineer. What I was informally calling “Team Core Architects” in the field now has a proper name within the proposed framework. These are the <strong>senior engineers and tech leads who rode the initial AI wave early</strong> and already comprehend how to amplify their individual output. But mastering personal productivity is a single-threaded victory. The challenge for an Orchestrator today is learning how to scale that velocity to other humans. </p>



<p class="wp-block-paragraph">You cannot be an effective tech lead without a deep understanding of your teammates’ cognitive limitations and thread exhaustion points. The Orchestrator’s job is to <strong>act as the local thread scheduler</strong>, determining which sub-tasks are delegated to Claude and ensuring other engineers don’t drown in the massive cognitive blast radius of AI-generated pull requests. </p>



<p class="wp-block-paragraph"><strong>Perk</strong>: Problem-solving mindset is a top skill; there are new and innovative ways to solve problems, a puzzle game for top engineers.</p>



<p class="wp-block-paragraph"><strong>Cost</strong>: One of the most used tools is other humans, which means broadening soft skillset and awareness of the impact on others.</p>



<h2 class="wp-block-heading"><span id="the-os-level-engineers">The OS-Level Engineers</span></h2>



<p class="wp-block-paragraph">Finally, the last level is OS-Level Engineers. These are the <strong>seasoned engineering managers and principal architects who view the entire system holistically</strong>. They debug the JVM. They are the ones who define and track organizational metrics to see where thread starvation is occurring, dynamically allocate token and engineering resources, orchestrate the orchestrators, and inject mental “memory and heap space” into the team before burnout hits. </p>



<p class="wp-block-paragraph">They recognize that when a team is stuck in firefighting mode, it is a structural failure, and they step in to re-architect the environment so the machine loop serves the human, not the other way around. But at the same time, they need to define possible futures. </p>



<p class="wp-block-paragraph"><strong>With the power of AI tools, they can now help their teams with delivery</strong>. This does not mean falling into an antipattern of using vibe code PRs in team’s repositories, but rather giving them structure by drafting workflows and skills that could be a real time and cost saver for the whole organization. </p>



<p class="wp-block-paragraph"><strong>Perk</strong>: At the same time, our context is even more stretched, but we are closer to the core problem and are able to be hands-on more than ever. </p>



<p class="wp-block-paragraph"><strong>Cost</strong>: Context is overwhelming, and it is harder than ever to be on all 3 fronts: business, people, and technical. And it is not easy to introduce a new lead while undergoing a massive change ourselves.</p>



<h2 class="wp-block-heading"><span id="teams-are-being-asked-to-change-overnight">Teams are being asked to change overnight</span></h2>



<p class="wp-block-paragraph">There is a crucial piece of context written in small letters underneath the history of Java’s evolution: Project Loom took nearly six years to design, test, and safely stabilize before it became a standard part of the runtime environment. </p>



<p class="wp-block-paragraph">Yet, we are silently pushing for our human teams to undergo a matching structural change almost overnight. Because<strong> the tools have advanced in months, we expect our organizational psychology to do the same</strong>. But human adaptation cannot be fast-tracked with a software update.</p>



<p class="wp-block-paragraph">Empathy, psychological safety, and clear leadership are even more critically needed now than they were when we were single-threaded. </p>



<p class="wp-block-paragraph">If we commit to this new three-layer architecture, <strong>every engineer is facing a massive “delta”</strong>, a structural skill gap they must close to survive in this new framework. </p>



<p class="wp-block-paragraph"><strong>The Engineer Delta </strong>is shifting from syntactical output to intent comprehension. They must close the gap between knowing how to develop features and knowing how to critically evaluate an architectural pattern, and understanding why they are developing this feature in the first place. </p>



<p class="wp-block-paragraph"><strong>The Orchestrator Delta</strong>, on the other hand, is shifting from individual velocity to cognitive capacity management. They must learn to measure the mental load of the engineers they work with on the current assignment and master the art of safe, bounded task delegation. </p>



<p class="wp-block-paragraph"><strong>The OS-Level Delta</strong> is shifting from delivery management to ecosystem architecture. We must close the gap between tracking velocity, maintaining teams, connecting the business needs, and designing complex human-AI throughput environments. These are not abstract gaps, they are the live challenges every team is navigating right now. </p>



<h2 class="wp-block-heading"><span id="how-do-we-onboard-new-engineers-when-our-roles-are-still-changing">How do we onboard new engineers when our roles are still changing?</span></h2>



<p class="wp-block-paragraph">But as we rewrite our human operating system, we are navigating unmapped territory with severe, systemic unknowns. The most glaring unknown is the onboarding: how do we successfully introduce new engineers to a team when we are actively redefining what our roles even mean? </p>



<p class="wp-block-paragraph">Because many organizations are considering to pause hiring to force efficiency out of AI tools, <strong>we are inadvertently creating dangerous generation gaps</strong>. If we don’t bring in fresh minds to learn the system from the ground up, who will step into the Orchestrator or OS-Level roles five years from now? Who will pass our human knowledge further? </p>



<p class="wp-block-paragraph">I strongly advocate <strong>the continuous internship program</strong> as the best way to introduce new human talent to our talent pools. </p>



<p class="wp-block-paragraph">Because the ground beneath our feet is constantly shifting, our team’s ceremonies must undergo their own architectural evolution. Look at the traditional agile retrospective. Historically, it was a highly transactional ceremony designed to celebrate wins, name out challenges and concerns, and assign action items. Today, that approach falls short. Who to assign action to? </p>



<h2 class="wp-block-heading"><span id="staying-human-is-our-perogative">Staying human is our perogative</span></h2>



<p class="wp-block-paragraph">In an AI-accelerated world, retrospectives must pivot to become a dedicated space for pure human connection. They must be treated as an environment for simply sharing thoughts, venting anxieties, and creating bonds between teams and managers. </p>



<p class="wp-block-paragraph">We don’t just need a list of Jira action items at the end of the hour, whole industry needs a<strong> collaborative sanity check</strong>. We do not need actions to be solved, but to hear and see the real load people are holding. And yes, my 1:1s become more emotional, retros become more challenging, and we all in the end act more human than ever.</p>



<p class="wp-block-paragraph">We need a shared space to learn how to survive the fires together, ensure our mental heap space isn&#8217;t crashing, and remind ourselves that behind every hyper-accelerated AI execution thread, there is still a human heart driving the system.</p>



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



<p class="wp-block-paragraph"><strong><em>The views expressed in this article are those of the author and do not necessarily reflect the official position of the company.</em></strong></p>
<p>The post <a href="https://shiftmag.dev/what-if-the-biggest-bottleneck-behind-ais-10x-promise-is-the-human-engineer-11165/">What If the Biggest Bottleneck Behind AI&#8217;s 10× Promise Is the Human Engineer?</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Choose a Database Because It Fits the Workload, Not Because It’s Familiar</title>
		<link>https://shiftmag.dev/choose-a-database-because-it-fits-the-workload-not-because-its-familiar-11185/</link>
		
		<dc:creator><![CDATA[Marko Crnjanski]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 13:47:02 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Aerospike]]></category>
		<category><![CDATA[AI Infrastructure]]></category>
		<category><![CDATA[Database Architecture]]></category>
		<category><![CDATA[NoSQL Databases]]></category>
		<category><![CDATA[P99 Latency]]></category>
		<category><![CDATA[Zohar Elkayam]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=11185</guid>

					<description><![CDATA[<p>The fastest way to create technical debt in AI is still the oldest one: choosing a database because it feels comfortable.</p>
<p>The post <a href="https://shiftmag.dev/choose-a-database-because-it-fits-the-workload-not-because-its-familiar-11185/">Choose a Database Because It Fits the Workload, Not Because It’s Familiar</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">At the WeAreDevelopers Conference in Berlin, I met with <strong>Zohar Elkayam</strong> (Principal Solutions Architect, Aerospike) to talk about one of the most common mistakes engineering teams still make: <strong>choosing a database because it’s familiar</strong>, instead of choosing it for the actual problem they need to solve. </p>



<p class="wp-block-paragraph">It sounds like a small decision at first, but as Zohar explains, it can become a costly one later when teams have to deal with scale, reliability, latency, and re-architecture. </p>



<p class="wp-block-paragraph">We also discussed what changes when you <strong>build for real-time AI workloads</strong>, and why predictable performance matters far more than averages when your users expect speed every time.</p>



<h2 class="wp-block-heading"><span id="when-teams-pick-a-database-today-what-do-they-most-often-get-wrong">When teams pick a database today, what do they most often get wrong?</span></h2>



<p class="wp-block-paragraph"><strong>Zohar</strong>: Most people start by thinking about the databases they already know and have used in previous roles, rather than what they actually need for the specific use case in front of them.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">As a result, we often see customers choose<strong> </strong>something familiar instead of evaluating variables such as latency, speed, scale, reliability, and consistency, and selecting the right solution for their particular problem.</p>
</blockquote>



<p class="wp-block-paragraph">That becomes a major issue when they later have to revisit their decision and re-architect or refactor the solution. It can be time-consuming, costly, and extremely difficult.</p>



<h2 class="wp-block-heading"><span id="as-ai-apps-get-more-real-time-and-data-heavy-how-should-developers-and-ctos-rethink-database-architecture">As AI apps get more real-time and data-heavy, how should developers and CTOs rethink database architecture?</span></h2>



<p class="wp-block-paragraph"><strong>Zohar</strong>: Traditional web applications focused on human interaction and often relied on caches and in-memory data. When we talk about real-time systems and AI, however, we are talking about high-throughput, low-latency workloads that <strong>consume large amounts of data and need it immediately</strong>.</p>



<p class="wp-block-paragraph">Because of this, teams sometimes use solutions that no longer fit their needs. They require systems that are reliable, predictable, fast, and scalable, which is something we see all the time. Aerospike was built for exactly that use case: real-time workloads, low latency, predictability, and high throughput.</p>



<p class="wp-block-paragraph">From my perspective, when CTOs evaluate this kind of solution, they need to think about the future. <strong>They should consider what they need today, but also where the product and its infrastructure will need to be at the next stage</strong>. That is especially important for AI applications and real-time applications in general.</p>



<h2 class="wp-block-heading"><span id="many-teams-are-adding-vector-search-graph-databases-and-real-time-pipelines-to-their-stack-when-is-that-the-right-choice">Many teams are adding vector search, graph databases, and real-time pipelines to their stack. When is that the right choice?</span></h2>



<p class="wp-block-paragraph"><strong>Zohar</strong>: When many customers think about AI, their first reaction is: &#8216;This is what my competitor is doing, so I need to do it too. Sometimes, when we examine the use case, we find it provides no real value. Teams choose to do it simply because everyone else is doing it.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">These solutions shine when they provide a competitive advantage, and AI can be integrated into the system in a way that creates long-term value. If you integrate a graph database or vector-search solution simply because someone else is doing it, you are going to have a very difficult time.</p>
</blockquote>



<p class="wp-block-paragraph">From that point onward, everything you do can become a technological hurdle, which is exactly where you do not want to be. You need to <strong>focus on what will create the most value</strong>. If AI is one of those things, go for it. If it is not, you should probably consider other solutions.</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="Zohar Elkayam on Building AI Systems That Scale" width="500" height="281" src="https://www.youtube.com/embed/ba070p2lzBo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading"><span id="what-should-engineering-teams-measure-if-they-really-want-to-understand-database-performance-at-scale">What should engineering teams measure if they really want to understand database performance at scale?</span></h2>



<p class="wp-block-paragraph"><strong>Zohar</strong>: When it comes to database performance, predictability is the number-one factor. It should be the industry standard for anything involving low latency and high throughput.</p>



<p class="wp-block-paragraph"><strong>Focusing on the average can put you in a dangerous position</strong>. Think of a swimming pool with an average depth of 30 centimeters: you can still drown in the deep end.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You need to think differently about performance. Focus on predictability and metrics such as P99 or even P99.9. Measure them at the application level, the database level, and across the overall user experience, because that is what will make your life easier later. </p>
</blockquote>



<p class="wp-block-paragraph">If you measure only the average, 50 percent of your users will experience latency worse than that figure. If you measure P99, the 99th percentile, only 1 percent of users will experience worse latency.</p>



<p class="wp-block-paragraph">A long performance tail can be highly problematic for some use cases. Our main focus is providing long-term predictability at the high end, including P99.9 and beyond.</p>



<p class="wp-block-paragraph">That predictability cannot depend on memory or caches. It needs to hold when reading from disk, NVMe, or other storage, without relying on prior activity, cache hits, or warming data into memory.</p>



<h2 class="wp-block-heading"><span id="what-do-teams-give-up-or-gain-when-they-move-fast-with-managed-tools-versus-building-something-custom">What do teams give up or gain when they move fast with managed tools versus building something custom?</span></h2>



<p class="wp-block-paragraph"><strong>Zohar</strong>: If you are a startup building a proof of concept or just getting started, using off-the-shelf tools is perfectly fine. Over the long term, however, those tools can impose strict limitations. They can be expensive, slow, or unreliable, and they may change without your consent or even your knowledge. They can help you build quickly and get to market fast. </p>



<p class="wp-block-paragraph">But once you reach a more established stage, you need to find a different way to handle things.</p>



<p class="wp-block-paragraph">That may mean <strong>building your own solutions, adopting a data platform, and unifying your stack</strong>. You look for ways to differentiate your product from competitors and make it more scalable, faster, and more valuable.</p>



<p class="wp-block-paragraph">It all comes down to value. If your solution provides something no one else can, and that differentiation comes from a different architecture or infrastructure, then it makes sense.</p>



<p class="wp-block-paragraph">Ultimately, it is not one approach or the other. You need to combine them: use common tools to solve common problems, while applying the right technologies to the uncommon, differentiating parts of each use case.</p>



<h2 class="wp-block-heading"><span id="what-database-and-infrastructure-skills-should-software-engineers-focus-on-to-stay-relevant-as-ai-changes-development">What database and infrastructure skills should software engineers focus on to stay relevant as AI changes development?</span></h2>



<p class="wp-block-paragraph"><strong>Zohar</strong>: I think <strong>AI is a major accelerator for developers, SREs, and DevOps teams</strong>, dramatically speeding up their work. Even so, people need to stay mindful and continue developing deep expertise in their field when working with AI.</p>



<p class="wp-block-paragraph">It is like generating an image with AI. You enter a prompt and get a result, but it may not be exactly what you wanted or imagined. To the human eye, the problem is often immediately obvious: the image may show six fingers, strange features, or something else you did not expect. The same applies when you are writing code or analyzing logs. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You need enough expertise to evaluate the response critically. You have to ask why: Why did the AI give me that answer? Where did it come from? What did I learn, and how can I improve my solution?</p>
</blockquote>



<p class="wp-block-paragraph"><strong>Instead of using AI only to generate and build things,</strong> <strong>use it to learn</strong>. You can still use it to generate code or solve problems, but you need to be able to read the output, understand it, and guide the AI so that it produces results that make sense for you.</p>



<p class="wp-block-paragraph">When you build an agentic system, use multiple agents, and pass outputs from one to another, you can sometimes lose that visibility. But if you preserve it over the long term, CTOs, developers, newcomers, and junior engineers can go very far, provided they understand what is actually happening.</p>



<p class="wp-block-paragraph">From my perspective, <strong>AI is where the industry is heading</strong>. I use it every day and across many parts of my work, but I always remain critical. I plan before I act. It is not about wasting tokens; it is about creating value through my work.</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/07/zohar_1.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/07/zohar_1.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/07/zohar_1-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/07/zohar_1-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/07/zohar_1-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure><p>The post <a href="https://shiftmag.dev/choose-a-database-because-it-fits-the-workload-not-because-its-familiar-11185/">Choose a Database Because It Fits the Workload, Not Because It’s Familiar</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Real Source of Truth Is No Longer Code &#8211; It’s the Specifications</title>
		<link>https://shiftmag.dev/the-real-source-of-truth-is-no-longer-code-its-the-specifications-10863/</link>
		
		<dc:creator><![CDATA[Marko Crnjanski]]></dc:creator>
		<pubDate>Wed, 22 Jul 2026 14:23:31 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI-generated code]]></category>
		<category><![CDATA[Codeplain]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software developer career]]></category>
		<category><![CDATA[spec-driven development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10863</guid>

					<description><![CDATA[<p>AI can write the code. The harder question is whether anyone still understands what it was supposed to do six months later.</p>
<p>The post <a href="https://shiftmag.dev/the-real-source-of-truth-is-no-longer-code-its-the-specifications-10863/">The Real Source of Truth Is No Longer Code &#8211; It’s the Specifications</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Spec-driven development</strong> aims to change that: the source of truth is no longer the code itself, but a clearly defined intent that the code can be regenerated from, tested against, and maintained with.</p>



<p class="wp-block-paragraph">At WeAreDevelopers in Berlin, I spoke with <strong>Predrag Radenkovic</strong>, CTO at Codeplain, about why some developers are skeptical of &#8220;review the spec, not the code&#8221; &#8211; and where this approach works today, and where teams still need to be careful.</p>



<h2 class="wp-block-heading"><span id="what-is-the-main-shift-from-prompt-driven-coding-to-spec-driven-development">What is the main shift from prompt-driven coding to spec-driven development?</span></h2>



<p class="wp-block-paragraph"><strong>Predrag</strong>: Prompt-driven coding operates at the level of code. Every decision an engineer makes gets translated directly into the implementation. All the maintenance happens on the level of code, where the intent behind the original solution is no longer available to the coding agent.</p>



<p class="wp-block-paragraph">Spec-driven development raises the level of abstraction. <strong>You treat the spec as the only source of truth</strong>: you define the necessary detail in natural language, and the system is built and validated from that. The intent persists in a simpler, more readable form. So you&#8217;re maintaining specs instead of code, and regenerating the code from them.</p>



<p class="wp-block-paragraph"><strong>Agentic skills</strong> are what make that workable in practice. Developers don&#8217;t want to write specs from scratch, but they&#8217;re happy to read them, so the agent drafts the spec incrementally, and the developer reviews and shapes it.</p>



<h2 class="wp-block-heading"><span id="why-are-integrations-a-good-fit-for-ai-assisted-development-and-where-does-direct-llm-based-code-generation-usually-break-down">Why are integrations a good fit for AI-assisted development, and where does direct LLM-based code generation usually break down?</span></h2>



<p class="wp-block-paragraph"><strong>Predrag</strong>: With integration development, you&#8217;re essentially becoming an<strong> expert on third-party systems</strong> <strong>that LLMs already know better than any human</strong>. Agents are strong at researching the domain, understanding the APIs, checking implementations against the current documentation.</p>



<p class="wp-block-paragraph">Where classic AI-assisted development falls short is <strong>maintenance</strong>. Integrations break in production all the time, and once you have a large number of them, you’re constantly patching code against systems you don’t control.</p>



<p class="wp-block-paragraph">With spec-driven development, <strong>the intent lives in the spec</strong>. So, when a third-party system changes and breaks an integration, the fix is usually a very small edit to the spec, and then you regenerate the code from it.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="592" src="https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_1-1024x592.png?x32039" alt="" class="wp-image-10874" srcset="https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_1-1024x592.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_1-300x174.png 300w, https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_1-768x444.png 768w, https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_1.png 1089w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo: <a href="https://www.codeplain.ai/" target="_blank" rel="noreferrer noopener">Codeplai.ai</a></figcaption></figure>



<h2 class="wp-block-heading"><span id="codeplain-treats-reusable-specifications-as-the-source-of-truth-what-makes-a-good-spec-and-what-do-developers-often-get-wrong-when-writing-one">Codeplain treats reusable specifications as the source of truth. What makes a good spec, and what do developers often get wrong when writing one?</span></h2>



<p class="wp-block-paragraph"><strong>Predrag</strong>: Good specs are <strong>complete, precise, unambiguous, and free of conflicting requirements</strong>. Also, their functionality is split into smaller chunks of reasonable complexity. Free-form specs aren&#8217;t ideal because the agent has to process everything at once and validating the requirements gets hard. Structuring the spec into units is what makes it both readable and checkable.</p>



<p class="wp-block-paragraph">That&#8217;s why we built the ***plain language. It lets engineers express intent precisely and keep full control over the functionality that gets implemented from it.</p>



<p class="wp-block-paragraph">What we&#8217;ve noticed over 2.5 years of working on spec-driven development is that <strong>engineers aren&#8217;t especially good at writing precise specs, but AI agents are</strong>. And the other way around: engineers are willing to review a spec thoroughly. That’s the reason why we built agentic skills for writing and validating specs.</p>



<h2 class="wp-block-heading"><span id="if-implementations-can-be-checked-against-the-specification-how-does-that-change-testing-code-review-and-trust-in-ai-generated-code">If implementations can be checked against the specification, how does that change testing, code review, and trust in AI-generated code?</span></h2>



<p class="wp-block-paragraph"><strong>Predrag</strong>: The first premise of the SDD lifecycle is that <strong>engineers thoroughly review the specs</strong>. Once the specs are accurate, much of the work is done. Codeplain&#8217;s code generator then builds the code and, more importantly, validates that it conforms to the specs.</p>



<p class="wp-block-paragraph">We do this through black-box tests written entirely from the specifications and executed against the code that was built. In the end, it&#8217;s up to the engineer to do manual testing and, if they want, to check all the test scenarios our platform created.</p>



<h2 class="wp-block-heading"><span id="from-your-experience-scaling-integrations-what-was-the-biggest-technical-lesson-about-using-structured-specs-instead-of-direct-code-generation">From your experience scaling integrations, what was the biggest technical lesson about using structured specs instead of direct code generation?</span></h2>



<p class="wp-block-paragraph"><strong>Predrag</strong>: When you develop integrations, you become an expert in someone else&#8217;s system without creating any additional value compared to your competitors. And it gets harder as the volume of integrations grows. The biggest issue, though, is maintaining them, because<strong> around 5% of integrations break each month due to changes in systems you can&#8217;t control</strong>.</p>



<p class="wp-block-paragraph">Coding agents are already great at researching and understanding external systems, and we use them to help us write the proper specifications. Once an integration is fully defined in a spec, it&#8217;s easier and faster to maintain, because the review cycle boils down to changes in the specs and the rest is automated.</p>



<h2 class="wp-block-heading">Some developers are skeptical of ideas like &#8220;review the spec, not the code&#8221;. Where does this approach work today, and where should teams still be careful?</h2>



<p class="wp-block-paragraph"><strong>Predrag</strong>: We picked integrations as the beachhead for our platform with exactly this question in mind. <strong>The approach works best where the implementation can be validated completely</strong>, where you can check the behavior against the spec without a human in the loop. Integrations fit that well, and we&#8217;ve seen the same hold in a couple of other verticals: scraper development and ETLs.</p>



<p class="wp-block-paragraph">Where teams should be careful is anywhere full validation isn&#8217;t possible. Anything with a user interface, for example, can&#8217;t be checked the same way today. But we see a solution on the horizon. The technology just needs to mature, and it&#8217;s moving quickly.</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="How CodePlane Validates Third-Party APIs with Spec-Driven Agents" width="500" height="281" src="https://www.youtube.com/embed/kWg7s3JKkag?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>


<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_main.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_main.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_main-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_main-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/07/codeplain_main-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure><p>The post <a href="https://shiftmag.dev/the-real-source-of-truth-is-no-longer-code-its-the-specifications-10863/">The Real Source of Truth Is No Longer Code &#8211; It’s the Specifications</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How Convenient JPA Defaults Broke Our Kotlin Microservice</title>
		<link>https://shiftmag.dev/jpa-defaults-kotlin-microservice-9184/</link>
		
		<dc:creator><![CDATA[Krzysztof Frączek]]></dc:creator>
		<pubDate>Tue, 14 Jul 2026 12:56:20 +0000</pubDate>
				<category><![CDATA[Backend]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Case Study]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[software architecture]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9184</guid>

					<description><![CDATA[<p>The promise of JPA is simple: define your entities, let the framework handle the rest. And it works until you look at what "the rest" means. </p>
<p>The post <a href="https://shiftmag.dev/jpa-defaults-kotlin-microservice-9184/">How Convenient JPA Defaults Broke Our Kotlin Microservice</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">While testing a <strong>Kotlin microservice backed by MS SQL</strong>, I found several places where <strong>convenience had quietly become a liability</strong>. </p>



<p class="wp-block-paragraph">Fortunately, there was no production incident; most issues were detected during internal testing. It is always better to learn on someone else&#8217;s mistakes, this article will help you learn on mine.</p>



<h2 class="wp-block-heading"><span id="the-architecture-in-place">The architecture in place</span></h2>



<p class="wp-block-paragraph">The service orchestrates WhatsApp campaign delivery through an asynchronous, scheduler-driven pipeline. Campaign destinations enter the system via an API and are persisted to MS SQL Server. Two background schedulers handle the processing. The first retrieves unscored destinations, invokes a scoring service to evaluate delivery priority, and assigns each destination to a bulk: either appending to an existing one or creating a new bulk when capacity is reached.</p>



<p class="wp-block-paragraph">The second scheduler manages the delivery lifecycle: it polls the external Bulk Scheduling System for status updates, submits ready bulks for sending, and coordinates priority by pausing lower-scored bulks while higher-priority ones are in flight. MS SQL serves as the central state store, maintaining campaign metadata, bulk assignments, and processing status throughout the pipeline.</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/04/Simic-Shiftmag-5-1024x614.png?x32039" alt="" class="wp-image-9186" srcset="https://shiftmag.dev/wp-content/uploads/2026/04/Simic-Shiftmag-5-1024x614.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/04/Simic-Shiftmag-5-300x180.png 300w, https://shiftmag.dev/wp-content/uploads/2026/04/Simic-Shiftmag-5-768x461.png 768w, https://shiftmag.dev/wp-content/uploads/2026/04/Simic-Shiftmag-5.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">An illustration of how the two schedulers interact with the MS SQL Server</figcaption></figure>



<h2 class="wp-block-heading"><span id="insert-record-in-batches">Insert record in batches</span></h2>



<p class="wp-block-paragraph">When you expect a heavy load,&nbsp;<strong>don&#8217;t insert data one by one</strong>. We learned this when a client started sending their campaign as separate HTTP requests—one message per request, all belonging to the same campaign. Our controller accepted a list of messages, but a single-element list is still a list, right? The service started returning HTTP 500 errors due to waiting too long for an available database connection.</p>



<p class="wp-block-paragraph">We solved this by introducing&nbsp;<strong>Kafka as a buffer between the API and the database</strong>. Incoming requests get published to a topic and then consumed in batches, enabling batch inserts into the database. A nice bonus came from how Kafka handles partitioning: by setting the message key properly, we ensured that&nbsp;<strong>all requests for the same campaign land in the same partition</strong>—and get processed together.</p>



<p class="wp-block-paragraph">Of course, the implementation should still handle lists properly. One caveat: Hibernate does support batch inserts (feel free to&nbsp;<a rel="noreferrer noopener" href="https://www.baeldung.com/jpa-hibernate-batch-insert-update" target="_blank">check</a>), but not when you use an IDENTITY primary key generation strategy. With IDENTITY, the database generates the ID on each insert.</p>



<p class="wp-block-paragraph">To get true batching, we bypassed Hibernate and used plain JDBC.</p>



<pre class="wp-block-code"><code>override fun submitCampaign(campaignRequest: CampaignRequest) {
    val message = campaignRequest.messages&#91;0].message
    val campaignId = campaignRequest.parameters.campaignId ?: "no-campaign-id"
    val topicKey = "${message.channelId}-${message.from}" +
                   "-${campaignRequest.parameters.templateName}-$campaignId"
    val messageBatches = campaignRequest.messages.chunked(maxMessagesPerBatch)

    messageBatches.forEach { batch -&gt;
        val batchRequest = CampaignRequest(
            messages = batch,
            parameters = campaignRequest.parameters
        )
        campaignRequestProducer.send(ProducerRecord(TOPIC_NAME, topicKey, batchRequest))
    }
}

@KafkaListener(
    topics = &#91;TOPIC_NAME],
    containerFactory = KafkaConsumerConfiguration.BATCH_LISTENER_FACTORY_BEAN
)
@Timed
fun processRequests(
    records: List&lt;ConsumerRecord&lt;String, CampaignRequest&gt;&gt;,
    ack: Acknowledgment
) {
    val groupedByCampaign = records.groupBy { it.key() }

    for ((_, recordsGroup) in groupedByCampaign) {
        val campaign = findOrCreateCampaign(...)
        val destinations = recordsGroup.flatMap { it.value().messages }.mapToDestinations(campaign)
        storeCampaignDestinations(destinations)
    }

    ack.acknowledge()
}

@Transactional
override fun batchInsert(destinations: List&lt;CampaignDestination&gt;) {
    if (destinations.isEmpty()) return

    val sql = """
        INSERT INTO cds.campaign_destination
            (campaign_id, destination, external_message_id, content, failover)
        VALUES
            (?, ?, ?, ?, ?)
    """.trimIndent()

    jdbcTemplate.batchUpdate(sql, destinations, destinations.size) { ps, dest -&gt;
        ps.setLong(1, dest.campaign.id)
        ps.setString(2, dest.destination)
        ps.setString(3, dest.externalMessageId)
        ps.setString(4, dest.content)
        ps.setString(5, dest.failover)
    }
}
</code></pre>



<p class="wp-block-paragraph">Now Kafka took the big chunk of stress, the database can easily handle the load.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="753" height="263" src="https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_10-44-18.png?x32039" alt="" class="wp-image-9188" srcset="https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_10-44-18.png 753w, https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_10-44-18-300x105.png 300w" sizes="auto, (max-width: 753px) 100vw, 753px" /></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="502" height="202" src="https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_10-44-57.png?x32039" alt="" class="wp-image-9187" style="width:754px;height:auto" srcset="https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_10-44-57.png 502w, https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_10-44-57-300x121.png 300w" sizes="auto, (max-width: 502px) 100vw, 502px" /></figure>



<h2 class="wp-block-heading"><span id="too-complex-queries">Too complex queries</span></h2>



<p class="wp-block-paragraph">A query that&#8217;s too complex can take too long to execute, especially without proper indexes. Think about&nbsp;<strong>what data you already have in the application</strong>&nbsp;and use it to simplify things. In our case, we needed to find bulks that still had space for more recipients. The original query joined the destinations table to count how many each bulk contained, filtered by several conditions, and used a HAVING clause to check capacity.</p>



<pre class="wp-block-code"><code>@Query("""
    SELECT cb, COUNT(cd) FROM CampaignBulk cb
    LEFT JOIN CampaignDestination cd ON cd.campaignBulk = cb
    WHERE cb.campaign = :campaign AND cb.priority IN (:priorities) AND cb.waitUntil &gt; :nowWithBuffer AND cb.bulkStatus = 'CREATED'
    GROUP BY cb
    HAVING COUNT(cd) &lt; :maxBulkSize
""")
fun findNotFullAndNotExpiredBulks(campaign: Campaign, priorities: Set&lt;BulkPriority&gt;, maxBulkSize: Int, nowWithBuffer: Instant): List&lt;BulkWithCount&gt;
</code></pre>



<p class="wp-block-paragraph">The problem? A join on an unindexed column, filters without indexes, a COUNT, and a HAVING clause. Combined, it was too much for the database. The query took ages and locks escalated to entire tables. It quickly turned out that we already knew the destination count during processing. So we denormalized: we added a&nbsp;<strong><code>destinationCount</code>&nbsp;column to the&nbsp;<code>CampaignBulk</code>&nbsp;table</strong> and updated it whenever destinations were added. The new query and supporting index look like this:</p>



<pre class="wp-block-code"><code>@Query("""
    SELECT cb FROM CampaignBulk cb
    WHERE cb.campaign = :campaign
      AND cb.priority IN (:priorities)
      AND cb.waitUntil &gt; :nowWithBuffer
      AND cb.bulkStatus = 'CREATED'
      AND cb.destinationCount &lt; :maxBulkSize
""")
fun findNotFullAndNotExpiredBulks(
    campaign: Campaign,
    priorities: Set&lt;BulkPriority&gt;,
    maxBulkSize: Int,
    nowWithBuffer: Instant
): List&lt;CampaignBulk&gt;
</code></pre>



<pre class="wp-block-code"><code>CREATE NONCLUSTERED INDEX idx_campaign_bulk_count_filter
ON cds.campaign_bulk(campaign_id, bulk_status, destination_count)
INCLUDE (id, priority, wait_until, bss_bulk_id, api_key_id, creation_date, last_status_change_date);
</code></pre>



<p class="wp-block-paragraph">After these changes, the query performs well.</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="500" height="199" src="https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_11-10-40.png?x32039" alt="" class="wp-image-9190" style="width:814px;height:auto" srcset="https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_11-10-40.png 500w, https://shiftmag.dev/wp-content/uploads/2026/04/image-2026-1-27_11-10-40-300x119.png 300w" sizes="auto, (max-width: 500px) 100vw, 500px" /></figure>



<h2 class="wp-block-heading">Concurrency: when more isn&#8217;t always better</h2>



<p class="wp-block-paragraph">We all want to process data as fast as possible. Especially in the world of virtual threads; you can spin up thousands of them and feel good about how concurrent your application is. But the&nbsp;<strong>database doesn&#8217;t share that enthusiasm</strong>. Under the hood, you have a limited Hikari connection pool. Run too many concurrent operations and your queries start timing out. Worse, when multiple threads hit the same table and the same dataset, you&#8217;re heading straight for lock contention.</p>



<p class="wp-block-paragraph">Here are a few things to consider when you need to control concurrency.</p>



<h2 class="wp-block-heading"><span id="use-shedlock"><strong>Use shedlock</strong></span></h2>



<p class="wp-block-paragraph">ShedLock is a library that ensures scheduled tasks run only once across multiple application instances. It works by creating a lock record in a shared storage—typically a database table—before executing a task. When a scheduler triggers, it tries to acquire the lock by inserting or updating a row. If another instance already holds the lock, the<strong> task is skipped.</strong></p>



<p class="wp-block-paragraph">The lock is released after execution or after a configured timeout, preventing deadlocks if an instance crashes mid-task. In our case, we wanted to avoid the same campaign being processed by a couple of instances at the same time.</p>



<p class="wp-block-paragraph">Shedlock helps a lot here. Feel free to check the&nbsp;<a rel="noreferrer noopener" href="https://github.com/lukas-krecan/ShedLock" target="_blank">full ShedLock documentation</a>.</p>



<pre class="wp-block-code"><code>val config = LockConfiguration(
    Instant.now(),
    LOCK_NAME_FOR_PROCESS_CAMPAIGNS + campaign.id,
    Duration.ofMinutes(5),
    Duration.ZERO
)

val lock = lockProvider.lock(config)

if (lock.isPresent) {
    try {
        singleCampaignService.processSingleCampaign(campaign)
    } finally {
        lock.get().unlock()
    }
}
</code></pre>



<p class="wp-block-paragraph"><strong>Limit your concurrency with a semaphore</strong></p>



<p class="wp-block-paragraph">A <strong>Semaphore</strong> lets you limit how many threads can execute a block of code at the same time. In our case, each scheduler iteration could potentially process dozens of campaigns in parallel; especially with virtual threads, where spawning new threads is cheap. But each campaign processing involves multiple database operations: reads, updates, and inserts. Letting all of them run at once would exhaust the connection pool and trigger lock contention.</p>



<p class="wp-block-paragraph">We introduced a Semaphore with a fixed number of permits to cap the number of campaigns processed concurrently. Before processing a campaign, a&nbsp;<strong>thread must acquire a permit</strong>. If all permits are taken, the thread waits, but with virtual threads, this isn&#8217;t a problem.</p>



<p class="wp-block-paragraph">When a virtual thread blocks, it gets unmounted from its carrier thread, freeing it to run other virtual threads. So waiting for a permit doesn&#8217;t waste OS resources like it would with traditional platform threads. Once processing is done, the permit is released.</p>



<p class="wp-block-paragraph">This keeps database load predictable and prevents the connection pool from becoming a bottleneck.</p>



<pre class="wp-block-code"><code>private val semaphore = Semaphore(10)
private val executor = Executors.newVirtualThreadPerTaskExecutor()

fun processCampaigns() {
    val campaigns = campaignRepository.findAllToProcess()

    campaigns.forEach { campaign -&gt;
        executor.submit {
            semaphore.acquire()
            try {
                processSingleCampaign(campaign)
            } finally {
                semaphore.release()
            }
        }
    }
}
</code></pre>



<p class="wp-block-paragraph"><strong>Use query hints</strong></p>



<p class="wp-block-paragraph">When multiple threads query the same table, the database decides how to handle locking. Sometimes those defaults work against you in different ways. Locks escalate, threads wait on each other, or worse, deadlocks occur. SQL Server lets you guide this behavior with query hints. Here are the ones we found useful:</p>



<ul class="wp-block-list">
<li><code>UPDLOCK</code>&nbsp;– reserves update locks on selected rows, so other threads can&#8217;t select the same rows for processing.</li>



<li><code>READPAST</code>&nbsp;– skips rows that are already locked by other threads instead of waiting for them to be released.</li>



<li><code>ROWLOCK</code>&nbsp;– suggests that SQL Server use fine-grained row-level locks instead of page or table locks.</li>



<li><code>NOLOCK</code>&nbsp;– reads rows without acquiring shared locks, allowing it to read data that other transactions are currently modifying. This means it won&#8217;t block writers and won&#8217;t be blocked by them but it can return dirty data that might be rolled back, or even read the same row twice or skip rows entirely if data is being moved during the scan.</li>
</ul>



<p class="wp-block-paragraph"><strong>Think about your access patterns</strong>. Are multiple threads competing for the same rows? Are you okay with skipping locked data or reading uncommitted changes? The right combination of hints depends on your specific use case but knowing they exist can save you from mysterious slowdowns and deadlocks.</p>



<p class="wp-block-paragraph"><strong>Process data in batches</strong></p>



<p class="wp-block-paragraph">Even with ROWLOCK hints,&nbsp;<strong>SQL Server can escalate locks</strong>. When a single transaction acquires too many row locks on one table, SQL Server may convert them into a table lock for efficiency. This is called lock escalation, and when it happens, your &#8220;harmless&#8221; operation suddenly blocks everyone else.</p>



<p class="wp-block-paragraph">We learned this the hard way. Our scoring scheduler fetched all unscored destinations for a campaign in a single query, which sometimes includes tens of thousands of rows. With UPDLOCK to prevent other threads from picking them up, SQL Server decided it was cheaper to lock the entire table. Suddenly, other threads couldn&#8217;t read or write to the destinations table at all. The whole pipeline stalled, waiting for one greedy query to finish.</p>



<p class="wp-block-paragraph">The fix was simple: fetch in batches. Instead of selecting all unscored destinations, we now use&nbsp;<code>TOP(n)</code>&nbsp;and iterate until there&#8217;s nothing left to process.</p>



<pre class="wp-block-code"><code>SELECT TOP(400) cd.*
FROM cds.campaign_destination cd WITH (UPDLOCK, READPAST, ROWLOCK)
WHERE cd.campaign_id = :campaignId
  AND cd.bulk_id IS NULL
  AND cd.id &lt;= :maxId
</code></pre>



<p class="wp-block-paragraph">Each batch locks only a few hundred rows, commits, and moves on. This keeps the lock count well below the escalation threshold and lets other threads continue their work.</p>



<p class="wp-block-paragraph">For more details on lock escalation, see&nbsp;<a rel="noreferrer noopener" href="https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/performance/resolve-blocking-problems-caused-lock-escalation" target="_blank">Microsoft&#8217;s Troubleshooting explanation.</a></p>



<h2 class="wp-block-heading"><span id="final-thoughts">Final thoughts</span></h2>



<p class="wp-block-paragraph">The database is not an implementation detail you can ignore. I hope these lessons save you some debugging time. </p>



<p class="wp-block-paragraph">Have you faced similar challenges? I&#8217;m curious how others handle these problems.</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/06/JPA.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="jpa header for shiftmag" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/JPA.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/JPA-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/JPA-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/JPA-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure><p>The post <a href="https://shiftmag.dev/jpa-defaults-kotlin-microservice-9184/">How Convenient JPA Defaults Broke Our Kotlin Microservice</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Developers are the reason behind best (and worst) parts of software development</title>
		<link>https://shiftmag.dev/developers-are-the-reason-behind-best-and-worst-parts-of-software-development-10670/</link>
		
		<dc:creator><![CDATA[Ivan Simic]]></dc:creator>
		<pubDate>Mon, 13 Jul 2026 13:53:00 +0000</pubDate>
				<category><![CDATA[Career]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Developers Answer]]></category>
		<category><![CDATA[Engineer Explains]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10670</guid>

					<description><![CDATA[<p>Building software is full of ups and downs. Some days, you're working with the best team you can find, and others it's up to you to fix something with no idea how it works and no access to documentation.</p>
<p>The post <a href="https://shiftmag.dev/developers-are-the-reason-behind-best-and-worst-parts-of-software-development-10670/">Developers are the reason behind best (and worst) parts of software development</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In the latest edition of our <a href="https://www.youtube.com/@DevelopersAnswer" target="_blank" rel="noreferrer noopener">Developers Answer series</a>, we spoke with developers about their <strong>best and worst projects</strong>, the reasons behind the challenges, and the ways they&#8217;ve made it across the finish line regardless of the hardships.</p>



<h2 class="wp-block-heading">What&#8217;s the worst type of project?</h2>



<p class="wp-block-paragraph">Sure, the term &#8220;worst&#8221; means different things to different people, but most of the engineers agree: the worst types of projects are the ones that <strong>aren&#8217;t set up well by humans,</strong> not the ones that have big technical requirements. And, as you can probably guess, human-designed flaws are much more creative.</p>



<p class="wp-block-paragraph">For example, one engineer highlighted that the worst project for him was working with family members who were not familiar with software development at all, affecting expectations, realisations and everything in between.</p>



<p class="wp-block-paragraph">Another situation was a client project that took four months, with progress going smooth up until the last month. <strong>Nikola Buhiniček,</strong> Engineering Manager, said:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">The client changed the scope significantly without much warning. We had to abandon a lot of the work we’d already done and come up with new features and opportunities. It felt like compressing two and a half months of work into one month before the deadline.</p>
</blockquote>



<p class="wp-block-paragraph">Another type of projects that drive engineers crazy are legacy code projects without real instructions on how to approach them, as explained by<strong> Edvin Teskeredžić</strong>, Senior AI Software Engineer:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">We had this old legacy project, basically 10-year-old code which needed to be maintained. It was also all internal libraries but there was no documentation. The documentation simply lived in the heads of senior engineers, so you had to kind of figure it out yourself, and you couldn&#8217;t Google it because it was all internal libraries.</p>
</blockquote>



<h2 class="wp-block-heading">What&#8217;s the best, then?</h2>



<p class="wp-block-paragraph">In contrast, the best projects tend to be tied to others as well, only this time it&#8217;s about great teams and good colleagues. For some engineers, the best projects are those where leadership has a clear vision and that vision is clearly shown to the teams.</p>



<p class="wp-block-paragraph">Other engineeers, such as <strong>Filip Bolčić</strong>, Full-Stack Engineer, highlighted <strong>teamwork as the best part of the projects</strong> they&#8217;ve worked on. For example:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">Everybody&#8217;s insight was really valuable, and I had a great mentor from whom I learned a lot. It was just a really meaningful project for us, we felt really good working on it.</p>
</blockquote>



<p class="wp-block-paragraph">On the other hand, Nikola noted that sometimes, <strong>the best projects are the most challenging ones</strong>. He explained the process of adding the automations feature to Productive was one of the more challenging and interesting ones he worked on:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">It was such a different feature from what we used to do, and I was given the opportunity to build it. In the end it was one of the best features we have. The usage is growing up from month to month. I&#8217;m really happy that it was something that I built like two years ago, and it&#8217;s still growing so fast.</p>
</blockquote>



<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 Share Their Best and Worst Projects" width="500" height="281" src="https://www.youtube.com/embed/kyjc9KEN6L4?start=165&amp;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading"><span id="it-all-comes-down-to-the-human-factor">It all comes down to the human factor</span></h2>



<p class="wp-block-paragraph">The hardest thing to fix as an engineer might not even be software-related, according to <strong>Hrvoje Rančić, </strong>Senior Software Engineer:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">My posture. I had really terrible back pain from sitting too much during the COVID era. I think this is a very dangerous job because it involves a lot of sitting, and sitting is the new smoking, so I encourage everyone to move more if you&#8217;re a software engineer.</p>
</blockquote>



<p class="wp-block-paragraph">Ergonomics aside, Software Engineer <strong>Emin Mulaimović </strong>said that some of the biggest recent challenges he had were related to LLM&#8217;s:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">We had this unstable LLM prompt which basically means you ask the same question and it gives different answers, and the answers are not marginally different. To fix that you just need to rephrase the question over and over and over again until it worked. And then when it worked you didn&#8217;t learn anything, you didn&#8217;t have fun fixing it, you&#8217;re just glad it&#8217;s over. Some bugs are fun to fix; this one wasn&#8217;t.</p>
</blockquote>



<p class="wp-block-paragraph">On the other end of the spectrum, the toughness of a task comes down to a <strong>personal mistake by the engineer themselves</strong>, and there&#8217;s rarely anything you can do but to fix it. That&#8217;s exactly what happened to Filip:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">I remember working on a really big-scale production application and accidentally just deleting a lot of important stuff from the database. I was really young in my career and I remember being really stressed out about this, but the project manager protected me and we were able to restore a backup of this database, so in the end everything was good, but it was really stressful for me.</p>
</blockquote>



<p class="wp-block-paragraph">And to further drive the point home, sometimes the fix isn&#8217;t even tough, but so time-consuming you think you&#8217;re going crazy, as evidenced by <strong>Olga Koroleva</strong>, Engineering Manager:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-medium-font-size wp-block-paragraph">I made a bug in the code where entries to the database were written wrong, and I had to manually fix thousands of them. After that, I always double-checked and triple-checked everything.</p>
</blockquote>



<p class="wp-block-paragraph">Make sure to <a href="https://www.youtube.com/watch?v=kyjc9KEN6L4&amp;t=165s" target="_blank" rel="noreferrer noopener">check out the entirety of the video</a> to find more about the best and worst projects, and the challenges of software development!</p>



<p class="wp-block-paragraph"><em>Special thanks to our engineering colleagues at Infobip, Nikola Buhiniček (Engineering Manager, Productive) and Filip Bolčić, (Full-Stack Engineer, Ars Futura).</em></p>


<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1365" height="768" src="https://shiftmag.dev/wp-content/uploads/2026/07/devs-answer-best-and-worst.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/07/devs-answer-best-and-worst.png 1365w, https://shiftmag.dev/wp-content/uploads/2026/07/devs-answer-best-and-worst-300x169.png 300w, https://shiftmag.dev/wp-content/uploads/2026/07/devs-answer-best-and-worst-1024x576.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/07/devs-answer-best-and-worst-768x432.png 768w" sizes="auto, (max-width: 1365px) 100vw, 1365px" /></figure><p>The post <a href="https://shiftmag.dev/developers-are-the-reason-behind-best-and-worst-parts-of-software-development-10670/">Developers are the reason behind best (and worst) parts of software development</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI Helps Ship Faster, But It Doesn’t Do the Thinking</title>
		<link>https://shiftmag.dev/ai-helps-ship-faster-but-it-doesnt-do-the-thinking-10555/</link>
		
		<dc:creator><![CDATA[Marko Crnjanski]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 13:33:35 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[AI coding]]></category>
		<category><![CDATA[code review]]></category>
		<category><![CDATA[developer tools]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[technical debt]]></category>
		<category><![CDATA[vibe coding]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10555</guid>

					<description><![CDATA[<p>We asked engineers how far AI can really go in software delivery, and their answer was simple: it can speed things up, but people still have to make the decisions.</p>
<p>The post <a href="https://shiftmag.dev/ai-helps-ship-faster-but-it-doesnt-do-the-thinking-10555/">AI Helps Ship Faster, But It Doesn’t Do the Thinking</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">AI coding assistants have made it look dangerously easy to believe software can now be built by prompt alone. </p>



<p class="wp-block-paragraph">In a recent conversation with a few Infobip engineers, we asked whether that promise holds up in practice &#8211; and the answer was clear: <strong>AI can generate code fast, but it still cannot understand the problem</strong>, define the boundaries, or own the consequences. </p>



<p class="wp-block-paragraph">That part remains the developer’s job.</p>



<h2 class="wp-block-heading"><span id="ai-should-be-a-tool-for-accelerating-clearly-defined-tasks">AI should be a tool for accelerating clearly defined tasks</span></h2>



<p class="wp-block-paragraph">Better context and clearer specifications make useful, maintainable, and secure output far more likely. As <strong>Zvonimir Petković</strong>, Staff Engineer, explained:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The quality of the code ultimately depends on the context given to the GenAI agent and the model underneath. The software engineer is still the one writing the specifications, and the better the specification and context, the better the code produced.</p>
</blockquote>



<p class="wp-block-paragraph">To maintain quality, he says, we need to isolate the code into smaller segments and check each one. Effective work with coding agents is <strong>less about one large prompt and more about small, controlled iterations</strong>.</p>



<p class="wp-block-paragraph">That may mean changing the architecture, refactoring a component, or requesting a more precise implementation of a single interface. <strong>František Lučivjanský</strong>, Senior Principal Engineer, described a similar workflow:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I work with AI in smaller chunks. I give it a small part, review the result, and steer the agent: &#8220;This is not correct; do it this way.&#8221; I may also define the architecture differently &#8211; for example, by asking it to refactor one part first. These slow iterations help me maintain the same quality I would achieve manually.</p>
</blockquote>



<p class="wp-block-paragraph">Working in smaller chunks helps developers preserve a mental model of the system and review decisions while the code is still easy to change. AI serves as a tool for accelerating clearly defined tasks.</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="Why Great AI Code Still Needs Real Engineering" width="500" height="281" src="https://www.youtube.com/embed/wxWxsWqxZvI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">AI doesn&#8217;t create technical debt, people do</h2>



<p class="wp-block-paragraph">Faster code generation naturally raises questions about technical debt. Teams have more code to understand, test, and maintain, but AI did not create technical debt. <strong>Debt grows from deadlines, trade-offs, and decisions that prioritize short-term delivery over long-term maintainability</strong>.</p>



<p class="wp-block-paragraph">For <strong>Tvrtko Ivasić</strong>, Application Security Intern, the answer is not to relax established controls, but to reinforce them:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We should preserve the standards established in the past: the security pillars, the SDLC pipeline, code review, SAST, and the rest of the process. If anything, the bar should be even higher because the code is now generated by AI rather than written by an engineer.</p>
</blockquote>



<p class="wp-block-paragraph">AI-generated code should go through the same SDLC as human-written code: code review, automated tests, SAST, and dependency checks. </p>



<p class="wp-block-paragraph">František Lučivjanský notes that agents don’t remove the pressures behind technical debt, but <strong>they can help manage it more deliberately</strong>. They can also spot duplication, suggest refactors, write tests, or explain legacy code, but the value still depends on the engineer reviewing the output.</p>



<h2 class="wp-block-heading"><span id="vibe-coding-might-evolve-into-agent-engineering">Vibe coding might evolve into agent engineering</span></h2>



<p class="wp-block-paragraph">Vibe coding may be enough for a hobby project or proof of concept, but problems begin when the same workflow reaches production without additional controls. Engineers may not need to write or memorize every line, but they still <strong>need to understand the architecture, system boundaries, scalability, and failure modes</strong>, enough to delegate implementation without delegating responsibility.</p>



<p class="wp-block-paragraph">Asked whether vibe coding is a sustainable approach to software development or merely a short-term productivity boost, Zvonimir argued that it is likely to evolve:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Vibe coding is not just a short-term boost or a passing trend. &#8220;Dark factories&#8221; may represent the ultimate direction, with workflows that incorporate vibe coding and require us to look at the code less and less. I think it will evolve into agent engineering, and that is how software will be built in the future.</p>
</blockquote>



<p class="wp-block-paragraph">Companies that adopt this workflow may ship faster without sacrificing quality, spending less time on routine code and more on specifications, architecture, evaluation, and automated controls. The key is to understand where vibe coding creates speed, where it introduces risk, and how AI agents fit into proven software engineering principles &#8211; because <strong>responsibility for what reaches production remains unchanged</strong>.</p>



<p class="wp-block-paragraph"><em>Special thanks to our engineering colleagues from <a href="https://www.infobip.com/" target="_blank" rel="noreferrer noopener">Infobip</a>, the publisher of ShiftMag!</em></p>


<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1280" height="720" src="https://shiftmag.dev/wp-content/uploads/2026/06/2_2.jpg?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/2_2.jpg 1280w, https://shiftmag.dev/wp-content/uploads/2026/06/2_2-300x169.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/2_2-1024x576.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/2_2-768x432.jpg 768w" sizes="auto, (max-width: 1280px) 100vw, 1280px" /></figure><p>The post <a href="https://shiftmag.dev/ai-helps-ship-faster-but-it-doesnt-do-the-thinking-10555/">AI Helps Ship Faster, But It Doesn’t Do the Thinking</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Great Developers Are Curious, Creative, and Ready for AI</title>
		<link>https://shiftmag.dev/teresa-wu-infobip-shift-interview-10425/</link>
		
		<dc:creator><![CDATA[Anastasija Uspenski]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 13:07:25 +0000</pubDate>
				<category><![CDATA[Event]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Infobip Shift 2026]]></category>
		<category><![CDATA[JPMorgan Chase]]></category>
		<category><![CDATA[Teresa Wu]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10425</guid>

					<description><![CDATA[<p>At Infobip Shift, accomplished speaker and engineer Teresa Wu will talk about how AI is transforming software delivery, multi-platform development, and the future of engineering teams.</p>
<p>The post <a href="https://shiftmag.dev/teresa-wu-infobip-shift-interview-10425/">Great Developers Are Curious, Creative, and Ready for AI</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Infobip Shift conference, <a href="https://shiftmag.dev/infobip-shift-2026-returns-to-zadar-bringing-apple-and-nvidia-to-the-stage-9585/" target="_blank" rel="noreferrer noopener nofollow">one of Europe&#8217;s biggest (and best) developer events</a> and a sister project to ShiftMag, is just three months away! As the buildup to the event continues, we&#8217;re kicking off talks with some of the Infobip Shift speakers to discuss their views on software development and find out sneak peeks about their talks. </p>



<h2 class="wp-block-heading"><span id="join-us-on-the-beautiful-croatian-coast">Join us on the beautiful Croatian coast</span></h2>



<p class="wp-block-paragraph">Speaking of sneak peeks, reading this article <strong><a href="https://www.entrio.hr/event/infobip-shift-2026-27033?pc=MAG15" target="_blank" rel="noreferrer noopener">makes</a> <a href="https://www.entrio.hr/en/event/infobip-shift-2026-27033?pc=MAG15" target="_blank" rel="noreferrer noopener">you eligible for a discount on Infobip Shift tickets</a></strong>. You&#8217;re welcome.</p>



<p class="wp-block-paragraph">To kick things off, I had the opportunity and pleasure to talk with one of this year&#8217;s speakers,<strong>Teresa Wu.</strong> <strong>In addition to her work as the VP Engineer at JPMorgan Chase</strong>, Teresa is also a Google Developer Expert (GDE), an accomplished public speaker and mentor. </p>



<p class="wp-block-paragraph">She has worked with many talented developers on various apps and projects over the years, and she enjoys exploring the world of multi-platform development, the fun of continuous delivery, and following a product from development to release.</p>



<p class="wp-block-paragraph">Her experience makes her the ideal person to talk to about today&#8217;s tech landscape, especially in the era of AI. So we did just that, and also talked about the perspective of an experienced mentor and public speaker. Teresa also shared some hints of her upcoming talk at Shift! </p>



<h2 class="wp-block-heading"><span id="ai-accelerates-multi-platform-development">AI accelerates multi-platform development</span></h2>



<p class="wp-block-paragraph">Throughout her career, Teresa has worked in front-end development, cloud technologies, and multi-platform products.<br>Currently, she is most inspired by multi-platform development, which she finds very exciting because, <strong>by using a single codebase combined with AI-powered automation</strong>, we can significantly speed up code generation and easily adapt user interfaces for iOS, Android, and web platforms:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">In this way, traditional barriers between platforms are removed and the time needed to bring a product to market is significantly reduced. This allows engineering teams to overcome technical limitations and fully focus on rapidly delivering value to end users.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="ai-is-nothing-without-people">AI is nothing without people!</span></h2>



<p class="wp-block-paragraph">When asked how she sees the impact of artificial intelligence on the daily work of software engineers, Wu notes that AI is constantly evolving, creating a kind of feedback loop in which what we build today <strong>becomes training data for tomorrow’s</strong> systems:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">AI frees us from routine and repetitive tasks, but it still relies on people when it comes to defining rules, guiding processes, and creating new patterns of thinking. That is exactly where human creativity, experience, and judgment remain irreplaceable.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="professional-growth-is-impossible-without-enthusiasm">Professional growth is impossible without enthusiasm</span></h2>



<p class="wp-block-paragraph">As a mentor and experienced public speaker, Teresa believes that sustainable professional development is almost impossible without genuine interest in what you do. That’s why she tries to find technology or projects that truly interest her, whether within her job or outside of it, and to find personal motivation in them:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">For me, public speaking is not just an opportunity to present knowledge; it is a way to explore new ideas and build a network of friends and professional contacts. When you align your learning with what truly drives you, professional growth becomes a natural and fulfilling consequence.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="shift-conference-as-an-opportunity-to-expand-knowledge">Shift conference as an opportunity to expand knowledge</span></h2>



<p class="wp-block-paragraph">For Wu, this will be the first time speaking at (or visiting) <a href="https://shift.infobip.com/" target="_blank" rel="noreferrer noopener">Infobip Shift</a>. She decided to participate because the event brilliantly combines cutting-edge technologies and a vibrant community of experts, and is especially looking forward to the unique atmosphere of a large tech festival in Zadar.</p>



<p class="wp-block-paragraph">In addition, the opportunity to explore a beautiful destination while connecting with a global network of developers represents the perfect personal motivation for gaining new ideas and inspiration.</p>



<h3 class="wp-block-heading"><span id="much-more-than-just-code">Much more than just code!</span></h3>



<p class="wp-block-paragraph">As she points out, Teresa’s main goal is to gain a new perspective on how engineering teams use AI-based automation:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Beyond technical talks, I place great value on people and conversations. What I especially appreciate about Shift is that it’s not just about code, but about the unique energy of thousands of developers trying together to understand what the future brings. I want to bring that inspiration into my everyday work as well.</p>
</blockquote>



<h3 class="wp-block-heading"><span id="sneak-peek-of-the-shift-talk">Sneak peek of the Shift talk</span></h3>



<p class="wp-block-paragraph">Without revealing too many details, I asked Teresa to hint at the topic of her talk and what can attendees expect to learn or take away from it: </p>



<ul class="wp-block-list">
<li><strong>Problem:</strong> Engineers responsible for software releases spend up to 40% of their time on manual processes and overly large change packages.</li>



<li><strong>AI-driven transformation:</strong> Moving from simple code-writing assistance to an autonomous “Release Pilot.”</li>



<li><strong>Data-driven decisions:</strong> Replacing subjective “go/no-go” decisions with an AI index that evaluates stability signals and system observability.</li>



<li><strong>Implementation plan:</strong> A 90-day migration path that significantly reduces manual work and enables faster, more efficient software delivery.</li>
</ul>



<p class="wp-block-paragraph"><strong>Want to hear Teresa live? <a href="https://www.entrio.hr/en/event/infobip-shift-2026-27033?pc=MAG15" type="link" id="https://www.entrio.hr/event/infobip-shift-2026-27033?pc=MAG15" target="_blank" rel="noreferrer noopener">Purchase your Shift ticket and use code <strong><em>MAG15</em></strong> for a discount</a>!</strong></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/06/teresa-wu-header-shiftmag.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/teresa-wu-header-shiftmag.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/teresa-wu-header-shiftmag-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/teresa-wu-header-shiftmag-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/teresa-wu-header-shiftmag-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure><p>The post <a href="https://shiftmag.dev/teresa-wu-infobip-shift-interview-10425/">Great Developers Are Curious, Creative, and Ready for AI</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-09-17 06:01:08 by W3 Total Cache
-->