<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Architecture &amp; Microservices on JAVAPRO International</title><link>https://javapro-en.svenruppert.com/categories/architecture--microservices/</link><description>Recent content in Architecture &amp; Microservices on JAVAPRO International</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Tue, 14 Jul 2026 07:00:01 +0000</lastBuildDate><atom:link href="https://javapro-en.svenruppert.com/categories/architecture--microservices/index.xml" rel="self" type="application/rss+xml"/><item><title>Do You Still Write Code without Hexagon?</title><link>https://javapro-en.svenruppert.com/do-you-still-write-code-without-hexagon/</link><pubDate>Tue, 14 Jul 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/do-you-still-write-code-without-hexagon/</guid><description>&lt;p&gt;During our training in architecture, we often ask participants if they are familiar with Hexagonal architecture, and it’s surprising to see only a few hands raised initially. After a brief presentation, we see a few more hands go up, as participants realize they have been using Hexagonal architecture without realizing it.&lt;/p&gt;
&lt;p&gt;As hands-on architects, we rely heavily on Hexagonal architecture in our daily work. However, we notice that many people are still unaware of the significant benefits it can bring to their projects. &lt;/p&gt;</description></item><item><title>2: The Jakarta Cliff: Why Modern Java Leaves Struts 1 Behind</title><link>https://javapro-en.svenruppert.com/2-the-jakarta-cliff-why-modern-java-leaves-struts-1-behind/</link><pubDate>Thu, 18 Jun 2026 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/2-the-jakarta-cliff-why-modern-java-leaves-struts-1-behind/</guid><description>&lt;p&gt;This is the second in a series of articles exploring the realities of modernisation. In this article, you&amp;rsquo;ll learn about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Modern Java Breakpoint:&lt;/strong&gt; Why the shift from &lt;code&gt;javax&lt;/code&gt; to &lt;code&gt;jakarta&lt;/code&gt; creates an unfixable compatibility break for Struts 1 on modern containers like Tomcat 10 and Jetty 11.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The External Pressure Cooker:&lt;/strong&gt; How platform baselines, security policies, and cloud migrations force the issue, even if the application code itself hasn&amp;rsquo;t changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why &amp;ldquo;Shims&amp;rdquo; Fail:&lt;/strong&gt; A look at why attempting to patch compatibility with shims is not a viable long-term solution for production environments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safe Operation Strategies:&lt;/strong&gt; What it practically means to run Struts securely on older containers without exposing the rest of your infrastructure to risk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Path to Modernisation:&lt;/strong&gt; How to use incremental migration patterns and extended support to modernise on your own terms, avoiding risky &amp;ldquo;big-bang&amp;rdquo; rewrites.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2025/12/struts1-banner-1024x358.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Beyond UML: Clean Software Architecture in the Age of AI‑Generated Code</title><link>https://javapro-en.svenruppert.com/beyond-uml-clean-software-architecture-in-the-age-of-aigenerated-code/</link><pubDate>Wed, 10 Jun 2026 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/beyond-uml-clean-software-architecture-in-the-age-of-aigenerated-code/</guid><description>&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;Today we write more code in less time than ever before. AI systems act like permanently available junior programmers: They produce thousands of lines of code in minutes – but who takes responsibility for the software architecture?&lt;/p&gt;
&lt;p&gt;The real problem is therefore often not “bad AI code,” but the growing difficulty for people to keep an overview and make sound architectural decisions.&lt;/p&gt;
&lt;p&gt;This article discusses an idea for quickly building a mental model of existing code, spotting architectural problems early, and making targeted changes – without having to maintain static documentation in parallel.&lt;/p&gt;</description></item><item><title>JCON EUROPE 2026: Why the Java Community Still Meets in Person</title><link>https://javapro-en.svenruppert.com/jcon-europe-2026-why-the-java-community-still-meets-in-person/</link><pubDate>Mon, 01 Jun 2026 07:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/jcon-europe-2026-why-the-java-community-still-meets-in-person/</guid><description>&lt;p&gt;Every year, when we start planning JCON EUROPE, one question always guides us:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do we create a conference that developers genuinely enjoy attending?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Not just another event with slides and sponsor booths. Not a place where people passively consume information and leave. We wanted to create an environment where developers actively connect, discuss, challenge ideas, and solve real-world problems together.&lt;/p&gt;
&lt;p&gt;Looking back at JCON EUROPE 2026, I believe this spirit was visible everywhere.&lt;/p&gt;</description></item><item><title>From Spaghetti to Hexagons: A Practical Guide to Clean Java Architecture</title><link>https://javapro-en.svenruppert.com/from-spaghetti-to-hexagons-a-practical-guide-to-clean-java-architecture/</link><pubDate>Wed, 27 May 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/from-spaghetti-to-hexagons-a-practical-guide-to-clean-java-architecture/</guid><description>&lt;h2 id="a-culinary-warning-and-the-dark-side-of-code"&gt;A Culinary Warning and the Dark Side of Code&lt;/h2&gt;
&lt;p&gt;Welcome, fellow architect and beloved developer, to our hexagonal city-state—a realm where pragmatism reigns supreme and flexibility is our greatest strength. This guide is not an ivory tower doctrine filled with theoretical perfection, but rather a versatile toolbox tempered in the forge of real-world challenges and countless production battlefields.&lt;/p&gt;
&lt;p&gt;Before we can erect the citadel of clean architecture, we must first acknowledge the reality of our industry. We must navigate the &amp;ldquo;Dark Side of Code&amp;rdquo;. The software world is rife with culinary disasters that would make a chef weep. We are all too familiar with &lt;strong&gt;Spaghetti Code&lt;/strong&gt;^(&lt;a href="#c3600f8a-312d-40da-8d49-7a198c390a5d"&gt;1&lt;/a&gt;), a tangled mess where program flow twists and turns like pasta, making maintenance a nightmare where references and dependencies jump all over the place. But the menu of disaster is extensive.&lt;/p&gt;</description></item><item><title>Open-Core with Core Java and Vaadin — Part 2</title><link>https://javapro-en.svenruppert.com/open-core-with-core-java-and-vaadin-part-2/</link><pubDate>Sat, 23 May 2026 11:33:42 +0000</pubDate><guid>https://javapro-en.svenruppert.com/open-core-with-core-java-and-vaadin-part-2/</guid><description>&lt;p&gt;&lt;em&gt;Editions, runtime, and quality assurance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All source code presented here is published on GitHub and available at &lt;strong&gt;&lt;a href="https://3g3.eu/naityh"&gt;https://3g3.eu/naityh&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="recap-of-part-one"&gt;Recap of part one&lt;/h2&gt;
&lt;p&gt;The first part of this article developed the abstract mechanics of the open-core application. From two independent Maven projects with strictly asymmetric dependency direction, a deliberately slim extension API with the contribution types &lt;code&gt;RouteContribution&lt;/code&gt;, &lt;code&gt;MenuContribution&lt;/code&gt;, &lt;code&gt;NavbarContribution&lt;/code&gt;, and &lt;code&gt;CounterEventListener&lt;/code&gt;, a &lt;code&gt;FeatureRegistry&lt;/code&gt; that discovers its contributions via the Java standard library&amp;rsquo;s &lt;code&gt;ServiceLoader&lt;/code&gt;, and a Vaadin integration consisting of &lt;code&gt;MainLayout&lt;/code&gt; and &lt;code&gt;OpenCoreRouteInitializer&lt;/code&gt;, an apparatus is now in place that can accept arbitrary contributions in ordered form, without the core needing to know their identity.&lt;/p&gt;</description></item><item><title>Open-Core with Core Java and Vaadin — Part 1</title><link>https://javapro-en.svenruppert.com/open-core-with-core-java-and-vaadin-part-1/</link><pubDate>Fri, 22 May 2026 11:33:04 +0000</pubDate><guid>https://javapro-en.svenruppert.com/open-core-with-core-java-and-vaadin-part-1/</guid><description>&lt;p&gt;&lt;em&gt;Architecture, extension API, and Vaadin integration.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-introduction-and-motivation"&gt;1. Introduction and motivation&lt;/h2&gt;
&lt;p&gt;The open-core model is often reduced in discussion to questions of licensing or commercial positioning. An open-source variant of a piece of software is complemented by a commercially distributed variant that brings additional features. Anyone who actually wants to implement such a separation in an existing codebase quickly discovers that the real difficulty lies neither in the licence text nor in the choice of repository, but in the code&amp;rsquo;s architecture.&lt;/p&gt;</description></item><item><title>Petabyte-Scale AI Memory with Serverless Java</title><link>https://javapro-en.svenruppert.com/petabyte-scale-ai-memory-with-serverless-java/</link><pubDate>Wed, 15 Apr 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/petabyte-scale-ai-memory-with-serverless-java/</guid><description>&lt;p&gt;&lt;a href="https://youtu.be/KfXn6v_DmTo"&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2026/03/2026-Magazin-Artikel-Banner-1024x213.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The current wave of Generative AI innovation is built on a paradox. While models are becoming more powerful and efficient, the infrastructure required to operate them at scale is becoming increasingly wasteful. Enterprises are investing millions into compute, storage, and energy, yet a significant portion of these resources remains idle. Modern vector databases, graph systems, and caching layers are based on a monolithic architecture run as always-on clusters, consuming CPU and RAM regardless of whether data is actively accessed. Studies and industry analyses consistently show that up to 80% of compute resources in such systems are effectively wasted on idle workloads.&lt;/p&gt;</description></item><item><title>Zero Migration Java - Staying Current Without Breaking Your App</title><link>https://javapro-en.svenruppert.com/zero-migration-java-staying-current-without-breaking-your-app/</link><pubDate>Fri, 10 Apr 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/zero-migration-java-staying-current-without-breaking-your-app/</guid><description>Keeping enterprise Java applications secure and up-to-date is critical but traditional runtime upgrades often come with painful migrations, broken dependencies, and retesting cycles. What if developers could upgrade their runtime without touching their code? In this article, we explore the concept of zero migration — a runtime model that allows Java applications to stay current with the latest pat</description></item><item><title>A Big Screen Experience for Java Developers &amp; Architects</title><link>https://javapro-en.svenruppert.com/a-big-screen-experience-for-java-developers-architects/</link><pubDate>Wed, 08 Apr 2026 12:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/a-big-screen-experience-for-java-developers-architects/</guid><description>&lt;p&gt;&lt;strong&gt;JCON EUROPE 2026 | April 20–23, 2026 | Cinedom Cologne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Anyone talking about modern software development today can hardly avoid Java. Few technologies have shaped the enterprise world as sustainably, and few communities are as vibrant, diverse, and innovation-driven. This is exactly where JCON comes in: as a meeting point, a platform, and an experiential space for developers from all over the world. With participants from more than 70 countries, JCON has long since become an international gathering. &lt;strong&gt;Openness, knowledge sharing&lt;/strong&gt;, and a &lt;strong&gt;strong sense of community&lt;/strong&gt; remain at its core.&lt;/p&gt;</description></item><item><title>High-Performance Vector-Search Grids with Java</title><link>https://javapro-en.svenruppert.com/high-performance-vector-search-grids-with-java/</link><pubDate>Wed, 08 Apr 2026 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/high-performance-vector-search-grids-with-java/</guid><description>&lt;p&gt;&lt;a href="https://youtu.be/MRSdUfnXgQE"&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2026/03/2026-Magazin-Artikel-Banner-1024x213.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The rapid rise of Generative AI has fundamentally changed how modern systems are designed. While much of the attention has focused on large language models and inference pipelines, the real differentiator in production systems lies elsewhere: in the infrastructure that delivers context to those models. Retrieval-Augmented Generation (RAG) has become the de facto pattern for enterprise GenAI. It relies on fast, scalable access to embeddings, metadata, and relationships. Yet for Java developers, building such systems at scale has remained a challenge. External vector databases introduce latency, fragmentation, and operational complexity. Distributed caches struggle with memory inefficiency and serialization overhead. Traditional databases cannot handle high-dimensional similarity search at the required speed.&lt;/p&gt;</description></item><item><title>Java Performance Optimization with Agentic AI: Autonomous Diagnostics and Actionable Recommendations</title><link>https://javapro-en.svenruppert.com/java-performance-optimization-with-agentic-ai-autonomous-diagnostics-and-actionable-recommendations/</link><pubDate>Tue, 07 Apr 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-performance-optimization-with-agentic-ai-autonomous-diagnostics-and-actionable-recommendations/</guid><description>&lt;p&gt;&lt;a href="https://schedule.jcon.one/2026/session/1050952"&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2026/03/2026-Magazin-Artikel-Banner-1024x213.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Java performance diagnosis in production is manual, slow, and requires deep expertise. You get a Grafana alert, grab a thread dump, download a JFR recording, open it in JDK Mission Control, stare at flamegraphs, correlate with metrics — hours of work per incident. Most teams don&amp;rsquo;t have a dedicated performance engineer, so alerts get ignored or result in generic &amp;ldquo;add more replicas&amp;rdquo; responses.&lt;/p&gt;
&lt;p&gt;We built a system that does this autonomously. When a monitoring alert fires, it collects profiling data and thread dumps, extracts runtime metrics, generates flamegraphs, and sends everything to an AI model that produces a structured performance report — including root cause analysis and concrete code fixes with file paths and line numbers from the actual source repository. The pipeline runs on Kubernetes, triggered by Grafana webhooks, with results stored in Amazon S3.&lt;/p&gt;</description></item><item><title>Agentic AI Patterns for Enterprise Software</title><link>https://javapro-en.svenruppert.com/agentic-ai-patterns-for-enterprise-software/</link><pubDate>Tue, 31 Mar 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/agentic-ai-patterns-for-enterprise-software/</guid><description>&lt;p&gt;It is no surprise that software development is increasingly shaped by the integration of AI. As the technology matures, we are moving beyond simple, monolithic AI models or single shot API calls. Modern enterprise architectures are rapidly adopting &lt;em&gt;agentic AI&lt;/em&gt; systems, which orchestrate multiple independent reasoning agents to accomplish complex, real-world tasks. This article explores these powerful patterns, covering the core concepts of agents, their coordination, orchestration models, and crucially how to implement them effectively in enterprise Java applications. &lt;/p&gt;</description></item><item><title>AI without spaghetti: Clean architecture in the age of AI</title><link>https://javapro-en.svenruppert.com/ai-without-spaghetti-clean-architecture-in-the-age-of-ai/</link><pubDate>Tue, 17 Mar 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/ai-without-spaghetti-clean-architecture-in-the-age-of-ai/</guid><description>&lt;p&gt;&lt;a href="https://schedule.jcon.one/2026/session/1052623"&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2026/03/2026-Magazin-Artikel-Banner-1024x213.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="when-just-ship-it-turns-into-lasagna-code"&gt;When “Just ship it” turns into lasagna code&lt;/h2&gt;
&lt;p&gt;We start with a familiar scene: a small experiment that grows faster than its architecture can handle. This is exactly the kind of situation where clean architecture becomes essential. Like layering pasta without checking the recipe, we kept adding features until the structure began to wobble.&lt;/p&gt;
&lt;p&gt;At first everything seems perfectly reasonable. A quick integration with an API, a prompt that produces surprisingly good results. Suddenly the prototype starts solving real problems. The codebase grows organically: a helper class here, a service there.  Maybe a controller that does just a little bit more than it probably should.&lt;/p&gt;</description></item><item><title>JCON Meets Enterprise AI - From Basics to Production</title><link>https://javapro-en.svenruppert.com/jcon-meets-enterprise-ai-from-basics-to-production/</link><pubDate>Thu, 29 Jan 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/jcon-meets-enterprise-ai-from-basics-to-production/</guid><description>&lt;p&gt;From &lt;strong&gt;April 20–23, 2026&lt;/strong&gt;, the European Java community will once again gather in Cologne for &lt;strong&gt;JCON EUROPE 2026&lt;/strong&gt;. Taking place at the &lt;strong&gt;Cinedom multiplex cinema&lt;/strong&gt;, the conference brings together developers, architects, and Java enthusiasts for four days of knowledge sharing, inspiration, and real-world experience — all on the big screen.&lt;/p&gt;
&lt;p&gt;Under the motto &lt;strong&gt;“Big screen. Big community. Big AI.”&lt;/strong&gt;, JCON EUROPE 2026 offers an in-person &lt;a href="https://schedule.jcon.one/2026/"&gt;program&lt;/a&gt; running daily from &lt;strong&gt;9:00 to 18:00 (CEST)&lt;/strong&gt;, combining technical depth with a strong community focus.&lt;/p&gt;</description></item><item><title>Java 25 + GenAI: A New Era for Microservices in Finance</title><link>https://javapro-en.svenruppert.com/java-25-genai-a-new-era-for-microservices-in-finance/</link><pubDate>Thu, 22 Jan 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-25-genai-a-new-era-for-microservices-in-finance/</guid><description>Java 25 and GenAI combine to build explainable, scalable microservices for finance — blending performance, transparency, and open-source innovation in one architecture.</description></item><item><title>Code. Collaboration. Community.</title><link>https://javapro-en.svenruppert.com/code-collaboration-community/</link><pubDate>Wed, 24 Dec 2025 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/code-collaboration-community/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;JCON USA @ IBM TechXchange 2025 – where the spirit of Java found a new home in Orlando.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When the JCON team announced they were bringing their renowned Java conference series across the Atlantic, expectations were high. Known for its lively spirit and deep technical content, JCON Europe has become a must-attend event for Java developers. Its first U.S. edition – &lt;strong&gt;JCON USA @ IBM TechXchange 2025&lt;/strong&gt; – not only met those expectations but exceeded them, uniting Java professionals from around the world under one roof in Orlando.&lt;/p&gt;</description></item><item><title>Java Meets the Future: How Quarkus Seamlessly Combines Architecture, Performance, and Cloud-Native</title><link>https://javapro-en.svenruppert.com/java-meets-the-future-how-quarkus-seamlessly-combines-architecture-performance-and-cloud-native/</link><pubDate>Thu, 04 Dec 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-meets-the-future-how-quarkus-seamlessly-combines-architecture-performance-and-cloud-native/</guid><description>&lt;p&gt;Given the increasing ubiquity of digital technologies, which are becoming increasingly and naturally embedded in our environment, the essential question arises as to what role Java will play in this future development of IT systems. Mark Weiser, pioneer of ubiquitous computing, described this technological paradigm shift as follows: “The best technology is the one we don&amp;rsquo;t even notice because it naturally enriches our everyday lives.” (paraphrased from [LMU19]).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ubiquitous computing&lt;/strong&gt; is already demonstrating how technology is becoming omnipresent and seamlessly integrated into our environment as an invisible companion. A key factor here is the almost universal access to networks (such as Wi-Fi), which is increasingly becoming standard infrastructure internationally. This access enables the real-time networking of smart devices, from smart homes to wearables, and forms the basis for technologies that work intuitively in the background and communicate with each other seamlessly without disruptive interference. In addition, ubiquitous computing promotes an ever-closer &lt;strong&gt;symbiosis between humans and machines&lt;/strong&gt;, in which new technologies are emerging that are increasingly replacing classic interfaces to the digital world such as smartphones and tablets. Devices such as mixed reality glasses (e.g. &lt;em&gt;Meta Quest&lt;/em&gt; or &lt;em&gt;Apple Vision Pro)&lt;/em&gt; open up a new form of interaction in which digital information is projected directly and contextually into the field of vision. The goal is no longer just general interaction, but rather the precise adaptation of digital content to the individual needs of the user. This development leads to the concept of &lt;strong&gt;hyper-personalization&lt;/strong&gt;: systems respond in real time to location, preferences, and goals, providing tailored information, entertainment, or support in everyday life. This points to a future in which digital experiences are seamlessly integrated into personal life.&lt;/p&gt;</description></item><item><title>How Coupled Are Your Microservices?</title><link>https://javapro-en.svenruppert.com/how-coupled-are-your-microservices/</link><pubDate>Tue, 04 Nov 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/how-coupled-are-your-microservices/</guid><description>&lt;p&gt;In this article, we address a crucial topic in software architecture: coupling and its main types in the context of microservices architecture.&lt;/p&gt;
&lt;p&gt;The motivation for this writing comes from direct experience with the negative impact of coupling on system design. In one project, delivered by a software house, we had to fully refactor it before going live due to excessive domain, pass-through, shared data, and content coupling. These interdependencies made the services fragile and undermined their autonomy, scalability, and maintainability.&lt;/p&gt;</description></item><item><title>Dynamic consistency boundaries</title><link>https://javapro-en.svenruppert.com/dynamic-consistency-boundaries/</link><pubDate>Tue, 28 Oct 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/dynamic-consistency-boundaries/</guid><description>&lt;p&gt;In software, Consistency may refer to many things - Code Consistency, Data Consistency, User Interface Consistency, etc. In this article, I am focusing on Data Consistency. Simply put, Data Consistency ensures that data remains accurate and reliable across different parts of a system. More formally, Data Consistency is one of the Database Transaction properties (ACID^(&lt;a href="#01a8d66d-6749-455b-bbf6-a3934138f30b"&gt;1&lt;/a&gt;)) defined as:&lt;/p&gt;
&lt;blockquote class="pullquote"&gt;
 &lt;span class="pullquote-mark" aria-hidden="true"&gt;“&lt;/span&gt;
 &lt;div class="pullquote-body"&gt;&lt;p&gt;Consistency (or correctness) ensures that a transaction can only bring the database from one consistent state to another, preserving database invariants.&lt;/p&gt;</description></item><item><title>Improving Platform Observability with Distributed Tracing and OpenTelemetry</title><link>https://javapro-en.svenruppert.com/improving-platform-observability-with-distributed-tracing-and-opentelemetry/</link><pubDate>Mon, 22 Sep 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/improving-platform-observability-with-distributed-tracing-and-opentelemetry/</guid><description>&lt;p&gt;Observability has become crucial for modern applications. Distributed tracing, in particular, is essential for diagnosing issues within complex transactions. OpenTelemetry has emerged as the indispensable standard in this field. This article explores the fundamentals of distributed tracing, its implementation, and its impacts.&lt;/p&gt;
&lt;p&gt;In a context where applications are increasingly complex, it is crucial to be able to observe each transaction in detail to quickly identify problems and ensure continuous evolution of the platform. Among the three main pillars of observability—logs, metrics, and traces—traces are often less known but equally essential.&lt;/p&gt;</description></item><item><title>Microservices: Lessons from the Trenches</title><link>https://javapro-en.svenruppert.com/microservices-lessons-from-the-trenches/</link><pubDate>Fri, 12 Sep 2025 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/microservices-lessons-from-the-trenches/</guid><description>&lt;p&gt;During my 15-year journey in the world of software development, I spent the vast majority of my time designing and implementing systems using microservices architecture. I’ve been involved in multiple migrations from monolithic systems to microservices, as well as building new solutions from scratch.  Along the way, my teams and I made plenty of mistakes. Some were quite trivial and easy to correct, others involved decisions that were difficult to reverse, or changes that required significant effort to fix. More than once, I found myself in situations where it seemed that working with this architecture was pointless and too challenging.&lt;/p&gt;</description></item><item><title>Java at Eclipse: Honoring the Legacy, Securing the Future of Open Source Innovation</title><link>https://javapro-en.svenruppert.com/java-at-eclipse-honoring-the-legacy-securing-the-future-of-open-source-innovation/</link><pubDate>Wed, 03 Sep 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-at-eclipse-honoring-the-legacy-securing-the-future-of-open-source-innovation/</guid><description>&lt;p&gt;Java changed software development and reshaped open source innovation forever, but its future was uncertain for a while. Would it remain an innovative force, or would closed governance and slow progress relegate it to history? Enter the Eclipse Foundation, &lt;strong&gt;where the future of open source Java was reimagined.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Java’s journey famously began in the mid-1990s, revolutionising software development with its “write once, run anywhere” promise. Originally, Java, the language, was called &amp;ldquo;Oak,&amp;rdquo; a name chosen by its creator, James Gosling, after an oak tree outside his office. Oak trees are known for their deep roots and longevity, much like Java, which has remained a cornerstone of software development for decades. While the name was later changed due to trademark issues, its original symbolism reflects Java’s foundational role in modern computing: a language built to be powerful, adaptable, and enduring. Open-sourced by Oracle in 2007, it has become the backbone of enterprise applications, cloud computing, and mobile development.&lt;/p&gt;</description></item><item><title>The Role of Quarkus in the Modern Java Ecosystem</title><link>https://javapro-en.svenruppert.com/the-role-of-quarkus-in-the-modern-java-ecosystem/</link><pubDate>Fri, 22 Aug 2025 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/the-role-of-quarkus-in-the-modern-java-ecosystem/</guid><description>&lt;p&gt;Since its inception in 2019, Quarkus has gradually grown both in user adoption and innovation. The number of its different research and development areas is just enormous. It&amp;rsquo;s one of the most active Java projects you can find right now.&lt;/p&gt;
&lt;p&gt;Last year, Quarkus celebrated its 5th birthday and one additional tremendous milestone — 1000 contributors! These are contributors to the main repository only, not considering the additional 170 repositories under the Quarkiverse organization (which we tackle later in this article).&lt;/p&gt;</description></item><item><title>Demystifying Software Architecture: Styles/Patterns - PART 1</title><link>https://javapro-en.svenruppert.com/demystifying-software-architecture-styles-patterns-part-1/</link><pubDate>Thu, 14 Aug 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/demystifying-software-architecture-styles-patterns-part-1/</guid><description>&lt;p&gt;Whether you&amp;rsquo;re watching a gripping documentary on Netflix or any other OTT platform, witnessing a nail-biting Test match at Old Trafford, or placing an order on an e-commerce platform, you’re experiencing the result of great software architecture in action.&lt;/p&gt;
&lt;p&gt;I find it fascinating to explore the powerful software architectures that make modern applications so reliable and scalable.&lt;/p&gt;
&lt;p&gt;These real-time, large-scale systems handle pressure, recover from failures, and scale effortlessly because engineers design them with &lt;strong&gt;resilience, availability, fault tolerance, scalability, robustness, performance, recoverability, and continuity&lt;/strong&gt; in mind.&lt;/p&gt;</description></item><item><title>Mastering the Basics of Domain-Driven Design with Java</title><link>https://javapro-en.svenruppert.com/mastering-the-basics-of-domain-driven-design-with-java/</link><pubDate>Tue, 01 Jul 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/mastering-the-basics-of-domain-driven-design-with-java/</guid><description>&lt;p&gt;Domain-driven design (DDD) is a critical approach in software development, yet its essence often gets buried under layers of complexity and misunderstanding. At its core, DDD aims to align software design with the needs of the business or stakeholders, ensuring that what we build addresses real problems. Even that sounds like a cliche in software development, and obviously, it is still a challenge to most organizations.&lt;/p&gt;
&lt;p&gt;One standout example is &lt;em&gt;Forbes&amp;rsquo; 16 Obstacles to a Successful Software Project&lt;/em&gt;, which emphasizes challenges such as hyper-focused planning, unclear expectations, and poor collaboration. These issues often lead to scenarios where software is more about managing complexity than solving problems.&lt;/p&gt;</description></item><item><title>Java in Critical Operations: How Custom Development Ensures Control and Secures Mission-Critical Systems</title><link>https://javapro-en.svenruppert.com/java-in-critical-operations-how-custom-development-ensures-control-and-secures-mission-critical-systems/</link><pubDate>Mon, 02 Jun 2025 08:15:19 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-in-critical-operations-how-custom-development-ensures-control-and-secures-mission-critical-systems/</guid><description>&lt;p&gt;When IT fails, no one notices—until everyone does.&lt;br&gt;
Whether in hospitals, energy grids, or airports, stable operation of digital systems in safety-critical environments is not an option, but a strict requirement. This is where infrastructure must prove its resilience, scalability, and independence in the face of real-world crises.&lt;/p&gt;
&lt;p&gt;A prime example is Fraport AG, operator of one of Europe’s largest aviation hubs. When baggage goes missing or safety-critical information is delayed, it’s not just individual passengers’ vacations that are at risk—the operational stability of the entire airport is on the line. Behind the scenes of such a hub runs an extremely complex digital infrastructure that must operate reliably 24/7, despite increasing demands, ageing legacy systems, and tightening security regulations.&lt;/p&gt;</description></item><item><title>Cinema, Code, Community: JCON EUROPE 2025 raises the bar for Java events</title><link>https://javapro-en.svenruppert.com/cinema-code-community-jcon-europe-2025-a-new-era-for-java-events/</link><pubDate>Fri, 30 May 2025 09:33:47 +0000</pubDate><guid>https://javapro-en.svenruppert.com/cinema-code-community-jcon-europe-2025-a-new-era-for-java-events/</guid><description>&lt;p&gt;From hands-on workshops to live coding on the big screen to the new mentoring revolution – JCON EUROPE 2025 in Cologne was a celebration for Java enthusiasts from around the globe.&lt;/p&gt;
&lt;h2 id="a-global-gathering-of-the-java-community"&gt;A global gathering of the Java community&lt;/h2&gt;
&lt;p&gt;From May 12–15, 2025, Cologne became the epicentre of the international Java community. For the tenth edition of JCON EUROPE, developers from more than 60 countries across five continents gathered at the Cinedom to celebrate &lt;strong&gt;30 years of Java&lt;/strong&gt;. The atmosphere? Euphoric, collaborative – with plenty of good humour.&lt;/p&gt;</description></item><item><title>Java: let’s do a SWOT!</title><link>https://javapro-en.svenruppert.com/java-swot/</link><pubDate>Wed, 28 May 2025 07:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-swot/</guid><description>&lt;p&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2025/02/image-3.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote class="pullquote"&gt;
 &lt;span class="pullquote-mark" aria-hidden="true"&gt;“&lt;/span&gt;
 &lt;div class="pullquote-body"&gt;&lt;blockquote class="pullquote"&gt;
 &lt;span class="pullquote-mark" aria-hidden="true"&gt;“&lt;/span&gt;
 &lt;div class="pullquote-body"&gt;&lt;p&gt;&lt;em&gt;&amp;ldquo;Java is to enterprise what electricity is to civilisation&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;/div&gt;
&lt;/blockquote&gt;&lt;p&gt;Java has transcended “being just a programming language - it has become a cultural icon. From academic syllabuses to heated tech debates, and from &lt;a href="https://www.reddit.com/r/ProgrammerHumor/comments/g2xiqg/just_started_learning_java_and_ive_found_this/?utm_source=chatgpt.com"&gt;viral social media memes&lt;/a&gt; to &lt;a href="https://www.youtube.com/watch?v=RnqAXuLZlaE"&gt;pop culture references in movies&lt;/a&gt;, Java’s influence is everywhere. Few languages have had such an incredible run, shaping not just software but also conversations, careers, and even family.&lt;/p&gt;
&lt;p&gt;Java, a stalwart in the programming world, has not only stood the test of time but has also shaped the evolution of modern software development. To the casual observer, it may seem like just another language, yet over the past three decades, Java has cemented itself as an integral part of the technology ecosystem. It has been the foundation for groundbreaking innovations and a cornerstone of academic research.&lt;/p&gt;</description></item><item><title>Java through the decades: From Applets to Microservices</title><link>https://javapro-en.svenruppert.com/java-through-the-decades-from-applets-to-microservices/</link><pubDate>Thu, 22 May 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/java-through-the-decades-from-applets-to-microservices/</guid><description>&lt;h2 id="introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Java has undergone a remarkable transformation since its creation. It evolved from a language designed for interactive web-based Applets to a dominant force in enterprise development and cloud-native microservices. Java was originally created to enhance web interactivity. It soon evolved to support business applications, distributed systems, and modern architectures. This article explores Java evolution from Applets to microservices, highlighting key technological advancements and industry shifts.&lt;/p&gt;
&lt;h2 id="java-evolution-from-applets-to-microservices-a-technological-shift"&gt;&lt;strong&gt;Java Evolution from Applets to Microservices: A Technological Shift&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Java’s origins trace back to 1991 when Sun Microsystems initiated the Green Project to develop a platform-independent language. Officially released in 1995, Java introduced the concept of &amp;ldquo;Write Once, Run Anywhere&amp;rdquo; (WORA), allowing applications to execute on any system with a Java Virtual Machine (JVM).&lt;/p&gt;</description></item><item><title>The Simplest Way to Build Resilient Applications</title><link>https://javapro-en.svenruppert.com/the-simplest-way-to-build-resilient-applications/</link><pubDate>Thu, 08 May 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/the-simplest-way-to-build-resilient-applications/</guid><description>Restate is an open-source system that makes it easy to write resilient, consistent and scalable applications. Restate lets you write mission-critical applications, like payment workflows, user management, and AI agents, without worrying about resiliency.</description></item><item><title>The quick check for your software - the Software Coma Scale (SCS)</title><link>https://javapro-en.svenruppert.com/the-quick-check-for-your-software-the-software-coma-scale-scs/</link><pubDate>Mon, 07 Apr 2025 11:22:49 +0000</pubDate><guid>https://javapro-en.svenruppert.com/the-quick-check-for-your-software-the-software-coma-scale-scs/</guid><description>&lt;p&gt;Do you know this situation: You have are sitting on your desk when your boss asks you to “just have a look at an old software-system” at its current status? Since he doesn&amp;rsquo;t know much about your job (IT), you have to use a system that&lt;/p&gt;
&lt;p&gt;a) he understands and&lt;/p&gt;
&lt;p&gt;b) allows you to make an informed assessment relatively quickly.&lt;/p&gt;
&lt;p&gt;Or a customer asks whether you could change this or that thing in a system you don&amp;rsquo;t know - or even take over the maintenance for it. And just like your boss, he is not an IT specialist!&lt;/p&gt;</description></item><item><title>Building a better Mouse Trap - web crawling with Temporal</title><link>https://javapro-en.svenruppert.com/building-a-better-mouse-trap-web-crawling-with-temporal/</link><pubDate>Thu, 03 Oct 2024 14:26:30 +0000</pubDate><guid>https://javapro-en.svenruppert.com/building-a-better-mouse-trap-web-crawling-with-temporal/</guid><description>&lt;p&gt;For various reasons, I’ve been looking at &lt;a href="https://github.com/temporalio"&gt;Temporal&lt;/a&gt; lately. It’s one of those open-source projects with some great users - think Netflix, Uber, etc.- yet has less visibility in the Java community than expected. &lt;/p&gt;
&lt;p&gt;I hope to raise its profile here.&lt;/p&gt;
&lt;p&gt;Before I talk about Temporal, I’ll cover my particular use case.  &lt;em&gt;Stay with me; this needs to be detailed.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="background"&gt;Background&lt;/h3&gt;
&lt;p&gt;A side project I have is to create a Java API comparison tool that can be used to check if moving from version A to version B of a dependency will have issues.  I’m looking beyond the simple class-to-class comparison, I intend to check for a more holistic view to find runtime and compile time problems that might occur within the dependency tree if you upgrade something. &lt;/p&gt;</description></item><item><title>Developer Relations as Terraforming: Cultivating Ecosystems for Success</title><link>https://javapro-en.svenruppert.com/developer-relations-as-terraforming-cultivating-ecosystems-for-success/</link><pubDate>Thu, 26 Sep 2024 11:55:28 +0000</pubDate><guid>https://javapro-en.svenruppert.com/developer-relations-as-terraforming-cultivating-ecosystems-for-success/</guid><description>&lt;p&gt;As a “DevRel” person, I’m disappointed in how often our efforts are misunderstood and marginalised. In this article, I want to take another slant on the what and why of “DevRel.”&lt;/p&gt;
&lt;p&gt;Developer Relations (DevRel) holds the same transformative potential as terraforming in science fiction. It&amp;rsquo;s cheesy, but it’s pretty accurate. Much like engineers striving to turn a hostile, barren planet into one that can sustain life, DevRel teams are tasked with creating an atmosphere where developers can thrive. Success in both cases isn’t immediate; it requires patience, deliberate planning, and constant care to cultivate a living ecosystem.&lt;/p&gt;</description></item><item><title>Programming Language with no Syntax?</title><link>https://javapro-en.svenruppert.com/programming-language-with-no-syntax/</link><pubDate>Sun, 15 Sep 2024 23:44:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/programming-language-with-no-syntax/</guid><description>&lt;p&gt;1. Introduction&lt;br&gt;
Is it possible to have a programming language that has no syntax? It sounds like a contradiction. Programming languages are all about syntax, plus a bit of code generation, optimization, run-time environment, and so on. But syntax is the most important part as far as programmers are concerned. When encountering a new programming language, it takes time to learn the syntax.&lt;br&gt;
&lt;br&gt;
Could we just make the syntax disappear or at least make it as simple as possible? Could we also make the syntax arbitrary so that the programmer writing the code can define it for themselves?&lt;br&gt;
&lt;br&gt;
Ouroboros is a programming language that tries to do just that. It has the simplest syntax ever. It is so simple that it does not even have a syntax analyzer. All it has is a lexical analyzer, which is 20 lines long.&lt;br&gt;
&lt;br&gt;
At the same time, you can write complex programs and even expressions with parentheses and operators of different precedence, assuming you write your own syntax for that in the program. That way, no syntax also means any syntax.&lt;br&gt;
&lt;br&gt;
This article is an introduction to Ouroboros, a programming language with no syntax. It is a toy, never meant to be used in production, but it is a fun toy to play with, especially if you have ever wanted to create your own programming language.&lt;br&gt;
&lt;br&gt;
There were programming languages with minimal syntax. One of the very first languages was LISP, which used only parentheses to group statements as lists.&lt;br&gt;
&lt;br&gt;
If you are familiar with TCL, you may remember how simple the language is. However, it still defines complex expressions and control structures as part of the language.&lt;br&gt;
&lt;br&gt;
Another simple language to mention is FORTH. It is a stack language. The syntax is minimal. You either put something on the stack or call a function that works with the values on the stack. FORTH was also famous for its minimal assembly core and for the fact that the rest of the compiler was written in FORTH itself.&lt;br&gt;
&lt;br&gt;
These languages inspired the design of Ouroboros. LISP is known for the simplest syntax. One might say that LISP has the simplest syntax of all programming languages, but it would be a mistake. True to its name, it uses parentheses to delimit lists, which can be either data or programming structures. As you may know, LISP stands for &amp;ldquo;Lots of Irritating Superfluous Parentheses.&amp;rdquo;&lt;br&gt;
&lt;br&gt;
Ouroboros does not do that. It inherits the use of { and } from TCL, but unlike LISP, you are forced to use them only where they are really needed.&lt;br&gt;
&lt;br&gt;
Ouroboros, although being an interpreted language, can compile itself. Well, not really compile, but you can define syntax for the language in the language itself. However, it is not like in the case of compilers where the compiler is written in the source language. One of the first compilers was the PASCAL compiler written by Niklaus Wirth in PASCAL. The C compiler was also written in C, and more and more language compilers are written in the language they compile.&lt;br&gt;
&lt;br&gt;
In the case of an interpreted language, it is a bit different. It is not a separate program that reads the source code and generates machine code. It is the executing code, the application program itself, that becomes part of the interpreter.&lt;br&gt;
&lt;br&gt;
That way, you cannot look at it and say: this code is not Ouroboros. Any code can be, depending on the syntax you define for it at the start of the code.&lt;br&gt;
&lt;br&gt;
2. The Name of the Game&lt;br&gt;
Before diving into what Ouroboros is, let’s talk about the name itself. Ouroboros coils around itself in an endless cycle of creation and recreation. The name &amp;ldquo;Ouroboros&amp;rdquo; is as multifaceted as the language itself, offering layers of meaning that reflect its unique nature and aspirations.&lt;br&gt;
&lt;br&gt;
2.1. The Eternal Cycle&lt;br&gt;
At its core, Ouroboros draws inspiration from the ancient symbol of a serpent consuming its own tail. This powerful image represents the cyclical nature of creation and destruction, perfectly encapsulating our language’s self-referential definition. Just as the serpent feeds upon itself to sustain its existence, Ouroboros the language is defined by its own constructs, creating a closed loop of logic and functionality.&lt;br&gt;
&lt;br&gt;
2.2. UR: The Essence of Simplicity&lt;br&gt;
Abbreviated as &amp;ldquo;UR,&amp;rdquo; Ouroboros embraces the concept of fundamental simplicity. In German, &amp;ldquo;Ur—&amp;rdquo; signifies something primordial, primitive, or in its most basic form. This perfectly encapsulates the design philosophy behind Ouroboros: a language stripped down to its absolute essentials.&lt;br&gt;
&lt;br&gt;
By pushing the simplification of syntax to the extreme, Ouroboros aims to be the &amp;ldquo;ur-language&amp;rdquo; of programming—a return to the most elemental form of computation. Like the basic building blocks of life or the fundamental particles of physics, Ouroboros provides a minimal set of primitives from which complex structures can emerge.&lt;br&gt;
&lt;br&gt;
This radical simplicity is not a limitation but a feature. It challenges programmers to think at the most fundamental level, fostering a deep understanding of computational processes. In Ouroboros, every construct is essential, every symbol significant. It’s programming distilled to its purest form.&lt;br&gt;
&lt;br&gt;
2.3. Our Shared Creation&lt;br&gt;
The name begins with &amp;ldquo;Our-,&amp;rdquo; emphasizing the collaborative nature of this language. Ouroboros is not just a tool but a shared endeavor that belongs to its community of developers and users. It’s a language crafted by us, for us, evolving through our collective efforts and insights.&lt;br&gt;
&lt;br&gt;
2.4. Hidden Treasures&lt;br&gt;
Delve deeper into the name, and you’ll uncover more linguistic gems:&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Oro&amp;rdquo; in many Romance languages means &amp;ldquo;gold&amp;rdquo; or &amp;ldquo;prayer.&amp;rdquo; Ouroboros can be seen as a golden thread of logic, or a prayer-like mantra of computational thought.&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Ob-&amp;rdquo; as a prefix often means &amp;ldquo;toward&amp;rdquo; or &amp;ldquo;about,&amp;rdquo; suggesting that Ouroboros is always oriented toward its own essence, constantly reflecting upon and refining itself.&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Boros&amp;rdquo; could be playfully interpreted as a variation of &amp;ldquo;bytes,&amp;rdquo; hinting at the language’s digital nature.&lt;br&gt;
&lt;br&gt;
Parsing the name as &amp;ldquo;our-ob-oros&amp;rdquo; reveals a delightful multilingual wordplay: &amp;ldquo;our way to the treasure.&amp;rdquo; This blend of English (&amp;ldquo;our&amp;rdquo;), Latin (&amp;ldquo;ob&amp;rdquo; meaning &amp;ldquo;towards&amp;rdquo;), and Greek (&amp;ldquo;oros,&amp;rdquo; which can be associated with &amp;ldquo;boundaries&amp;rdquo; or &amp;ldquo;definitions&amp;rdquo;) mirrors the language’s eclectic inspirations.&lt;br&gt;
&lt;br&gt;
Just as Ouroboros draws from the diverse traditions of TCL, LISP, and FORTH, its name weaves together linguistic elements from different cultures. This multilingual, multi-paradigm approach guides us toward the treasures of computation, defining new boundaries along the way, much like how TCL offers flexibility, LISP promotes expressiveness, and FORTH emphasizes simplicity and extensibility.&lt;br&gt;
&lt;br&gt;
2.5. A Name That Bites Back&lt;br&gt;
Ultimately, Ouroboros is a name that challenges you to think recursively, to see the end in the beginning and the whole in every part. It’s a linguistic puzzle that mirrors the very nature of the programming language it represents—complex, self-referential, and endlessly fascinating.&lt;br&gt;
&lt;br&gt;
As you embark on your journey with Ouroboros, remember that you’re not just writing code; you’re participating in an ancient cycle of creation, where every end is a new beginning, and every line of code feeds into the greater whole of computational possibility.&lt;br&gt;
&lt;br&gt;
3. What is Ouroboros&lt;br&gt;
Ouroboros is a programming language that has no syntax. I have already said that, and now comes the moment of truth: it is a &amp;ldquo;lie.&amp;rdquo; There is no programming language with absolutely no syntax. UR has a syntax, and it is defined with this sentence:&lt;br&gt;
&lt;br&gt;
You write the lexical elements of the language one after the other.&lt;br&gt;
&lt;br&gt;
3.1. Syntax&lt;br&gt;
That is all.&lt;br&gt;
&lt;br&gt;
When the interpreter starts to execute the code, it begins reading the lexical elements one after the other. It reads as many elements as it needs to execute some code and not more. To be specific, it reads exactly one lexical element before starting execution. When the execution triggered by the element is finished, it goes on reading the next element.&lt;br&gt;
&lt;br&gt;
The execution itself can trigger more reads if the command needs more elements. We will see it in the next example soon.&lt;br&gt;
&lt;br&gt;
A lexical element can be a number, a string, a symbol, or a word. Symbols and words can and should have an associated command to execute.&lt;br&gt;
&lt;br&gt;
For example, the command puts is borrowed shamelessly from TCL and is associated with the command that prints out a string.&lt;br&gt;
&lt;br&gt;
puts &amp;ldquo;Hello, World!&amp;rdquo;&lt;br&gt;
It is the simplest program in Ouroboros. When the command behind puts starts to execute, it asks the interpreter to read the next element and evaluate it. In this example, it is a constant string, so it is not difficult to calculate. The value of a constant string is the string itself.&lt;br&gt;
&lt;br&gt;
The next example is a bit more complex:&lt;br&gt;
&lt;br&gt;
puts add &amp;ldquo;Hello, &amp;quot; &amp;ldquo;World!&amp;rdquo;&lt;br&gt;
In this case, the argument to the command puts is another command: add. When puts asks the interpreter to get its argument, the interpreter reads the next element and then starts to execute. As add starts to execute, it needs two arguments, which it asks from the interpreter. Since these arguments are strings, add concatenates them and returns the result.&lt;br&gt;
&lt;br&gt;
3.2. Blocks&lt;br&gt;
There is a special command denoted by the symbol {. The lexical analyzer recognizing this character will ask the interpreter to read the following elements until it finds the closing }. This call is recursive in nature if there are embedded blocks.&lt;br&gt;
&lt;br&gt;
The resulting command is a block command. A block command executes all the commands in it and results in the last result of the commands in the block.&lt;br&gt;
&lt;br&gt;
puts add {&amp;ldquo;Hello, &amp;quot; &amp;ldquo;World!&amp;rdquo;}&lt;br&gt;
If we close the two strings into a block, then the output will be a single World! without the `Hello, `. The block &amp;ldquo;executes&amp;rdquo; both strings, but the value of the block is only the second string.&lt;br&gt;
&lt;br&gt;
3.3. Commands&lt;br&gt;
The commands implemented are documented in the readme of the project on GitHub. The actual set of commands is not fascinating. Every language has a set of commands.&lt;br&gt;
&lt;br&gt;
The fascinating part is that in UR there is no difference between functions and commands. Are puts or add commands or functions? How about if and while? They are all commands, and they are not part of the language per se. They are part of the implementation.&lt;br&gt;
&lt;br&gt;
The command if asks the interpreter to fetch one argument, evaluated. It will use this as the condition. After this, it will fetch the next two elements without evaluation. Based on the boolean interpretation of the condition, it will ask the interpreter to evaluate one of the two arguments.&lt;br&gt;
&lt;br&gt;
Similarly, the command while will fetch two arguments without evaluation. It then evaluates the first as a condition, and if it is true, it will evaluate the second and then go back to the condition. It fetched the condition unevaluated because it will need to evaluate it again and again. In the case of the if command, the condition is evaluated only once, so we did not need a reference to the unevaluated version.&lt;br&gt;
&lt;br&gt;
Many commands use the unevaluated version of the arguments. This use makes it possible to use the &amp;ldquo;binary&amp;rdquo; operators as multi-argument operators. If you want to add up three numbers, you can write add add 1 2 3, or add* 1 2 3 {}, or {add* 1 2 3}. The command add fetches the first argument unevaluated and sees if it is a *. If it is *, then it will fetch the arguments until it encounters the end of the arguments or an empty block.&lt;br&gt;
&lt;br&gt;
This is a little syntactic sugar, which should be peculiar in the case of a language that has no syntax. It really is there to make the experiment and the playing with the language bearable. On the other side, it erodes the purity of the language. It is also only a technical detail, and I mention it only because we will need to understand it when we discuss the metamorphic nature of the language. It will be needed to understand the use of the first example there.&lt;br&gt;
&lt;br&gt;
3.4. Variables&lt;br&gt;
UR supports variables. Variables are strings with values associated with them. The value can be any object.&lt;br&gt;
&lt;br&gt;
When the interpreter sees a symbol or a bare word (identifier) to evaluate, it will check the value associated with it. If the value is a command, then it will execute the command. In other cases, it will return the value.&lt;br&gt;
&lt;br&gt;
The variables are scoped. If you set a variable in a block, then the variable is visible only in that block. If there are variables with the same name in the parent block, then the variable in the child block will shadow the variable in the parent block.&lt;br&gt;
&lt;br&gt;
Variable handling and scoping are implementation details and not strictly part of the language.&lt;br&gt;
&lt;br&gt;
The implementation as it is now supports boolean, long, double, big integer, big decimal, and string primitive values. It also supports lists and objects.&lt;br&gt;
&lt;br&gt;
A list is a list of values, and it can be created with the list command. The argument to the command is a block. The command list will ask the interpreter to fetch the argument unevaluated. Afterward, it evaluates the block from the start the same way as the block command does. However, instead of throwing away the resulting values and returning the last one, it returns a list of the results.&lt;br&gt;
&lt;br&gt;
An object is a map of values. It can be created with the object command. The argument to the command is the parent object. The fields of the parent object are copied to the new object.&lt;br&gt;
&lt;br&gt;
Objects also have methods. They are the fields that have a command as a value.&lt;br&gt;
&lt;br&gt;
4. Introspection&lt;br&gt;
The interpreter is open like a cracked safe after a heist. Nothing is hard-wired into the language. When I wrote that the language interpreter recognizes bare words, symbols, strings, etc., it was only true for the initial setup. The lexical analyzers implemented are UR commands, and they can be redefined. They are associated with the names $keyword, $string, $number, $space, $block, $blockClose, and $symbol. The interpreter uses the variable structures to find these commands. There is another variable named $lex that is a list of the lexical analyzers.&lt;br&gt;
&lt;br&gt;
The interpreter uses this list when it needs to read the next lexical element. It invokes the first, then the second, and so on until one of them returns a non-null value, a lexical element, which is a command.&lt;br&gt;
&lt;br&gt;
If you modify this list, then you can change the lexical analyzers, and that way you can change the syntax of the language.&lt;br&gt;
&lt;br&gt;
The simplest example is changing the interpretation of the end-of-line character.&lt;br&gt;
&lt;br&gt;
You may remember that we can use the binary operators using multiple arguments terminated with an empty block. It would be nice if we could omit the block and just write add* 1 2 3 simply adding a new-line at the end. We can do that by changing the lexical analyzer that recognizes the end-of-line character, and this is exactly what we are going to do in this example.&lt;br&gt;
&lt;br&gt;
set q add* 3 2&lt;br&gt;
1 {} puts q&lt;br&gt;
insert $lex 0 &amp;lsquo;{&lt;br&gt;
if { eq at source 0 &amp;ldquo;\n&amp;rdquo;}&lt;br&gt;
{sets substring 1 length source source &amp;lsquo;{}}}&lt;br&gt;
set q add* 3 2&lt;br&gt;
1 {} puts q&lt;br&gt;
We insert a new lexical analyzer at the beginning of the list. If the very first character of the current state of the source code is a new-line character, then the lexical analyzer eats this character and returns an empty block.&lt;br&gt;
&lt;br&gt;
The command source returns the source code that was not parsed by the interpreter yet. The command sets sets the source code to the string value specified.&lt;br&gt;
&lt;br&gt;
The first puts q will print 6 because at the time of the first calculation, new-lines are just ignored, and that way the value of q is add* 3 2 1 {}. The second puts q will print 5 because the new-line is eaten by the lexical analyzer, and the value of q is add* 3 2 {}. Here, the closing {} was the result of the lexical analysis of the new-line character. The values 1 and {} on the next line are calculated, but they do not have any effect.&lt;br&gt;
&lt;br&gt;
This is a very simple example. If you want to see something more complex, the project file src/test/resources/samples/xpression.ur contains a script that defines a numerical expression parser.&lt;br&gt;
&lt;br&gt;
There is a special command called fixup. This command forces the interpreter to parse the rest of the source. After this point, the lexical analyzers are not used anymore.&lt;br&gt;
&lt;br&gt;
Executing this command does not give any performance benefit, and that is not the purpose. It is more like a declaration that all the codes that are part of the source code introspection and the metamorphic calculation are done. A special implementation of the command can also take the parsed code and generate an executable, turning the interpreter into a compiler.&lt;br&gt;
&lt;br&gt;
5. Technical Considerations&lt;br&gt;
The current version is implemented in Java. Ouroboros is not a JVM language, though. We do not compile the code to Java byte-code. The Java code interprets the source and executes it.&lt;br&gt;
&lt;br&gt;
The implementation is an MVP focusing on the metamorphic nature of the language. It is meant to be an experiment. This is the reason why there are no file, network, and other I/O operations except the single puts command that writes to the standard output.&lt;br&gt;
&lt;br&gt;
The Java service loader feature is used to load the commands and to register them with their respective names in the interpreter. It means that implementing extra commands is as simple as creating them, writing a class implementing a ContextAgent to register them (see the source code), and putting them on the classpath.&lt;br&gt;
&lt;br&gt;
The whole code is open-source and available on GitHub. It is licensed under the Apache License 2.0 (see the license file in the repo). It is exactly 100 classes at the time of writing this article. It means that the source code is simple, short, and easy to understand. If you need some straightforward scripting language in your application, you can use it. It was not meant to be for production, though.&lt;br&gt;
&lt;br&gt;
6. Going Further&lt;br&gt;
There is no plan currently to extend the language and include more commands. We only plan to create more metamorphic code in the language. The reason for that is that we do not see the language as a practical tool as of today. If it proves to be useful and gains a user base and utilization, we certainly will incorporate more commands to support I/O, file handling, networking, and so on.&lt;br&gt;
&lt;br&gt;
We also have visions of implementing the interpreter in other languages, like in Rust and Go. Anyone suggesting or wanting to develop commands for better usability or adding features is welcome. It can be a parallel project, or it can be merged into the main project if that makes sense.&lt;br&gt;
&lt;br&gt;
7. Conclusion&lt;br&gt;
In exploring Ouroboros, we delved into the concept of a programming language that minimizes syntax to the point of almost non-existence. This radical approach challenges the conventional understanding of what a programming language should be, presenting a system where syntax is both absent and infinitely customizable. By drawing inspiration from languages like LISP, TCL, and FORTH, Ouroboros embodies simplicity and introspection, allowing programmers to define their syntax and commands within the language itself.&lt;br&gt;
&lt;br&gt;
While Ouroboros is not designed for practical production use, it serves as an intriguing experiment in language design and metaprogramming. Its self-referential nature and minimalistic design offer a playground for developers interested in the fundamentals of computation, syntax design, and language interpretation. Whether it evolves into a more robust tool or remains a fascinating intellectual exercise, Ouroboros pushes the boundaries of how we think about programming languages, inviting us to consider the possibility of a language where syntax is as mutable and recursive as the Ouroboros serpent itself.&lt;/p&gt;</description></item><item><title>the Wild Frontier of Technology adoption</title><link>https://javapro-en.svenruppert.com/the-wild-frontier-of-technology-adoption/</link><pubDate>Tue, 13 Aug 2024 09:55:32 +0000</pubDate><guid>https://javapro-en.svenruppert.com/the-wild-frontier-of-technology-adoption/</guid><description>&lt;p&gt;Being out of work and looking for new opportunities means interviews. A common thread that comes up is arm waving. &amp;ldquo;There are 25 million developers out there, we want you to make them use our product/api/service&amp;rdquo;. Coupled with this idea is the expectation that if only they could get the offering in front of a developer if only that developer would try it, then all would be well and money would pour in.&lt;/p&gt;</description></item></channel></rss>