<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: tpf</title>
    <description>The latest articles tagged 'tpf' on DEV Community.</description>
    <link>https://dev.to/t/tpf</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tag/tpf"/>
    <language>en</language>
    <item>
      <title>Data fails first</title>
      <dc:creator>Mariano Barcia</dc:creator>
      <pubDate>Thu, 21 May 2026 14:56:57 +0000</pubDate>
      <link>https://dev.to/mbarcia/data-fails-first-3mj3</link>
      <guid>https://dev.to/mbarcia/data-fails-first-3mj3</guid>
      <description>&lt;p&gt;The strange thing was that the first real scaling problems had nothing to do with scale. Or at least, scale as in "infrastructure scale".&lt;/p&gt;

&lt;p&gt;The application was still relatively small. Traffic was growing, yes, but nothing dramatic. CPUs were healthy, latency was acceptable, deployments remained pleasantly uneventful. From the outside, the system still looked exactly like what it technically was: a single Quarkus application running as a monolith, with pipeline steps invoking one another directly inside the same process.&lt;/p&gt;

&lt;p&gt;And yet developers had started speaking about it differently.&lt;/p&gt;

&lt;p&gt;Not formally. Nobody walked into a meeting and announced that “the architecture had changed.” It emerged indirectly, through the kind of comments engineers make when systems begin slipping away from them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Be careful changing that field.”&lt;/li&gt;
&lt;li&gt;“I think another step depends on this.”&lt;/li&gt;
&lt;li&gt;“We should probably keep the old format for compatibility.”&lt;/li&gt;
&lt;li&gt;“I’m not entirely sure who consumes this anymore.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The incidents themselves were subtle enough to avoid triggering panic. Customer support found two apparently identical shipments taking different routing paths. Finance noticed that premium customers occasionally missed SLA prioritization. A new carrier integration introduced a field named &lt;code&gt;region&lt;/code&gt;, while another team added &lt;code&gt;shipping_region&lt;/code&gt;, and for several months both quietly coexisted because somewhere in the middle of the pipeline a mapper handled the ambiguity without anybody realizing it.&lt;/p&gt;

&lt;p&gt;Nothing crashed.&lt;/p&gt;

&lt;p&gt;That was precisely the problem.&lt;/p&gt;

&lt;p&gt;The failures were no longer technical failures. They were semantic failures. The system continued running while different parts of the application slowly stopped agreeing on what the data actually meant.&lt;/p&gt;

&lt;p&gt;Marta recognized the smell immediately because she had seen it before in event-driven and serverless systems: payloads beginning life as wonderfully flexible JSON blobs and gradually hardening into undocumented distributed contracts. Except this time, it was happening entirely inside a monolith.&lt;/p&gt;

&lt;p&gt;That realization bothered her more than any infrastructure issue they had faced so far because it exposed something most engineers rarely think about when they talk about distributed systems.&lt;/p&gt;

&lt;p&gt;When people hear “distributed systems,” they usually imagine the visible mechanics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remote calls&lt;/li&gt;
&lt;li&gt;retries&lt;/li&gt;
&lt;li&gt;eventual consistency&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;concurrency&lt;/li&gt;
&lt;li&gt;partitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But those are often second-order effects. The deeper problem appears much earlier, when independently evolving parts of a system begin sharing meaning imperfectly.&lt;/p&gt;

&lt;p&gt;Two teams interpreting the same field differently. A payload surviving longer than the assumptions under which it was created. Producers and consumers changing independently without realizing the semantic contract between them has drifted.&lt;/p&gt;

&lt;p&gt;That is already a distributed systems problem, even if everything still runs inside one JVM.&lt;/p&gt;

&lt;p&gt;And that was the moment Marta realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Distribution is not a deployment problem. It starts as a data problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The architecture diagrams had not changed yet, but the organizational reality already had. Different teams owned different stages of the pipeline. External integrations introduced their own semantics. Some transformations were deterministic and easy to reason about; others depended on databases, carrier APIs, fraud services, and infrastructure outside the team’s control. The application might still have been physically centralized, but conceptually it had already become a collection of independently evolving boundaries.&lt;/p&gt;

&lt;p&gt;That was where TPF started becoming much more than a convenient orchestration framework.&lt;/p&gt;

&lt;p&gt;The team was not using it as a generic workflow interpreter where loosely defined tasks execute dynamically at runtime. What TPF increasingly provided was something much closer to a typed application pipeline compiler: a system capable of understanding the boundaries between stages well enough to generate contracts, validate transformations, wire transports, expose endpoints, and fail builds when parts of the pipeline drifted out of alignment.&lt;/p&gt;

&lt;p&gt;The distinction mattered enormously.&lt;/p&gt;

&lt;p&gt;The pipeline steps themselves remained ordinary application code. Developers wrote Quarkus services, plain Java methods, some reactive Mutiny handlers where concurrency justified the complexity, some blocking implementations where simplicity mattered more than theoretical throughput. Nobody had to abandon the normal ergonomics of application development to “enter the workflow engine.”&lt;/p&gt;

&lt;p&gt;But the boundaries between those steps became explicit.&lt;/p&gt;

&lt;p&gt;Instead of passing anonymous maps through the system and hoping conventions would survive organizational growth, stages now declared typed inputs and outputs, mapper rules, cardinality expectations, operator contracts, and transport compatibility in ways the compiler could actually verify.&lt;/p&gt;

&lt;p&gt;The effect on development was immediate and surprisingly human. Refactoring became less frightening. Teams stopped relying on tribal knowledge to understand dependencies. A mapper mismatch became a compilation error instead of a production incident discovered three weeks later through telemetry dashboards and apologetic Slack messages.&lt;/p&gt;

&lt;p&gt;Peace of mind was alas, restored, once all the data contracts between steps were formalised, and the architecture stopped evolving accidentally.&lt;/p&gt;

</description>
      <category>tpf</category>
      <category>java</category>
      <category>quarkus</category>
      <category>datascience</category>
    </item>
    <item>
      <title>The Lift and Shift</title>
      <dc:creator>Mariano Barcia</dc:creator>
      <pubDate>Thu, 07 May 2026 18:12:31 +0000</pubDate>
      <link>https://dev.to/mbarcia/the-lift-n-shift-378b</link>
      <guid>https://dev.to/mbarcia/the-lift-n-shift-378b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is the continuation of &lt;a href="https://dev.to/mbarcia/the-script-that-refused-to-stay-small-1mod"&gt;"The script that refused to stay small"&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The conversation had already been happening for months: three data centers, rising costs, aging hardware, and a growing sense that the whole setup was one incident away from becoming a liability.&lt;/p&gt;

&lt;p&gt;The decision came quickly after the "kalima" event: everything had to move.&lt;/p&gt;

&lt;p&gt;What followed was not elegant, as the platform team scrambled to pull off a lift &amp;amp; shift to the cloud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hypervisor VMs mapped 1:1 into cloud instances&lt;/li&gt;
&lt;li&gt;network rules replicated (and occasionally guessed)&lt;/li&gt;
&lt;li&gt;storage reattached, sometimes awkwardly&lt;/li&gt;
&lt;li&gt;timelines optimistic, then revised, then ignored&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most applications... just came along for the ride whilst Marta watched all of this unfold.&lt;/p&gt;

&lt;p&gt;Her service was, technically, just another VM in the inventory. It could have been copied over, like everything else, but the lift and shift was rushed and was accumulating tech debt almost by definition. So she made a different call.&lt;/p&gt;

&lt;p&gt;Instead of following the 1:1 VM migration path, she opted into an early container platform the company had been experimenting with—something not yet standard, slightly under-documented, but good enough.&lt;/p&gt;

&lt;p&gt;Not because she was trying to be innovative, but because her system made it easy.&lt;/p&gt;




&lt;p&gt;Containerizing the application turned out to be almost trivial.&lt;/p&gt;

&lt;p&gt;Quarkus already produced a lean runtime, with the pipeline living inside a single process with well-defined boundaries. There were no hidden dependencies on the host, no fragile startup scripts, no tight coupling to the underlying machine.&lt;/p&gt;

&lt;p&gt;Marta wrote a Dockerfile, wired a couple of environment variables, and that was… mostly it.&lt;/p&gt;

&lt;p&gt;The hardest part wasn’t the application, but everything around it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;getting the right network access&lt;/li&gt;
&lt;li&gt;aligning with security policies&lt;/li&gt;
&lt;li&gt;making sure it could talk to the same external systems as before&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So while most systems were being translated from one VM to another, Marta’s was quietly being repackaged.&lt;/p&gt;

&lt;p&gt;And once it ran, something became clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was still a monolith&lt;/li&gt;
&lt;li&gt;Steps still called each other directly, in-process&lt;/li&gt;
&lt;li&gt;The pipeline still lived entirely inside a single runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only the execution environment had changed.&lt;/p&gt;




&lt;p&gt;That was the first quiet lesson &lt;a href="https://pipelineframework.org" rel="noopener noreferrer"&gt;The Pipeline Framework&lt;/a&gt; taught the team: you can move where something runs without changing how it behaves.&lt;/p&gt;

&lt;p&gt;A few weeks later, someone asked Marta how long her migration had taken; she hesitated (because the honest answer sounded wrong: “About a day. Maybe two, if you count the networking issues.”&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Photo credit: Javier Mediavilla E, CC BY-SA 2.5 &lt;a href="https://creativecommons.org/licenses/by-sa/2.5" rel="noopener noreferrer"&gt;https://creativecommons.org/licenses/by-sa/2.5&lt;/a&gt;, via Wikimedia Commons&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>java</category>
      <category>tpf</category>
      <category>serverless</category>
    </item>
    <item>
      <title>The Script That Refused to Stay Small</title>
      <dc:creator>Mariano Barcia</dc:creator>
      <pubDate>Thu, 09 Apr 2026 21:54:41 +0000</pubDate>
      <link>https://dev.to/mbarcia/the-script-that-refused-to-stay-small-1mod</link>
      <guid>https://dev.to/mbarcia/the-script-that-refused-to-stay-small-1mod</guid>
      <description>&lt;p&gt;It started, as these things often do, with a single process running on a single machine in a server room nobody liked visiting. The system took in shipment requests, enriched them with a few heuristics, and spat out routing hints. Nothing fancy, just enough logic to save operations teams a few hours a day, and Marta built it on her own as a side project.&lt;/p&gt;

&lt;p&gt;Marta wasn’t new to Java, she had spent a few months working in a microservices project in Spring and liked the serverless functional-style thinking: small transformations composed together. She had enough scar-tissue by now having experienced the inevitable issues with Spring and wanted to experiment with Quarkus anyway.&lt;/p&gt;

&lt;p&gt;She picked TPF because, on top of featuring a canvas UI to design the pipeline, she got the complete app's scaffolding as a pure Quarkus project. She could keep developing on her IDE as usual, only with the addition of the Quarkus environment plugin. And, she got to use Dev Services which she also wanted to try.&lt;/p&gt;

&lt;p&gt;Her choices for the script were deliberately boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a JVM runtime (a single process) with&lt;/li&gt;
&lt;li&gt;no high availability&lt;/li&gt;
&lt;li&gt;a traditional direct method invocation between the orchestrator and the pipeline steps&lt;/li&gt;
&lt;li&gt;no DB, just basic HTML responses to human queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each step in the pipeline was just a function. Input came in as loosely structured key/value data. No rigid schema, no upfront modeling, no SQL persistence.&lt;/p&gt;

&lt;p&gt;She didn’t yet have to think about&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execution tracking or audits&lt;/li&gt;
&lt;li&gt;fan-out/fan-in logic&lt;/li&gt;
&lt;li&gt;retry semantics&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;li&gt;availability&lt;/li&gt;
&lt;li&gt;high throughput&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;integrations with 3rd parties&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because she had started using AI-assisted coding tools, even the tests came almost for free, as TPF’s step isolation made it trivial to generate meaningful unit tests for each transformation.&lt;br&gt;
It was fast. It was understandable. It worked and, crucially, it already had shape—even if nobody called it that yet.&lt;/p&gt;

&lt;p&gt;But during one summer's day, a sandstorm from the Sahara impacted  Valencia and caused temperatures to rise (a phenomenon called kalima). The A/C unit in the server room failed and, by the next morning morning, alerts were firing, CPUs were throttling, and someone mentioned, only half jokingly, the possibility of actual fire.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0tquvjm4qn8haoc57at.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg0tquvjm4qn8haoc57at.webp" alt="Dust cloud over Gandia, Valencia" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>java</category>
      <category>tpf</category>
      <category>unittest</category>
    </item>
    <item>
      <title>Architectural mobility for stronger software</title>
      <dc:creator>Mariano Barcia</dc:creator>
      <pubDate>Tue, 07 Apr 2026 19:37:36 +0000</pubDate>
      <link>https://dev.to/mbarcia/architectural-mobility-for-stronger-software-2nh4</link>
      <guid>https://dev.to/mbarcia/architectural-mobility-for-stronger-software-2nh4</guid>
      <description>&lt;p&gt;There’s a concept in sports science that’s easy to overlook because it sounds so basic: “mobility”. Mobility is defined as “the ability of a joint to move actively through its full, functional range of motion with control, stability, and strength“.&lt;/p&gt;

&lt;p&gt;If you look at a simplified “athlete performance” pyramid, the foundation isn’t power or strength; it’s mobility. Everything else builds on top of that, but we spend most of our time discussing the upper layers and very little attention is paid to what sits at the foundation of the pyramid. Take away mobility, and the strength will falter.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       / - \
      /     \
     / Power \    Athlete Performance Pyramid
    /_________\
   / Strength  \  
  /_____________\
 /   Mobility    \ 
/_________________\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now, the reasons why mobility is so important are many and complex, but basically have to do with how the nervous system is able to recruit muscle fibres, whilst at the same time staying healthy (ie. by doing “reciprocal inhibition”). &lt;/p&gt;

&lt;p&gt;Putting aside the inherent complexity of the muscles in the human body, I think software systems behave in a similar way, and we spend most of our time discussing the upper layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scalability&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;whilst paying very little attention to what sits underneath all of that.&lt;/p&gt;

&lt;p&gt;Most software systems miss something fundamental: they cannot change shape without breaking themselves.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You move from containers to functions → everything rewrites&lt;/li&gt;
&lt;li&gt;You switch from REST to gRPC → contracts ripple through the system&lt;/li&gt;
&lt;li&gt;You change how remote work is executed → business logic gets entangled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system might be “strong” in its current form, but it lacks mobility. It’s rarely stated explicitly, and runtime, transport, and protocol are treated as the same decision.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You deploy to containers → you expose REST → you serialise JSON.&lt;/li&gt;
&lt;li&gt;Or you go serverless → you wire HTTP → you pass payloads around.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing looks wrong and in fact, it feels coherent, but still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your execution model has dictated your transport&lt;/li&gt;
&lt;li&gt;your transport has dictated your protocol&lt;/li&gt;
&lt;li&gt;and all three together have dictated your system shape&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This affects “architectural mobility” because&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You cannot change where things run without rewriting how they communicate&lt;/li&gt;
&lt;li&gt;You cannot change how they communicate without rewriting what they mean&lt;/li&gt;
&lt;li&gt;You cannot evolve protocols without locking yourself into a runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That mobility is what allows your business logic to evolve regardless of any external infrastructure decision, and will allow you to make these deliberate choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;do your workloads belong in containers?&lt;/li&gt;
&lt;li&gt;do your workloads belong in serverless functions?&lt;/li&gt;
&lt;li&gt;do they benefit from gRPC, or REST?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In &lt;a href="https://pipelineframework.org" rel="noopener noreferrer"&gt;The Pipeline Framework&lt;/a&gt;, architectural mobility is enabled by decoupling the transport from the execution platform from the runtime topology, like so: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                     Transport
               (LOCAL / REST / gRPC / Proto-HTTP)
                           ↑
                           │
                           │
                           │
                           │
                           │
                           ●───────────────→ Execution Platform
                          /                (COMPUTE / FUNCTION)
                         /
                        /
                       /
                      ↓
             Runtime Topology
  (Monolith / Pipeline / Modular)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Photo credit: &lt;a href="https://unsplash.com/es/@weareambitious" rel="noopener noreferrer"&gt;https://unsplash.com/es/@weareambitious&lt;/a&gt;&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>java</category>
      <category>software</category>
      <category>tpf</category>
    </item>
  </channel>
</rss>
