<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Stefano Turri]]></title><description><![CDATA[My Travel diary on Application Development and Cloud Technologies plus History, Hiking, Climbing, and Mountain Biking ]]></description><link>https://www.stefanoturri.com/</link><image><url>https://www.stefanoturri.com/favicon.png</url><title>Stefano Turri</title><link>https://www.stefanoturri.com/</link></image><generator>Ghost 4.21</generator><lastBuildDate>Mon, 25 May 2026 18:10:10 GMT</lastBuildDate><atom:link href="https://www.stefanoturri.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Climbing lessons for IT: Testing as safety anchor]]></title><description><![CDATA[This article delves into risk management, drawing parallels between climbing protection systems and IT testing methods. Ultimately, the goal is to maximize risk reduction benefits while minimizing associated costs and efforts, skillfully combing different types of Climbing Anchors or Tests.]]></description><link>https://www.stefanoturri.com/climbing-lessons-testing-as-safety-anchors/</link><guid isPermaLink="false">641d7a1120fd5a0bb5239ff5</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Wed, 05 Mar 2025 14:58:25 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2025/03/overTheQuickdraw3-1.JPG" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2025/03/overTheQuickdraw3-1.JPG" alt="Climbing lessons for IT: Testing as safety anchor"><p>In this article, I intend to delve deeper into the topic of risk management, which I have previously touched upon in this prior piece:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://www.stefanoturri.com/climbing-lessons-risk-management/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Lessons from Climbing: Handling Risks</div><div class="kg-bookmark-description">Handling risks is key both in IT projects and climbing. Using the climbing approach of identifying two types of risks: objective and subjective, I draw some parallels with IT and emphasize the importance of Agility, continuous feedback, and an iterative approach to development and Unit Testing.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://www.stefanoturri.com/favicon.png" alt="Climbing lessons for IT: Testing as safety anchor"><span class="kg-bookmark-author">Stefano Turri</span><span class="kg-bookmark-publisher">Stefano Turri</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://www.stefanoturri.com/content/images/2023/10/IT-Avalanche.jpg" alt="Climbing lessons for IT: Testing as safety anchor"></div></a></figure><p>I will focus on drawing parallels between <strong>climbing protection systems</strong> and various methodologies employed in <strong>Information Technology (IT) testing</strong>. This comparative analysis aims to shed light on two crucial yet distinct aspects of effective risk management:</p><ol><li><strong>Depth</strong> represents mastery of the tools and techniques used to manage risks. Just as a seasoned climber must thoroughly understand the function, strengths, and limitations of each piece of climbing protection gear, individuals tasked with IT Testing need to master the tools and techniques available to them. This depth of understanding ensures that you can deploy these tools effectively and efficiently to mitigate risks.</li><li><strong>Width:</strong> This emphasizes the importance of using a variety of tools suitable for the specific context or situation at hand. For instance, a climber will use <a href="https://en.wikipedia.org/wiki/Anchor_(climbing)">different kinds of anchors for Trad, Sport, or Ice Climbing routes</a>; similarly, an IT professional would use a combination of Testing approaches that best fit the project context.</li></ol><p>Lastly, the goal is to integrate these two dimensions cohesively, creating a seamless approach to Testing. Much like a skilled climber relies on basic tools such as the climbing rope, carabiners, and harness to use the different types of anchors, the IT Professional will combine multiple Test types into seamless DevOps pipelines.</p><h3 id="depth-dimensions-unit-testing-example">Depth dimensions: Unit testing example</h3><p>To illustrate the depth dimension in risk management, let&apos;s examine the fundamental case of Unit Testing, drawing a parallel with Sport Climbing on routes safeguarded by fixed bolts. Here, each test is likened to a bolt anchor capable of arresting a fall, thereby preventing adverse outcomes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2025/03/image.png" class="kg-image" alt="Climbing lessons for IT: Testing as safety anchor" loading="lazy" width="988" height="884" srcset="https://www.stefanoturri.com/content/images/size/w600/2025/03/image.png 600w, https://www.stefanoturri.com/content/images/2025/03/image.png 988w" sizes="(min-width: 720px) 720px"><figcaption>Unit test compared to climbing <a href="https://less.works/less/technical-excellence/unit-testing">LeSS</a> Agile method</figcaption></figure><p>Both approaches offer significant advantages by minimizing risks, thereby facilitating superior results. In climbing, they enable more challenging ascents and the creation of tougher routes. In IT project delivery, they enhance speed, quality, and predictability. However, expertise and training are essential for safe utilization and awareness of residual risks. &#xA0; For example:</p><ul><li><strong>Back Clipping</strong>: &#xA0; A dangerous mistake that is too common among beginner climbers is to clip the rope so that it travels from the outside into the cliff. &#xA0;In a fall, the rope can cause the carabiner gate to open and unclip from the carabiner, leading to longer and more dangerous falls. Analogously, in Unit Testing, <strong>incorrect assertions</strong> that remain valid even in error conditions render tests ineffective during failure scenarios. &quot;Make it fail, Make it pass,&quot; a technique in Test-Driven Development, helps mitigate this issue.</li><li><strong>Z-clipping: </strong>closely spaced bolts are misused (e.g., clipped in the wrong order), leading to rope drag that could impede or cause a climber&apos;s fall. Likewise, unit tests with <strong>superfluous or concealed dependencies</strong> may slow down or halt test execution entirely.</li><li><strong>Rusted Bolts: </strong>These climbing anchors, left in the rock and exposed to varying weather conditions, gradually deteriorate, losing strength, and need to be evaluated critically by the climber when used. Similarly, <strong>older tests</strong> may become obsolete, continuing to assess irrelevant code elements or failing to update to newer testing framework versions, thus missing out on advanced features and improvements. </li></ul><p>Improving the depth dimension also implies a <a href="https://www.stefanoturri.com/lessons-from-climbing-growth-mindset/">Growth Mindset</a> approach for continuously learning and adopting new tools and techniques, such as new Belay devices in climbing (e.g., Petzl recently release a new device, the Neox, that while similar to the widely used GriGri 2, has some different features and need specific training to be used correctly for safety ). In IT testing, the same learning approach applies to adopt new testing tools that might also rely on innovative Gen AI approaches.</p><h3 id="width-dimension-beyond-unit-testing">Width dimension: Beyond Unit testing</h3><p>To illustrate the width dimension in risk management, let&apos;s go beyond sport climbing and look at other contexts.</p><p>When climbing traditional routes (<strong>Trad Climbing or BigWalls</strong>) with no pre-placed fixed bolts in place, &#xA0;alternative anchors such as Pitons, Nuts, and Friends are used instead. These require specific and more complex skills for the placement and evaluation of the residual risks, making this a specialized premium skill.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2025/03/trad-climbing-gear.webp" class="kg-image" alt="Climbing lessons for IT: Testing as safety anchor" loading="lazy" width="2000" height="754" srcset="https://www.stefanoturri.com/content/images/size/w600/2025/03/trad-climbing-gear.webp 600w, https://www.stefanoturri.com/content/images/size/w1000/2025/03/trad-climbing-gear.webp 1000w, https://www.stefanoturri.com/content/images/size/w1600/2025/03/trad-climbing-gear.webp 1600w, https://www.stefanoturri.com/content/images/2025/03/trad-climbing-gear.webp 2048w" sizes="(min-width: 720px) 720px"><figcaption>Trad Climbing safety equipment</figcaption></figure><p>Ice Climbing, typically done in winter on waterfalls or steep mountain couloirs, is yet another context with additional equipment and skills. Here placing an ice screw for safety requires specific strength, technique and knowledge of ice quality to minimize the risks. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2025/03/placingIceScrew.webp" class="kg-image" alt="Climbing lessons for IT: Testing as safety anchor" loading="lazy" width="950" height="950" srcset="https://www.stefanoturri.com/content/images/size/w600/2025/03/placingIceScrew.webp 600w, https://www.stefanoturri.com/content/images/2025/03/placingIceScrew.webp 950w" sizes="(min-width: 720px) 720px"><figcaption>Placing an Ice Screw - yet another context specific skills</figcaption></figure><p>Other types of climbing, such as Sport Climbing, are more competitive in nature and focus on performances. Even here, specific safety measures are used, like automated top-rope automated belaying devices officially used in Speed Climbing Events (that have become more popular with the latest Tokyo and Paris Olympics).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2025/03/speedClimbing-1.jpg" class="kg-image" alt="Climbing lessons for IT: Testing as safety anchor" loading="lazy" width="1280" height="1106" srcset="https://www.stefanoturri.com/content/images/size/w600/2025/03/speedClimbing-1.jpg 600w, https://www.stefanoturri.com/content/images/size/w1000/2025/03/speedClimbing-1.jpg 1000w, https://www.stefanoturri.com/content/images/2025/03/speedClimbing-1.jpg 1280w" sizes="(min-width: 720px) 720px"><figcaption>The performance focus of Speed Climbing requires usage of Automated Belay Devices</figcaption></figure><p>Similarly, when testing IT Projects, a variety of testing techniques can be used, each one providing benefits in different contexts and requiring specific tools and skills. As an example, refer to the following article that categorizes the many kinds of possible software testing strategies:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://stratoflow.com/types-of-software-testing/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">21 Types of Software Testing Every Engineer Should Know</div><div class="kg-bookmark-description">Explore 21 crucial software testing types for engineers to achieve better results. Boost quality and reliability through comprehensive testing techniques.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://stratoflow.com/wp-content/themes/stratoflow/images/favicon/favicon-196x196.png" alt="Climbing lessons for IT: Testing as safety anchor"><span class="kg-bookmark-author">Stratoflow</span><span class="kg-bookmark-publisher">Arkadiusz Krysik</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://stratoflow.com/wp-content/uploads/2023/06/How-to-speed-up-software-development-4.png" alt="Climbing lessons for IT: Testing as safety anchor"></div></a></figure><p>To effectively navigate between the many types of possible tests, I suggest focusing on the three following axis of evaluation.</p><p>The first axis is the type of <strong>Requirements </strong>that are being tested. Typically, these are split into:</p><ul><li><strong>Functional: </strong>Related to the functional behavior of the application, such as service calls, business logic, processes, and UI navigation.</li><li><strong>Non-Functional</strong>: Related to quality features of the solution, such as performance (response times, traffic load), scalability, resilience (failover and disaster recovery), and security</li></ul><p>Another important axis is the <strong>Scope </strong>of the tests. The scope can range from a single method or function to an entire component for a <strong>unit </strong>test, to a set of related interconnected components for an <strong>integration </strong>test, up to an entire system for <strong>end-to-end</strong> testing.</p><p>As the third axis, I would evaluate the trade-offs between test repeatability (for test regression purpose) and test creation and maintenance cost. The following spectrum of tests is typical: </p><ul><li><strong>Manual </strong>tests require the least amount of development effort but are slow and potentially not consistently repeatable</li><li><strong>Automated</strong> tests that need to be developed and maintained but can provide a fast way to execute a large number of repeatable tests concurrently in a short amount of time</li><li><strong>Continuous</strong> tests are executed at each compilation, build, or deployment. These tests are even more complex and expensive because they need to be optimized to not slow down the software development lifecycle, but in exchange, they can be executed frequently to further accelerate the finding and resolution of problems. </li></ul><h3 id="combining-the-approaches-the-swiss-cheese-principle">Combining the approaches: The &quot;Swiss Cheese&quot; principle</h3><p>The width and depth approaches can (<strong>and should!</strong>) be combined to create the most effective solution to the problem at hand. A good way to describe this approach is the <strong>Swiss Cheese Model, </strong>a risk management and safety concept that offers a visual representation of how multiple, independent layers of defense must fail simultaneously to result in an accident. Each layer, depicted as a slice of Swiss cheese, has its own specific vulnerabilities or weaknesses, symbolized by holes in the cheese. When the holes align, they create a pathway for the hazard to penetrate all defenses, leading to an incident. The model emphasizes the importance of redundancy to better prevent and identify problems.</p><figure class="kg-card kg-image-card"><img src="https://www.stefanoturri.com/content/images/2025/02/Swiss_cheese_model_textless.svg" class="kg-image" alt="Climbing lessons for IT: Testing as safety anchor" loading="lazy" width="788" height="289"></figure><p>Yet again, we can compare the security approach in climbing with IT Testing:</p><ul><li>Redundancy is used by having multiple anchors when needed (e.g., a Bolt every few meters or using a redundant double placement of Friend or Nuts in a sketchy situation), while an IT Project might increase the number of tests in specific test suites.</li><li>Mixing anchor types whenever applicable: A sport route might have a section of crack climbing that can be better protected with additional Trad equipment, or a mixed Ice Route might have a rock climbing section that is protected with fixed bolts. Similarly, an IT project uses a mix of test types &#xA0;and strategies (Functional vs Non-Functional, Unit vs End-to-End, Manual vs Automated) to minimize the overall risk</li></ul><h2 id="conclusion">Conclusion</h2><p>The overall goal in both scenarios is maximizing the benefits of risk reduction while minimizing the cost and effort to achieve this.</p><p>In both scenarios, we need to combine everything to work seamlessly together:</p><ul><li>In <strong>Climbing, </strong>we rely on the basic skills for using standard equipment such as ropes and harnesses</li><li>In <strong>Software Development and Testing</strong>, the DevOps approach provides a way to handle the end-to-end strategy</li></ul><p>I hope that this in-depth comparison provides (in a lightweight and funny way) some useful thinking points, even if not 100% accurate and precise.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Automating Observability of Complex Systems with GenAI]]></title><description><![CDATA[Large cloud and microservices solutions are challenging due to their dynamic and distributed nature. A holistic observability platform, integrated into DevOps and augmented by GenAI, can help to handle the operational and security challenges introduced by the EU’s CRA and the USA's CISA regulations.]]></description><link>https://www.stefanoturri.com/automating-observability-of-complex-systems-wit/</link><guid isPermaLink="false">678a2f8020fd5a0bb523b44e</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Wed, 29 Jan 2025 15:37:47 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2025/01/mazeBanner.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2025/01/mazeBanner.jpg" alt="Automating Observability of Complex Systems with GenAI"><p>Observability in managing large complex systems based on cloud and microservices can be challenging due to the dynamic and distributed nature of these systems. The traditional approach to CMDB (Configuration Management Database) which focuses on a slow-changing picture of IT infrastructure based on physical assets is not suitable for modern, continuously changing systems based on cloud and microservices. This is because these systems are highly dynamic and distributed, with numerous components that can be added, removed, or updated at any time. Therefore, it is difficult to keep track of the state of the system at any given point in time.</p><p>However, the challenge extends beyond simply having visibility into the underlying infrastructure. It also encompasses understanding how the application components are linked and utilizing that infrastructure. Without this holistic view, it can be difficult to identify and diagnose issues that may be impacting multiple components or services. Additionally, it can be challenging to optimize performance and ensure reliability without a clear understanding of how the application components are utilizing the infrastructure.</p><p>Another challenge is the sheer volume of potential data generated by these systems. With numerous components and services, there can be a large volume of code, documentation, reports, logs, metrics, and traces to sift through. Without the right tools and processes in place, it can be difficult to extract meaningful insights from this data. This can make it impossible or lead to delays in preventing, identifying, and resolving issues, which can impact the overall performance and reliability of the system.</p><h3 id="solving-the-data-collection-problem">Solving the Data Collection problem</h3><p>Industry or de facto standards in collecting metrics and data on IT systems provide a way to solve the data collection problem from multiple heterogeneous sources by establishing a common format and methodology for data collection, making it easier to aggregate and analyze data from different sources. These standards can include data formats, data collection methods, and data transmission protocols.</p><p>Examples of data-collecting standards include:</p><ul><li><strong>Security CVE</strong> (Common Vulnerabilities and Exposures) which provides a dictionary of standardized names for vulnerabilities and security exposures</li><li><strong>Static source code scans </strong>(such as Sonarqube) provide a standard way to analyze and report on potential security issues in source code</li><li><strong>Application Logs</strong>, which provides a standard format for logging application events and errors</li><li><strong>Telemetry data </strong>such as Open Telemetry, which provides a standard way to collect and transmit data about application performance and behavior</li><li><strong>Monitoring data</strong> from APM (Application Performance Management) systems, which provide a standard way to monitor and report on application performance metrics</li><li><strong>Infrastructure and networking </strong>information, which can be collected using standards like SNMP (Simple Network Management Protocol) and NetFlow.</li></ul><p>Standardization in data collection is being pushed by regulations like the EU Cyber Resiliency Act (CRA) or by the USA&apos;s Cybersecurity and Infrastructure Security Agency (CISA). These regulations aim to improve the visibility of the digital supply chain through an SBOM (Software Bill of Materials) approach, which requires the disclosure of all software components used in a system, including their dependencies and known vulnerabilities. This approach can help organizations better understand the risks associated with their software supply chain and take necessary steps to mitigate those risks.</p><h3 id="structuring-semantic-relationships">Structuring Semantic Relationships</h3><p>A Hub and Spoke platform leveraging the data collection approach described earlier can provide a powerful solution for visualizing and understanding the state of IT infrastructure, applications, and operations. By using the semi-structured information provided by SBOMs and other input data, the platform can correlate and organize information creating a complex graph of relationships that can be utilized and analyzed using semantic web principles and techniques. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2025/01/image.png" class="kg-image" alt="Automating Observability of Complex Systems with GenAI" loading="lazy" width="1000" height="539" srcset="https://www.stefanoturri.com/content/images/size/w600/2025/01/image.png 600w, https://www.stefanoturri.com/content/images/2025/01/image.png 1000w" sizes="(min-width: 720px) 720px"><figcaption>Displaying and navigating system structure graph (based on <strong><a href="https://www.ibm.com/products/concert?utm_content=SRCWW&amp;p1=Search&amp;p4=43700081258826037&amp;p5=e&amp;p9=58700008825622160&amp;gad_source=1&amp;gclid=Cj0KCQiAwOe8BhCCARIsAGKeD54QqxGnjDC3stmK7wwOol6loPKWwBWNA9v4zNme1sMDKdXPiT-J9TkaAnsPEALw_wcB&amp;gclsrc=aw.ds">IBM Concert</a></strong>)</figcaption></figure><p>This approach can enable the platform to build an end-to-end view of the IT landscape, from network and infrastructure to application code. &#xA0;Specific use cases can be tailored to be useful at multiple levels of the IT hierarchy, from operatives to managers and executives, by applying different analysis lenses (e.g. Security vs Resiliency vs Compliance focus) on the common data that can help organizations make informed decisions, optimize performance, and ensure reliability.</p><h3 id="leveraging-genai-for-insight-generation">Leveraging GenAI for Insight Generation</h3><p>A centralized data platform can serve as an ideal environment for integrating Generative Artificial Intelligence (Gen AI) due to several reasons, particularly in terms of summarization, trend extraction, and action proposal. Here&apos;s why:</p><ul><li><strong>Unified Data Access</strong>: A centralized platform provides a single source of truth, allowing Gen AI to access all relevant data in one place. This holistic view helps the AI in generating more accurate summaries and trend analyses, as it doesn&apos;t miss any vital data points scattered across different systems.</li><li><strong>Data Quality and Security</strong>: The data collection integration process comes with data format standardization, quality checks, and robust security measures for sensitive data. Gen AI, operating in this context, can achieve better quality and guarantee privacy while performing its tasks. </li><li><strong>Efficient Processing</strong>: By having all data in one place, the computational efficiency of the Gen AI is significantly increased. It can process and analyze data faster, leading to quicker generation of summaries and trend detection.</li><li><strong>Customized Analysis</strong>: Applying multiple analysis lenses, smaller, tailored models like <a href="https://www.ibm.com/granite?utm_content=SRCWW&amp;p1=Search&amp;p4=43700081249056019&amp;p5=e&amp;p9=58700008827051892&amp;gad_source=1&amp;gclid=Cj0KCQiAwOe8BhCCARIsAGKeD55jCiLoPEtRWU5lGrMEGTtcsgjYU-XkURu430jzA7hdDQWbGHgTHcAaApcZEALw_wcB&amp;gclsrc=aw.ds">Granite </a>can be trained to focus on specific areas of analysis. This specialization allows for more precise summarization and identification of trends in those specific domains.</li><li><strong>Enhanced Decision Making</strong>: The AI, after understanding the data trends, can propose actionable insights. It can suggest strategies based on historical data, predict future outcomes, and recommend preventive or corrective measures, thereby aiding in better decision-making processes.</li><li><strong>Automating Audit Trails and Compliance</strong>: Centralized platforms maintain comprehensive audit trails, which is crucial for regulatory compliance. Every action taken by the Gen AI can be tracked and reviewed, ensuring transparency and accountability.</li></ul><p>In essence, integrating Gen AI into a centralized data platform provides a conducive environment for efficient, secure, and accurate data analysis, paving the way for informed decision-making and strategic planning.</p><h3 id="devops-as-a-key-tool-to-achieve-an-application-cmdb">DevOps as a key tool to achieve an application CMDB</h3><p>To make this approach effective, the key element is a seamless integration into the DevOps chain, that provides key aspects to facilitate the creation of an application-aligned Configuration Management Database (CMDB):</p><ul><li><strong>Data Quality Assurance</strong>: Incoming data is standardized and validated before entering the system.</li><li><strong>Real-time Data Processing, </strong>since in a cloud-native environment, data is generated at an unprecedented rate. </li><li><strong>Automated Configuration Management</strong>: An application-aligned CMDB with accurate, up-to-date information about the components in your IT environment and their relationships can trigger automated remediation actions, positively contributing to the DevOps loop. </li></ul><p>Weaving Gen AI into the DevOps chain observability platforms (e.g. such as <a href="https://www.ibm.com/products/concert?utm_content=SRCWW&amp;p1=Search&amp;p4=43700081258826037&amp;p5=e&amp;p9=58700008825622160&amp;gad_source=1&amp;gclid=Cj0KCQiAwOe8BhCCARIsAGKeD56CtF4zh8KSmuA2oTFDeewbReWhR98TZCQbrYoT-COu8ZIe3i2_maAaAkIcEALw_wcB&amp;gclsrc=aw.ds">IBM Concert</a> ) enable organizations to effectively manage the complexity and speed of cloud-native development and operations.</p>]]></content:encoded></item><item><title><![CDATA[Climbing lessons for IT: Consultants and Mountain Guides]]></title><description><![CDATA[A lightweight comparison between IT consultants and mountain guides, highlighting their shared challenges and roles. Both navigate complex terrain, guiding clients through unfamiliar activities, and discussing risk management, trust, and approach.]]></description><link>https://www.stefanoturri.com/climbing-lessons-for-it-consultants-and-mountain-guides/</link><guid isPermaLink="false">641d7cd820fd5a0bb523a016</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Fri, 02 Aug 2024 17:40:25 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2024/08/Guide2.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2024/08/Guide2.png" alt="Climbing lessons for IT: Consultants and Mountain Guides"><p></p><p>As summer vacation approaches, I&apos;ve been dedicating more time to training in the evening at the climbing gym to prepare for some climbing routes over the summer. A couple of days ago, as I took a break between attempts at a boulder problem, I did find myself engaged in conversations with fellow climbers about the importance of finding reliable and trustworthy professionals, such as doctors, lawyers, and accountants, who can help us navigate the complexities of our personal and professional lives. </p><p>Because of this, I began to think about the similarities between IT consultants and mountain guides. Both are hired to navigate complex and treacherous terrain, guiding their clients through unfamiliar and potentially hazardous activities. Whether it&apos;s developing a new system or integrating disparate technologies, IT consultants must be able to anticipate and mitigate risks, just like a mountain guide must assess the risks and challenges of a climbing route.</p><p>In this article, I aim to explore the parallels between IT consultants and mountain guides, drawing inspiration and insights from this unique comparison. While we can learn something from this comparison, I must confess that the primary motivation is simply to have fun and explore the fascinating world of IT consulting and mountain guiding.</p><h2 id="project-context">Project Context</h2><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/08/image.png" class="kg-image" alt="Climbing lessons for IT: Consultants and Mountain Guides" loading="lazy" width="1272" height="1799" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/08/image.png 600w, https://www.stefanoturri.com/content/images/size/w1000/2024/08/image.png 1000w, https://www.stefanoturri.com/content/images/2024/08/image.png 1272w" sizes="(min-width: 720px) 720px"><figcaption>Eiger North Face: That would be a very challenging and risky IT Project!</figcaption></figure><p>Developing a new system or customizing an existing one is a complex IT journey, much like a climbing ascent or mountaineering trip. </p><p>In IT, the terrain to be traversed is the complex web of technologies, systems, and processes that must be integrated and harmonized to achieve the desired outcome. Just as a mountain guide must consider factors such as weather conditions, terrain difficulty, and group dynamics to determine the best route to follow, IT consultants must consider factors such as stakeholder goals, technical feasibility, and budget constraints to choose the best project approach.</p><p>What to do also depends on the stakeholder&apos;s goals. For example, if the goal is to develop a new strategic platform, the IT consultant must consider the long-term vision and requirements, much like a mountain guide would approach opening a new technical route. On the other hand, if the goal is to adopt a packaged solution, the IT consultant would focus on the ease of implementation and integration, much like a mountain guide would select the normal route to climb a peak faster and safer with less experienced clients.</p><p>Also how to do it, or the process of getting there is important. The IT consultant must be able to manage stakeholder expectations, communicate effectively with the team, and ensure that the solution meets the requirements and needs of the organization. Similarly, the mountain guide must know the client&apos;s expectations, skills, and fears, to reach the summit in the most appropriate, safe, and efficient way.</p><h2 id="risk-management">Risk Management</h2><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/08/image-1.png" class="kg-image" alt="Climbing lessons for IT: Consultants and Mountain Guides" loading="lazy" width="1024" height="683" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/08/image-1.png 600w, https://www.stefanoturri.com/content/images/size/w1000/2024/08/image-1.png 1000w, https://www.stefanoturri.com/content/images/2024/08/image-1.png 1024w" sizes="(min-width: 720px) 720px"><figcaption>Tools to mitigate risks are key: do not forget Helmets or Unit Testing!</figcaption></figure><p>IT consultants and mountain guides share a common role in managing risk in complex, high-stakes environments where their clients lack the expertise or resources to mitigate potential dangers on their own. </p><p>In these situations, they must proactively identify and neutralize threats, whether it&apos;s a software flaw or a rockfall. This requires a keen ability to analyze situations, make swift decisions, and take timely action to prevent calamity. In IT, this might involve pinpointing and addressing security weaknesses, while on the mountain, it might entail recognizing and responding to signs of severe weather. </p><p>Effective risk classification and management, coupled with clear communication of these risks to clients, are essential for success in both fields, as they enable informed decision-making and minimize the likelihood of negative outcomes.</p><h2 id="approach-teacher-vs-service-provider">Approach: Teacher vs Service Provider</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/08/image-2.png" class="kg-image" alt="Climbing lessons for IT: Consultants and Mountain Guides" loading="lazy" width="1600" height="1067" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/08/image-2.png 600w, https://www.stefanoturri.com/content/images/size/w1000/2024/08/image-2.png 1000w, https://www.stefanoturri.com/content/images/2024/08/image-2.png 1600w" sizes="(min-width: 720px) 720px"><figcaption>Teaching: Sharing the experience, not just &quot;Read the Manual&quot;</figcaption></figure><p>IT consultants and mountain guides can approach their work in two distinct ways. They can either deliver an end-to-end result or experience, taking full responsibility for the project, or they can act as teachers or partners, building client skills for the future.</p><p>In IT, this might mean providing a turn-key comprehensive solution, where the consultant takes ownership of the project from start to finish, ensuring that all requirements are met and the system is fully functional. Alternatively, the consultant might work jointly with the client, perhaps through design thinking and shared teams, to help them grow the skills to build and manage their own systems. This approach empowers clients to take ownership of their technology and make informed decisions about its development and maintenance.</p><p>On the mountain, this might mean leading clients to the summit, where the guide takes full responsibility for ensuring the group&apos;s safety and success. Alternatively, the guide might teach the skills they need to climb independently, empowering them to tackle future climbing endeavors on their own.</p><p>Both approaches have their merits, and the best guides and consultants can tailor their approach to meet the client&apos;s specific needs to better build trust and deliver greater value.</p><p>Both approaches have their merits, and the best guides and consultants can adapt their approach to meet the needs and maturity level of each specific client.</p><h2 id="trust">Trust</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/08/image-3.png" class="kg-image" alt="Climbing lessons for IT: Consultants and Mountain Guides" loading="lazy" width="900" height="469" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/08/image-3.png 600w, https://www.stefanoturri.com/content/images/2024/08/image-3.png 900w" sizes="(min-width: 720px) 720px"><figcaption>Many professional certifications.&#xA0;</figcaption></figure><p>In both IT and mountaineering, trust is essential, when Clients must be able to rely on their guide or consultant to get them to their destination safely and efficiently. Since Clients usually have a skill gap and are often unable to evaluate the professional quality by themselves, there is a need to certify and validate the professional contributions objectively.</p><p>In the case of IT Consultants, this might mean obtaining certifications and completing training to stay up-to-date with the latest technologies and best practices. For Mountain Guides, it might mean joining or obtaining certification from a recognized association or completing rigorous training. </p><p>But it&apos;s not just about the certification itself - it&apos;s about the credibility and reputation in the professional network that comes with it. It&apos;s not enough to be only the technical experts, people skills - the ability to communicate effectively, build rapport, and establish trust - are needed for client satisfaction. </p><h2 id="conclusion">Conclusion</h2><p>While the comparison between IT consultants and mountain guides could be a bit far-fetched, and as a metaphor should not be taken too seriously, I hope this will remind us of the importance of trust, risk management, and choosing the right approach to delivering successful outcomes in each complex project engagement. </p>]]></content:encoded></item><item><title><![CDATA[Platform Components Re-use Strategy]]></title><description><![CDATA[<p>Re-use is one of the most iconic &quot;holy grails&quot; in the IT industry. However, as any seasoned software architect knows, achieving successful re-use depends on the context and requires careful consideration of several key factors. </p><p>To validate the correct choice, we must evaluate re-use against clearly defined value</p>]]></description><link>https://www.stefanoturri.com/platform-components-strategy/</link><guid isPermaLink="false">6630e1df20fd5a0bb523af84</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Mon, 27 May 2024 16:57:28 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2024/04/PackagedComponents1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2024/04/PackagedComponents1.jpg" alt="Platform Components Re-use Strategy"><p>Re-use is one of the most iconic &quot;holy grails&quot; in the IT industry. However, as any seasoned software architect knows, achieving successful re-use depends on the context and requires careful consideration of several key factors. </p><p>To validate the correct choice, we must evaluate re-use against clearly defined value drivers that take into account the following aspects:</p><ul><li> <strong>Economic</strong>: What are the cost savings versus the cost of integrating the re-used component? Will re-use really lead to significant reductions in development time and resources, or will it introduce new complexities that offset any potential gains?</li><li><strong>Flexibility</strong>: Is the reused logic flexible enough and appropriate for the context? Will it be able to adapt to changing requirements and evolving business needs, or will it become a rigid constraint that hinders innovation?</li><li><strong>Strategic</strong>: Is a custom solution strategically differentiating, or can a more standardized approach be used? Will re-use enable us to focus on core competencies and competitive advantages, or will it divert resources away from high-value activities, losing strategic skills?</li></ul><p>In this article, I will delve into some aspects of re-use, highlighting key points and important considerations to keep in mind. I&apos;ll explore the benefits and challenges of re-use, and discuss how to strike a balance between the desire for efficiency and the need for flexibility and innovation. </p><p>By examining the complexities of re-use through the lens of these three critical factors, we can make conscious choices to unlock the full potential of re-use in our software development endeavors.</p><h3 id="components-granularity">Components Granularity</h3><p>Software reuse can occur at various granularity levels, from libraries to frameworks to platforms, each involving different roles and considerations. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/05/Re-use-Pyramid-1.png" class="kg-image" alt="Platform Components Re-use Strategy" loading="lazy" width="499" height="253"><figcaption><strong>Re-use Pyramid</strong></figcaption></figure><ul><li><strong>Library</strong>: developers can reuse individual components or utilities, such as logging or encryption libraries, to accelerate development and reduce duplication of effort. This type of reuse is often driven by technical leads or senior developers who recognize the benefits of leveraging existing code to solve specific problems but need to be governed to manage potential risks (E.g.: Log4j vulnerabilities). </li><li><strong>Framework</strong>: At this level, application architects may reuse entire application frameworks, such as web frameworks or messaging frameworks, to establish a common architecture and reduce the complexity of building new applications, by adhering to the framework conventions (E.g.: Spring, Angular, ...). </li><li><strong>Middleware</strong>: Selecting a general-purpose infrastructure, providing a common technical and operational ground. E.g.: Web/Application Servers (<a href="https://www.ibm.com/it-it/products/websphere-application-server">IBM WebSphere</a>, Tomcat, JBoss, ...), Databases (DB2, Postgres, Oracle, ...), and others.</li><li><strong>Enabling Platform: </strong>At this level, executives and business leaders may reuse entire cross-industry platforms, such as enterprise resource planning (ERP) systems or customer relationship management (CRM) systems, to drive business agility and reduce costs. This level of reuse requires a broad understanding of the organization&apos;s business needs and goals, as well as the ability to integrate the platform with existing systems and processes. E.g.: Salesforce, Siebel for CRM, &#xA0;<a href="https://www.ibm.com/products/maximo">IBM Maximo</a> for &#xA0;Asset Management, and &#xA0;SAP for ERP.</li><li><strong>Business Platform: </strong>Industry-focused solutions, providing specialized workflow and data models, that can accelerate the adoption of industry-specific best practices. E.g.: packages in the Travel and Transportation industry, from more general purpose (<a href="https://www.sabre.com/">Sabre</a>) to railway-specific (<a href="https://www.3ds.com/products/delmia/quintiq/rail-service-fleet-crew-planning">DELMIA Quintiq</a>, <a href="https://www.ivu.com/">IVU</a>, <a href="https://www.sqills.com/">Sqills</a>) solutions. </li></ul><p>Regardless of the granularity level, software reuse may offer numerous benefits, including reduced development time and costs, improved quality and reliability, and increased consistency and standardization across the organization. However, these benefits must be quantified against the adoption cost and risks through an appropriate selection process. </p><p>Selecting Components</p><p>When it comes to component selection, it&apos;s essential to approach it as a Fit-gap exercise, weighting the solution <strong>Requirements</strong> against the component <strong>Features</strong>. </p><p>On the Fit side, we need to consider the net <strong>Actual Value</strong> being provided by re-using the component. On the Gap side, we must focus on the misalignment between Requirements and Features, evaluating both the actual <strong>Gaps </strong>and the impact of <strong>Unnecessary Complexity</strong> introduced by integrating non-essential features.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/05/IntegrationScenarios-2.png" class="kg-image" alt="Platform Components Re-use Strategy" loading="lazy" width="811" height="732" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/05/IntegrationScenarios-2.png 600w, https://www.stefanoturri.com/content/images/2024/05/IntegrationScenarios-2.png 811w" sizes="(min-width: 720px) 720px"><figcaption><strong>Fit Gap Analysis and Typical Scenarios</strong></figcaption></figure><p>Two extreme scenarios, in which the re-use choice is simple to validate are:</p><ul><li><strong>Focused Component Integration:</strong> The re-used component provides a clearly defined subset of the required features, which can be integrated with minimal unnecessary complexity. This is a typical re-use scenario for a common, easily consumable library or service that fulfills a specific requirement in isolation, such as Geocoding APIs or libraries that convert coordinates to addresses. </li><li>Large Platform Adoption: The re-used component provides a full platform, including processes that fully cover the requirements. The benefits of full adoption, with minimal gaps to be filled, outweigh the additional costs of eventual unneeded features. </li></ul><p>However, in many real-life situations, the choice is not so clear-cut. In such cases, it&apos;s worthwhile to evaluate the underlying flexibility of the integration process to determine the best approach for component re-use. </p><h3 id="integrating-components">Integrating components</h3><p>Here I highlight two common reuse patterns, <strong>Library </strong>and <strong>Framework</strong>, very much visible at the code level.</p><p>The key difference between the two is that a Library provides very specific features as a service, but does not impose a definite structure to the calling solution. The lock-in in the API definition is limited and can be more easily managed.</p><p>On the other side, adopting a Framework requires adhering to the framework conventions that impose an external shape and structure on the application being developed. The benefits of this structure (which can greatly simplify development) must be weighted against a stronger lock-in that is more complex to manage. &#xA0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/05/FrameworkVsLibrary.png" class="kg-image" alt="Platform Components Re-use Strategy" loading="lazy" width="672" height="153" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/05/FrameworkVsLibrary.png 600w, https://www.stefanoturri.com/content/images/2024/05/FrameworkVsLibrary.png 672w"><figcaption><strong>Framework vs Library dichotomy</strong></figcaption></figure><p>When this dichotomy is at the technical level, the adoption of a commonly used framework that provides technical guidance and best practices is easily justifiable by comparing costs and risks.</p><p>As the granularity of re-use increases to the Enabling or Business platform level, organizations must exercise caution when adopting industry solutions. While these platforms may offer cost savings, they can also lead to vendor lock-in, which can be detrimental to their business. If the platform doesn&apos;t fully align with the organization&apos;s business context or strategic goals, there is a big risk of losing differentiating features and skills. Moreover, organizations may become overly dependent on the platform provider, which can introduce significant risks. For instance, what if the provider discontinues critical features or even the entire platform? This could have a devastating impact on business operations.</p><h3 id="conclusion">Conclusion</h3><p>By involving the right roles and considering the various aspects of reuse, organizations can unlock the full potential of software reuse and achieve significant business value.</p><p>Particular care should be taken on adopting large platforms since this decision has a big potential business impact on competition differentiating skills and capabilities. Here I highlight the need for a decision framework like <a href="https://www.stefanoturri.com/product-engineering-and-component-business-modelling-cbm/">CBM and Product Engineering</a>, to identify and communicate the correct strategy for each component. </p>]]></content:encoded></item><item><title><![CDATA[Creating Value with Product Engineering]]></title><description><![CDATA[Product Engineering and Component Business Modelling (CBM) combine to create innovative solutions that meet changing customer needs. Author successfully implemented this approach for a client in the railways industry, leading to a valuable commercial platform.]]></description><link>https://www.stefanoturri.com/product-engineering-and-component-business-modelling-cbm/</link><guid isPermaLink="false">65d3336320fd5a0bb523ac4c</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Tue, 12 Mar 2024 11:00:39 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2024/03/Alt4-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2024/03/Alt4-1.jpg" alt="Creating Value with Product Engineering"><p>Being a professional Engineer, coming from a family background of multiple generations of Engineers (my Grandfather, Great-Grandfather, and Great-Great grandfather all graduated from <a href="https://www.polimi.it/en">Politecnico di Milano</a>), I have always been fascinated with engineering techniques and skills that led to complex solutions and achievements standing the proof of time, from the remains of ancient Romand building, aqueducts, and bridges up to modern Telecommunication networks.</p><p>Having focused my technical career on software and IT, I soon started wondering how to apply engineering techniques in this field. My initial experiences showed a mix of situations and methods, with some components developed in a quick and dirty way through hurried projects while other components developed with more relaxed timelines showed signs of overengineering and additional complexity.</p><p>The more complex my engagements become (such as <a href="https://www.stefanoturri.com/which-kind-of-business-platform/">industry-specific business platforms</a>) the greater the need to find a way to balance effectively these two mindsets.</p><h3 id="product-vs-project-mindset-dichotomy">Product vs Project Mindset Dichotomy</h3><p>When developing an industry-focused business platform the choice between product and project mindset strongly impacts the success of the platform and the business that relies on it.</p><p><strong>Project Mindset</strong>: focus on delivering a specific outcome within a defined timeline and budget. Project teams are often formed to deliver a specific project, and once the project is completed, the team is disbanded.</p><p><strong>Product Mindset</strong>: focus on creating a sustainable, long-term solution that meets customers&apos; needs. Product teams prioritize building a robust, scalable platform that can adapt to changing market conditions and customer preferences. </p><p>For a business platform, a <strong>project mindset</strong> provides time and cost control but can lean too much on short-term goals. Conversely, a <strong>product mindset </strong>requires a long-term commitment to investing in the platform, continuously improving it, and adapting it to meet the changing needs of the business and its customers. </p><p>How can we address these challenges in adopting a product mindset? &#xA0;</p><h3 id="agile-methods">Agile Methods</h3><p>Agile can be a good starting point for managing a business platform with a product-centric mindset because it emphasizes iterative development, customer feedback, and collaboration between cross-functional teams. Agile methodologies, such as Scrum and Kanban, provide a framework for teams to quickly respond to changing customer needs and market conditions while ensuring that the product meets customer requirements and delivers value.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/03/scrum.png" class="kg-image" alt="Creating Value with Product Engineering" loading="lazy" width="900" height="450" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/03/scrum.png 600w, https://www.stefanoturri.com/content/images/2024/03/scrum.png 900w" sizes="(min-width: 720px) 720px"><figcaption>Scrum: The product is in the loop&#xA0;</figcaption></figure><p>By breaking down work into smaller, manageable chunks, and regularly delivering functional software, teams can quickly validate assumptions and adapt to changing requirements. Agile fits with a product mindset, with terms and definitions such as <em>&quot;Product Backlog&quot;</em> and <em>&quot;Minimum Viable Product (MVP)&quot;</em>, but at the same time includes principles that can mitigate overengineering and keep complexity down (e.g. YAGNI in eXtreme Programming).</p><p>But in the end, even if Agile encourages collaboration between teams, it&apos;s not always adopted in an end-to-end fashion, especially in organizations that are not purely digital and Software-based. </p><p>How can we go over and further systematize the engineering approach? </p><h3 id="product-engineering-for-industry-domains">Product Engineering for Industry Domains </h3><p><strong>Product engineering</strong> is creating and seeing a product through its entire life cycle from conception to end-of-life. Product engineers are responsible for designing, developing, testing, and maintaining products. This is true for both physical and digital software products, going beyond an <strong>Agile </strong>Software development approach.</p><p>Product engineering involves overseeing many aspects of the product, including its quality, cost, performance, usability, reliability, lifespan, and serviceability. Without product engineering, a product would remain an idea, so it plays a crucial role in developing a product. </p><p>The industry of product engineering is on the rise, and<a href="https://www.ibm.com/consulting/digital-product-engineering"> also IBM</a> is getting involved in this field, having acquired <a href="https://www.dialexa.com/">Dialexa company</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/03/productEngineering.png" class="kg-image" alt="Creating Value with Product Engineering" loading="lazy" width="757" height="426" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/03/productEngineering.png 600w, https://www.stefanoturri.com/content/images/2024/03/productEngineering.png 757w" sizes="(min-width: 720px) 720px"><figcaption>IBM Digital Product Engineering</figcaption></figure><p>Product Engineering can combine Agile, DevOps, and Lean principles with Industry and Domain-specific skills to create a holistic approach to end-to-end product development in customer organizations not limited to IT. </p><p>Product Engineering requires a multidisciplinary effort to be adopted and has to be actively managed to be effective. &#xA0;</p><p>How can we find out when and where this approach should be used?</p><h3 id="component-business-modelling-cbmto-narrow-the-focus">Component Business Modelling (CBM)to narrow the focus</h3><p>To evaluate where to narrow the focus for adoption, it is key to start with a strategic analysis based on the specific Industry and Business context. At IBM we have a framework to approach this kind of decision, called the <strong><a href="https://www.ibm.com/thought-leadership/institute-business-value/en-us/report/component-business-models">Component Business Model (CBM)</a></strong>, that can be used to map the company&apos;s <strong>Business Components.</strong></p><p>An analysis can be performed, comparing the specific company model with a reference for the industry sector, and with the support of the model, strategic decisions to focus on some Business Components can be made (E.g., strategic Business Components are marked in Blue in the picture below). &#xA0; </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2024/03/CBM.png" class="kg-image" alt="Creating Value with Product Engineering" loading="lazy" width="943" height="537" srcset="https://www.stefanoturri.com/content/images/size/w600/2024/03/CBM.png 600w, https://www.stefanoturri.com/content/images/2024/03/CBM.png 943w" sizes="(min-width: 720px) 720px"><figcaption>IBM Component Business Model (CBM)</figcaption></figure><p>CBM can be used to select focus areas for Product Engineering in a company belonging to a specific industry in the following ways:</p><p>1. <strong>Identify industry-specific pain points</strong>: using customer feedback, industry trends, and market research to identify the most pressing pain points and opportunities for improvement.</p><p>2. <strong>Identify areas for differentiation</strong>: analyzing competitor data and industry trends to identify areas where the company can differentiate itself from competitors. This can help Product Engineering focus on creating unique and innovative solutions that set the company apart from others in the industry.</p><p>3. <strong>Improve strengths</strong>: finding areas where processes and solutions are already strong and can be further optimized. </p><p>This can help Product Engineering streamline their workflows and free up resources to focus on high-impact areas. At the same time, on less strategic and lower priority ones, &#xA0;more standard packaged solutions or commercially available services can deployed with a Project-minded approach.</p><h3 id="conclusion">Conclusion </h3><p>Using a combination of these elements as a reference frame to set up an end-to-end Engineering process can lead to creating effective and long-lasting solutions, in appropriate scenarios, and avoid over-engineering in less strategic, lower-value situations. &#xA0;</p><p>With this approach, I have been able to lead the design and implementation of a strategic Commercial Platform for a Railways industry client. The key enabling decision together with the client Business Architecture team was to start everything with a CBM approach. From that, using a Domain-Driven approach to design the system, and an iterative delivery process using DevOps, the business platform was implemented, became a strategic asset for the Client, and was successfully evolved and re-used on several business initiatives. &#xA0;</p>]]></content:encoded></item><item><title><![CDATA[Lessons from Climbing: Handling Risks]]></title><description><![CDATA[Handling risks is key both in IT projects and climbing. Using the climbing approach of identifying two types of risks: objective and subjective, I draw some parallels with IT and emphasize the importance of Agility, continuous feedback, and an iterative approach to development and Unit Testing.]]></description><link>https://www.stefanoturri.com/climbing-lessons-risk-management/</link><guid isPermaLink="false">641d7a3c20fd5a0bb5239ffb</guid><category><![CDATA[Technology]]></category><category><![CDATA[Mountains]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Tue, 17 Oct 2023 10:10:05 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/10/IT-Avalanche.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/10/IT-Avalanche.jpg" alt="Lessons from Climbing: Handling Risks"><p>As an experienced IT Architect who has worked on complex and risky projects to develop large Business Solutions, I understand the importance of risk management in ensuring the success of such endeavors. However, I believe that the term &quot;risk management&quot; can come across as too clinical and detached, failing to convey the gravity and importance of the concept.</p><p>Drawing from my personal experience with climbing and mountaineering, I have come to appreciate the significance of risk management in a more personal and visceral way. In high-stakes situations where lives are on the line, it is essential to have a framework for identifying, assessing, and mitigating risks. This framework must be ingrained in the minds of all team members and practiced regularly, much like the routines and protocols that climbers and mountaineers use to navigate dangerous terrain and handle risks in dangerous situations.</p><p>In both IT and climbing, risk management is not just an afterthought or a box to be ticked. It is an integral part of the process, woven into the fabric of every decision and action. By examining the parallels between these two seemingly disparate fields, we can gain a deeper understanding of the importance of risk management and how it can be applied effectively in IT projects.</p><h3 id="objective-vs-subjective-hazards">Objective vs Subjective Hazards</h3><p>In mountaineering and climbing, risks can be broadly classified into two categories: </p><ul><li><strong>Subjective risks </strong>are hazards that are associated with the climber&apos;s own abilities, experience, and decision-making. These risks are influenced by factors such as the climber&apos;s skill level, physical condition, mental state, and personal choices. Subjective risks can include things like falls due to poor technique, poor judgment, or inadequate training, as well as the risk of overexertion or dehydration. Subjective risks can be mitigated through proper training, experience, and decision-making, as well as by taking steps to manage personal factors such as fatigue, stress, and anxiety.</li><li><strong>Objective risks</strong>, on the other hand, are hazards that are inherent in the environment and are independent of the climber&apos;s abilities, experience, or decisions. These risks are typically associated with the natural environment, such as rockfall, avalanches, weather conditions, and terrain. Objective risks can be identified and assessed through careful observation, monitoring, and analysis of environmental conditions. Climbers can take steps to mitigate objective risks by choosing routes and itineraries that minimize exposure to these hazards, using appropriate safety equipment, and staying informed about weather and other environmental conditions.</li></ul><!--kg-card-begin: html--><style type="text/css">
.tg  {border-collapse:collapse;border-color:#9ABAD9;border-spacing:0;}
.tg td{background-color:#EBF5FF;border-color:#9ABAD9;border-style:solid;border-width:1px;color:#444;
  font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{background-color:#409cff;border-color:#9ABAD9;border-style:solid;border-width:1px;color:#fff;
  font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-eqm3{border-color:inherit;font-size:20px;text-align:left;vertical-align:top}
.tg .tg-0pky{border-color:inherit;text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-eqm3">Subjective</th>
    <th class="tg-eqm3">Objective</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0pky">
      <ul>
        <li>Falls due to poor technique or lack of experience</li>
        <li>Poor judgment or decision-making</li>
        <li>Overexertion or dehydration</li>
        <li>Fatigue or exhaustion</li>
        <li>Panic or anxiety</li>
        <li>Inadequate training or preparation</li>
        <li>Equipment failure due to improper use or maintenance</li>
      </ul>
    </td>
    <td class="tg-0pky">
      <ul>
		<li>Rockfall or icefall</li>
		<li>Avalanches</li>
		<li>Weather conditions such as lightning, strong winds, or extreme temperatures</li>
		<li>Terrain features such as steep slopes, exposed ridges, or loose rock</li>
		<li>Wildlife encounters</li>
      </ul> 
    </td>
  </tr>
</tbody>
</table><!--kg-card-end: html--><p>In summary, objective risks are hazards that are inherent in the environment and are independent of the climber&apos;s abilities or decisions, while subjective risks are hazards that are associated with the climber&apos;s abilities, experience, and decision-making. Both types of risks can be managed and mitigated in different ways through proper preparation, experience, and decision-making.</p><p>Let&apos;s look at both types of risks and compare them in both Climbing and IT Project situations. </p><h3 id="handling-subjective-risks-projecting-with-unit-tests">Handling Subjective risks: &quot;Projecting&quot; with Unit Tests</h3><p>Subjective risks are mainly handled through learning and knowledge. Here a <a href="https://www.stefanoturri.com/lessons-from-climbing-growth-mindset/">Growth Mindset</a> is key to enable effective learning. </p><p>In Climbing, the best way to raise skills is by doing, failing, and trying again until a successful redpoint ascent (Climbing the entire route in one go without intermediate rests). This approach is called &quot;Projecting&quot;, and implies choosing a route just outside of your comfort zone and trying it with an open mindset and willingness to fail and fall. To do that safely climbing routes are safely bolted to avoid injuries when falling. &#xA0; &#xA0; &#xA0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/10/image-2.png" class="kg-image" alt="Lessons from Climbing: Handling Risks" loading="lazy" width="300" height="500"><figcaption>Falling should not be dangerous</figcaption></figure><p>Projecting a redpoint ascent of a sport route with secure bolts and software development using Unit Testing, TDD, and BDD can be compared in several ways:</p><ol><li>Preparation: In both cases, preparation is key. Before attempting a redpoint ascent, a climber must first inspect the route, identify the crux moves, and practice them until they feel confident. Similarly, before writing code, a developer must understand the requirements (maybe even with TDD and BDD approaches), identify the critical components, and design a plan.</li><li>Safety measures: In climbing, secure bolts are essential to ensure the safety of the climber. In software development, Unit Testing, TDD, and BDD serve as safety measures, ensuring that the code functions correctly and meets the requirements.</li><li>Iterative process: Both climbing and software development involve an iterative process. A climber may attempt a route multiple times, adjusting their technique and strategy until they successfully complete the ascent. Similarly, a developer may write and test code multiple times, refining it until it meets the requirements and functions as intended.</li><li>Feedback: Both climbing and software development provide immediate feedback. A climber receives feedback from their body and the route, while a developer receives feedback from their tests and code reviews. This feedback helps refine techniques and strategies in both cases and can be very specific (failing a move at a specific bolt vs a single specific unit test failing) to learn effectively.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/10/image-1.png" class="kg-image" alt="Lessons from Climbing: Handling Risks" loading="lazy" width="530" height="434"><figcaption>Trying each section between two protection points provides specific Feedback</figcaption></figure><p>On top of these, there is a documentation value, with a bolted route remaining available to further climbers to try their skills on and with unit tests providing documentation to the maintenance team joining later into the project, reducing risks and multiplying skills over time. </p><h3 id="handling-objective-risks-navigating-dangerous-terrains-with-agility">Handling Objective risks: Navigating dangerous terrains with Agility</h3><p>Mountaineering objective risks, are inherent in the sport and cannot be eliminated by subject skills, such as rockfall, avalanches, and weather conditions.</p><p>With Objective risks, a paradox emerges: Mountain guides have high rates of avalanche accidents and deaths and this highlights a dangerous cognitive bias in experts. Experts are at risk in two ways. First, they may make assumptions without verifying them due to their extensive knowledge. Second, their familiarity with the risk scenario can desensitize them to the potential dangers, leading to a loss of risk sensitivity. </p><p>So, to counteract this bias, mountaineers explicitly try to adopt an iterative <a href="https://en.wikipedia.org/wiki/OODA_loop">OODA loop</a> for evaluating Objective risk scenarios:</p><p>1. Observe: The first step is to observe the situation and gather information. In mountaineering, this means monitoring weather conditions, snow stability, rock stability, and other environmental factors that could impact the climb.</p><p>2. Orient: After observing the situation, the next step is to orient yourself to the environment. This involves analyzing the information you&apos;ve gathered and identifying any patterns or trends that could impact your climb. In mountaineering, this might involve studying the route, identifying potential hazards, and assessing the risk level.</p><p>3. Decide: Once you&apos;ve oriented yourself, the next step is to make a decision. In mountaineering, this might involve choosing a route, deciding when to start the climb, or determining how to respond to changing conditions.</p><p>4. Act: After deciding on a course of action, the next step is to act. In mountaineering, this means executing your plan and accepting the risks associated with the climb.</p><p>The <a href="https://en.wikipedia.org/wiki/Cynefin_framework">Cynefin framework</a> is a decision-making model based on these concepts that help individuals and organizations navigate complex, uncertain situations. &#xA0;This model is particularly useful for evaluating the applicability of Agile methods in Complex and Chaotic scenarios to contain risk through a continuous feedback loop. </p><figure class="kg-card kg-image-card"><img src="https://www.stefanoturri.com/content/images/2023/10/image-3.png" class="kg-image" alt="Lessons from Climbing: Handling Risks" loading="lazy" width="800" height="711" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/10/image-3.png 600w, https://www.stefanoturri.com/content/images/2023/10/image-3.png 800w" sizes="(min-width: 720px) 720px"></figure><p>So, Agile methods are useful for handling IT Project Objective risks outside of the control of the project team (Unstable market conditions, Uncertain Requirements, Non-committed Stakeholders, First-of-a-Kind situations), by containing and accepting the risks in minimizable chunks (e.g. MVP, some iterations), and continuously adapting to changing situations. An honest and continuous evaluation of the current situation is required here to avoid the Exper Cognitive bias and other ones (e.g. Sunk cost fallacy). &#xA0;</p><h3 id="summit-it-up">&quot;Summit&quot; it up</h3><p>A Climb is never finished until you are back home or base camp, with statistics showing that about 80% &#xA0;of incidents are during the descent.</p><p>In the same way, on complex Software projects and large Business Platforms, we are not finished when completing design, implementation or even reaching production. Long-term evolution and maintainability of the system is the long view that is absolutely essential for a successful IT career and navigating risks. </p><p>In conclusion, risk management is an essential aspect of both IT and climbing, and the parallels between these two fields can provide valuable insights into how to apply it effectively. By embracing a culture of risk awareness and mitigation, teams can ensure the success of their projects and the safety of their members.</p><p></p>]]></content:encoded></item><item><title><![CDATA[Lessons from Climbing: Growth Mindset]]></title><description><![CDATA[<p>The Information Technology field is constantly moving, with individuals and companies requiring constant learning to compete successfully. Fostering a Growth Mindset in an organization is becoming a necessity to catch opportunities provided by new tools, skills, and processes. </p><p>But what&apos;s exactly a Growth Mindset? Could it become yet</p>]]></description><link>https://www.stefanoturri.com/lessons-from-climbing-growth-mindset/</link><guid isPermaLink="false">64c7d7f420fd5a0bb523a7f3</guid><category><![CDATA[Technology]]></category><category><![CDATA[Mountains]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Mon, 21 Aug 2023 13:29:44 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/08/ClimbingRack.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/08/ClimbingRack.jpg" alt="Lessons from Climbing: Growth Mindset"><p>The Information Technology field is constantly moving, with individuals and companies requiring constant learning to compete successfully. Fostering a Growth Mindset in an organization is becoming a necessity to catch opportunities provided by new tools, skills, and processes. </p><p>But what&apos;s exactly a Growth Mindset? Could it become yet another Corporate mantra that everyone talks about, but nobody really knows? </p><p>I&apos;ll look into it with a different perspective, inspired by some of my mountain-going experiences.</p><h3 id="rock-climbing-technical-skills">Rock Climbing Technical Skills</h3><p>As an IT Architect, I&apos;m quite fascinated by technology and activities that require complex skills, to be mastered until eventually achieving competency and enabling flow state execution.</p><p>Among sports, for these same reasons, I particularly like mountain-related activities such as Hiking, Skiing, Mountain Biking, and especially Rock Climbing.</p><p>As a kid, I was more book-reading than sport focused, so getting into it in my 20ies was a significant <strong><u>challenge</u></strong>. To safely learn I joined a mountaineering training course organized by the Italian Alpine Club (CAI), and here I had several initial <strong><u>setbacks</u> </strong>by being unable to handle any but the easiest of climbing routes. However, out of the 20 participants, I was one of the few <strong><u>persisting</u></strong> with the activity and started a long journey of self-improvement and learning that allowed me to do interesting and satisfying climbs, with a responsible and safety-conscious approach. </p><p>While doing this I drew support from my local climbing circle, both from more experienced climbers, that provided <strong><u>criticism</u></strong> and suggestions for improvement, and from my regular climbing peers for continuously learning together. &#xA0;While Rock Climbing for me remains a non-professional activity, I am particularly <u><strong>inspired</strong></u> by the fact that one of my regular climbing partners has been able to become a certified Mountain Guide, filling his technical gaps (e.g. initially not a good skier) to do that.</p><h3 id="growth-mindset-explainedformal">Growth Mindset Explained - Formal </h3><p>In some way, my experience maps to the Growth Mindset theory, as defined by Carol Dweck&apos;s studies: </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/08/Growth-mindset.png" class="kg-image" alt="Lessons from Climbing: Growth Mindset" loading="lazy" width="867" height="607" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/08/Growth-mindset.png 600w, https://www.stefanoturri.com/content/images/2023/08/Growth-mindset.png 867w" sizes="(min-width: 720px) 720px"><figcaption>Growth vs Fixed mindsets</figcaption></figure><p>First, a <strong>mindset</strong> is an established set of attitudes of a person or group concerning culture, values, philosophy, frame of mind, outlook, and disposition. A person can have multiple mindsets, whilst the two most common ones are often cited as the Growth and Fixed mindset,</p><p>According to Dweck, individuals can be placed on a continuum according to their implicit views of where ability comes from; those believing their success to be based on innate ability are said to have a <strong>Fixed</strong> mindset, and those believing their success is based on hard work, learning, training, and sheer persistence are said to have a <strong>Growth</strong> mindset. In Dweck&apos;s words:</p><blockquote>In a fixed mindset students believe their basic abilities, their intelligence, their talents, are just fixed traits. They have a certain amount and that&apos;s that, and then their goal becomes to look smart all the time and never look dumb. In a growth mindset students understand that their talents and abilities can be developed through effort, good teaching and persistence. They don&apos;t necessarily think everyone&apos;s the same or anyone can be Einstein, but they believe everyone can get smarter if they work at it.<sup><a href="https://en.wikipedia.org/wiki/Carol_Dweck#cite_note-:2-13">[13]</a></sup></blockquote><h3 id="growth-mindset-explainedclimbing-fun">Growth Mindset Explained - Climbing Fun!</h3><p>But this is still very much theory, so to keep the Climbing theme I am sharing a very good video explanation provided by a Psychologist that is also a Climbing Coach. Have fun!</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/YvTlIzglES8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen title="Tom Randall and Growth Mindset | Mindset Analysis"></iframe></figure><h3 id="summing-it-up">Summing it up</h3><p>Growth Mindset particularly resonates with my extensive experience with Agile and DevOps approaches. Continuous Improvement cycles and Agile retrospectives are habits that showcase this mindset. &#xA0;</p><p>In the end adopting this same approach to build company-specific habits (e.g. for consulting, manufacturing, etc...) is the way to build an adaptable and competitive organization. &#xA0;</p>]]></content:encoded></item><item><title><![CDATA[SCM Patterns for versioning services]]></title><description><![CDATA[<p>One thing that I find remarkable about current IT Industry best practices is that we daily use the closest thing we have available to a Time Machine. If this was more widely known to students, Computer Science education might appear even more cutting edge than it now is (and &quot;</p>]]></description><link>https://www.stefanoturri.com/scm-patterns/</link><guid isPermaLink="false">641c3ce920fd5a0bb5239df8</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Fri, 16 Jun 2023 14:42:37 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/06/TimeMachineCropped.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/06/TimeMachineCropped.jpg" alt="SCM Patterns for versioning services"><p>One thing that I find remarkable about current IT Industry best practices is that we daily use the closest thing we have available to a Time Machine. If this was more widely known to students, Computer Science education might appear even more cutting edge than it now is (and &quot;Great Scott!&quot;, it could even impress Dr. Emmett Brown, .... maybe &#x1F609;). </p><p>However, Source Code Management (SCM) practices are not a big part of academic curricula, since are more in support of collaborative development rather than individual skills that are key to achieving an educational degree for the individual. &#xA0;</p><p>But as soon as we are involved in large-scale projects (and Business Platforms based on Cloud and Microservices definitely qualify), these became central in everyday work. </p><p>In this post, I will have a look at key concepts that are at the base of these tools, and at effective usage patterns applicable to service platform development.</p><h3 id="how-scm-tools-support-collaboration">How SCM Tools support collaboration</h3><p>Collaboration support is provided by helping to manage file changes through time, with features that have evolved through time with the newer generation tools.</p><p>Early tools, such as <strong>Revision Control System(RCS)</strong>, focused on versioning the history of individual files and providing collaboration features such as <strong>Locks </strong>focused on preventing conflicts due to concurrent modifications of the same file. This approach (akin to DB Pessimistic locking), while guaranteeing consistency, limits efficiencies due to parallel development.</p><p>Subsequent generation tools, such as <strong>Concurrent Versions System</strong> (<strong>CVS</strong>), focused on allowing concurrent development, enabling a development process that forces conflict resolution before committing (akin to DB Optimistic locking), and storing the changes in the history repository. &#xA0;CVS did become hugely popular and used for enabling collaboration on OpenSource projects, especially through <a href="https://sourceforge.net/">SourceForge</a>.</p><p>However, large projects require tracking time and version dependencies between multiple files. Even if CVS provided features to commit multiple files at the same time, these were limited and not too consistent (e.g. lacking atomicity, and no folder versioning support). <strong>Apache Subversion (SVN) </strong>was the next step of evolution and provided an atomic changeset of multiple files and folders, creating a consistent history graph of entire projects and not only of single files, with even better capabilities of moving consistently through code versions along the timeline.</p><p>Modern tools provide additional features, such as:</p><ul><li>distributed repositories (<strong>Git, Mercurial</strong>) that allow working offline and scaling to thousands of users.</li><li>cheaper and more manageable branching, that allows committing individual changes before merging across different branches (<strong>Rational Team Concert, Git, Mercurial</strong>), making development safer by saving and backing up work at any time</li></ul><p>Currently, Git-based solutions, especially &#xA0;<a href="https://github.com/">GitHub</a>, are extremely popular and easily available online. </p><p>However these are just tools, let&apos;s have a look at some common collaboration patterns, in order to choose the most effective strategy for our projects. </p><h3 id="gitflow-usage-pattern">GitFlow Usage pattern </h3><p>This pattern is close to the Linux kernel source configuration processes. It&apos;s essentially based on a hierarchical communication structure, where developer branches are handled by key lead developers that integrates code developed by teams on different feature branches. &#xA0; </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/06/GitFlow.png" class="kg-image" alt="SCM Patterns for versioning services" loading="lazy" width="904" height="334" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/06/GitFlow.png 600w, https://www.stefanoturri.com/content/images/2023/06/GitFlow.png 904w" sizes="(min-width: 720px) 720px"><figcaption>GitFlow pattern highlights</figcaption></figure><p>Key aspects of this model:</p><ul><li>Concentrate responsibilities on the Lead developer controlling the development branch, ensuring review of all work</li><li>All development work is reviewed before integration, reducing the trust required from other contributors</li><li>Contributions are merged into the development branch asynchronously, favoring distributed work between multiple persons at different times</li></ul><p>On the flip side:</p><ul><li> A complex process, with constant merge requests to be managed, that slows down the development pace</li><li>Long time spent in Feature branches makes merging and integration complex, with many potential reworks</li><li>The lead developer integration role is central, leading to significant risks in case of unavailability</li></ul><h3 id="trunk-based-development-usage-pattern">Trunk-based-development Usage pattern</h3><p>This approach assumes a completely opposite communication structure, based on a small group of closely collaborating peers like usually found on Agile projects. Code ownership is shared and changes are continuously integrated into the Trank branch. Work on individual features might happen in specific branches, but these are short-lived and integration responsibility remains on the specific person handling the branch.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/06/Trunk.png" class="kg-image" alt="SCM Patterns for versioning services" loading="lazy" width="850" height="255" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/06/Trunk.png 600w, https://www.stefanoturri.com/content/images/2023/06/Trunk.png 850w" sizes="(min-width: 720px) 720px"><figcaption>Trunk-based-development pattern highlights</figcaption></figure><p>Key aspects of this model:</p><ul><li>A Simpler, less formal process, that allows much greater delivery speed.</li><li>Greater delivery speed and short-lived feature branches enable a continuous delivery process, that reduces integration risks.</li><li>Not relying on a central authority figure to resolve conflicts </li></ul><p>On the flip side:</p><ul><li>Requires trust and accountability of all participants. While often this is associated with developer seniority, with the right people mix it becomes a powerful motivator for up-skilling junior people and making them accountable (e.g. with Agile techniques such as Pair Programming ) </li><li>Not safely applicable to scenarios with many &quot;untrusted&quot; contributors working asynchronously</li></ul><h3 id="selection-criteria">Selection Criteria</h3><p>While different SCM tools have specific features that support either style, the real selection criteria depend on the context of the specific project, based on required communication patterns.</p><p>Open Source projects and commercial product development usually benefit more from a GitFlow approach because of:</p><ul><li>the larger number of involved &quot;untrusted&quot; developers (either Open Source contributors or Support people producing bug fixes) that require a formal change approval process. E.g. merge-request approval by an OSS project maintainer. Each request could come from unknown contributors.</li><li>relative infrequent scheduled releases, that allow periodic integration cycles</li></ul><p>Most software development projects on clients, often executed with Agile methods benefit more from a Trunk-based-development approach because of: </p><ul><li>a relatively small team, fully committed to the specific engagement. </li><li>very fast incremental release schedule, using a continuous delivery approach</li></ul><h3 id="conclusion">Conclusion</h3><p>In the end, the best strategy for a specific context will combine these two approaches. For example, a Business Platform will be developed with an Agile approach, but the release branches will need more formal hierarchical approvals to ensure the segregation of responsibilities. </p><p>Cloud-native development with Microservices, given the small team sizes, incremental agile delivery, and speed of release is a good fit for starting with Trunk-based-development. </p>]]></content:encoded></item><item><title><![CDATA[Documenting APIs]]></title><description><![CDATA[<p>Business Platforms are characterized by a system context that includes multiple integration points (APIs) with different systems. In complex solutions, the number of integration points increases, and an effective way to document them becomes critical for the program&apos;s success.</p><p>I will focus here on some key aspects to</p>]]></description><link>https://www.stefanoturri.com/documenting-apis/</link><guid isPermaLink="false">617e5939a90f6f73615bfbcc</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Wed, 17 May 2023 16:06:23 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/05/asyncapi-openapi-post_pic-14.webp" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/05/asyncapi-openapi-post_pic-14.webp" alt="Documenting APIs"><p>Business Platforms are characterized by a system context that includes multiple integration points (APIs) with different systems. In complex solutions, the number of integration points increases, and an effective way to document them becomes critical for the program&apos;s success.</p><p>I will focus here on some key aspects to effectively design, implement, maintain, and reuse platform APIs, such as:</p><ul><li>Choosing a <strong>Design Strategy</strong></li><li>Choosing an explicit <strong>Target Focus </strong>for the documentation</li><li>Handling consistently multiple types of APIs, including both <strong>synchronous </strong>and <strong>asynchronous </strong>ones</li></ul><h3 id="api-design-strategy">API Design Strategy</h3><p>The first key design choice is the strategy for defining the APIs. Two common strategies exist:</p><ul><li><strong>Code First: </strong>Operations and data are defined by developers directly in code, with API specifications and further documentation generated via annotations (e.g. with JAX-RS in Java), either exposing documentation endpoints when deployed or generating specification files during the build process. This approach delegates API stability responsibility to developers and is often better suited to internal APIs between closely related agile teams that allow for great amounts of flexibility. &#xA0;</li><li><strong>Contract First: </strong>The API specification is designed first, typically using some kind of modeling technique (e.g. Domain Driven Design - DDD, see <a href="https://www.stefanoturri.com/application-modernization-part-1-ddd-to-break-the-business-domain/">also</a>). This allows parallelization of work between API producers and consumers, which will integrate at the end of the development phase. &#xA0;This approach works best for external APIs and requires effective planning and change control to manage it effectively to guarantee both consistency and a sufficient amount of flexibility in API definition.</li></ul><p>A large-scale business platform will use a combination of both approaches but will be mostly characterized by its external APIs that benefit the most from a contract-first approach. </p><h3 id="documentation-target-focus">Documentation Target Focus</h3><p>Another key design choice is to balance the target focus of the API documentation, balancing the following two aspects</p><ul><li><strong>Human-Readable</strong>: describing the context and scope of the API, and how to use it, with different levels of complexity covered through examples and tutorials.</li><li><strong>Machine-Readable</strong>: enabling several capabilities such as formal version tracking via source control repositories, automated generation of client/server code for different implementation languages, and automated validation of message payloads.</li></ul><p>Having formal, machine-readable documentation is a must to manage APIs at scale in a large Business Platform. Most API Gateway solutions provide capabilities to publish this kind of documentation, together with additional human-readable documentation to authorized consumers. Additionally, they provide and document consistent security capabilities to manage the authorization keys and secrets to integrate APIs in production environments. &#xA0; &#xA0; &#xA0;</p><h3 id="handling-multiple-api-types">Handling multiple API Types &#xA0;</h3><p>API Types can be broadly split into two main categories:</p><ul><li><strong>Synchronous:</strong> &#xA0;based on Request/Reply interaction pattern. Examples of this type of API &#xA0;are SOAP over HTTP, &#xA0;REST or GraphQL</li><li><strong>Asynchronous:</strong> &#xA0;based on message sending with a Publish/Subscribe interaction pattern. Single or multiple subscribers are possible. Examples of this type are Kafka, AMQ, JMS messaging, use of Websockets or Web Services with asynchronous bindings (e.g. SOAP over JMS) &#xA0;</li></ul><p>Each technology has its own technical features that are reflected in the API specification but also define Business-specific data. Service components might be composed of both synchronous and asynchronous operations that need to operate on a common domain model (eventually defined using approaches like Domain-Driven Design - DDD). &#xA0;</p><p>OpenAPI and AsyncAPI provide this level of compatibility, by allowing the use of JSON Schema references to specify the business-specific data (Request, Response, Messages). &#xA0;Common Schema definitions can then be shared across multiple APIs of different kinds that participate in business processes using the same entities. &#xA0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/05/image.png" class="kg-image" alt="Documenting APIs" loading="lazy" width="768" height="1466" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/05/image.png 600w, https://www.stefanoturri.com/content/images/2023/05/image.png 768w" sizes="(min-width: 720px) 720px"><figcaption>Comparing OpenAPI and AsyncAPI specification structures. Domain-specific payload is highlighted in red (Request, Response, Message) in the middle.</figcaption></figure><p>Other technologies can also use this pattern, such as:</p><ul><li>Both synchronous and asynchronous web services can use WSDL and XSD specification formats</li><li>GraphQL schemas as extensions/combinations of multiple JSON schemas</li></ul><h3 id="conclusion">Conclusion</h3><p>AsyncAPI and OpenAPI are now both part of the Linux Foundation, so both are well-supported and have a stable future as open standards with community governance and are becoming more and more integrated with open-source tooling and commercial products providing API Gateways features, such as <a href="https://ibm-cloud-architecture.github.io/refarch-eda/patterns/api-mgt/">IBM API Connect</a>.</p>]]></content:encoded></item><item><title><![CDATA[Application Modernization - Part 4: engineering the delivery Platform]]></title><description><![CDATA[<p>Modernizing applications towards a cloud-native approach, that breaks monolithic components into multiple smaller microservice, leads to a rise in complexity in managing the IT Infrastructure operations. While each microservice becomes simpler and potentially more scalable, the number of moving pieces to be managed drastically increases. </p><p>The traditional approach of the</p>]]></description><link>https://www.stefanoturri.com/application-modernization-part-4-devops-to-assemble-the-pieces/</link><guid isPermaLink="false">6294edbf20fd5a0bb5238f6d</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Wed, 12 Apr 2023 15:41:00 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/04/CattleVsPets.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/04/CattleVsPets.jpg" alt="Application Modernization - Part 4: engineering the delivery Platform"><p>Modernizing applications towards a cloud-native approach, that breaks monolithic components into multiple smaller microservice, leads to a rise in complexity in managing the IT Infrastructure operations. While each microservice becomes simpler and potentially more scalable, the number of moving pieces to be managed drastically increases. </p><p>The traditional approach of the Operations teams of managing individual Servers/VMs, monitoring, &#xA0;and applying security fixes, middleware patches, and upgrades cannot scale effectively. &#xA0;</p><p>A different approach is needed based on large-scale automation, to keep control and scale effectively, and is commonly explained through a common metaphor for this, &#xA0;&quot;Cattle vs Pets&quot; where:</p><ul><li><strong>Pets</strong> are the traditional Servers/VMs, individually and carefully managed by the operation team. This is a labor-intensive activity, that has to be prioritized based on the criticality of components, leading to an increasingly divergent amount of combinations of software components at different levels in each server. </li><li><strong>Cattle </strong>are the cloud-native VMs and Containers, managed through large-scale automation. A failing Container is not repaired, but replaced as soon as possible, while at the same time continuously learning how to reduce faults by improving automated procedures.</li></ul><p>Two common approaches to automation have emerged, <strong>DevOps </strong>(or even better, DevSecOps, but in this context, I will not focus on Security)<strong> </strong>and <strong>SRE </strong>(Site Reliability Engineering).</p><h3 id="dev-ops-and-sre">Dev Ops and SRE</h3><p>These two approaches might seem like two sides of the same coin since both focus on comparable tools and practices, rooted in automation and Agile methods. But at the same time, the target focus is slightly different, mostly based on the original sponsors of the approach:</p><ul><li><strong>DevOps </strong>approach originates from Development teams, looking for ways to bring their application to production in a faster and safer way. Automating builds, testing, and deployments through a continuous improvement process to bring business value to production, removing operational impediments in doing so.</li><li>SRE, as the name itself implies, focuses on the <u>Reliability</u> aspect, which is a key concern for the Operation teams that strive to keep the infrastructure and server running while the application and software installed might change. The focus is not so much on Business value directly, but rather on improving the manageability of applications, to keep the systems going or eventually restore them as fast as possible. </li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/04/image-4.png" class="kg-image" alt="Application Modernization - Part 4: engineering the delivery Platform" loading="lazy" width="2000" height="911" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/04/image-4.png 600w, https://www.stefanoturri.com/content/images/size/w1000/2023/04/image-4.png 1000w, https://www.stefanoturri.com/content/images/size/w1600/2023/04/image-4.png 1600w, https://www.stefanoturri.com/content/images/size/w2400/2023/04/image-4.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>DevOps vs SRE approach</figcaption></figure><p>With this perspective, it seems almost as if the two approaches might be antithetical. So what&apos;s the reason for this? It boils down to the consequences of <a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conway&apos;s law</a>, and specifically to the fact that in many organizations the Dev and Ops structures have different success metrics.</p><h3 id="the-stakeholders">The stakeholders</h3><p>Dev and Ops are driven by two main types of manager profiles, with alternative approaches on some different topics, which I summarize below.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/04/image-6.png" class="kg-image" alt="Application Modernization - Part 4: engineering the delivery Platform" loading="lazy" width="897" height="444" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/04/image-6.png 600w, https://www.stefanoturri.com/content/images/2023/04/image-6.png 897w" sizes="(min-width: 720px) 720px"><figcaption>Development vs Operation mindset</figcaption></figure><p>The summary presented here is a kind of polarized reference, with real situations not so black and white. The more the goals of both types of stakeholders are aligned, the simper is collaborating.</p><h3 id="converging-on-an-end-to-end-approach">Converging on an end-to-end approach</h3><p>To make this possible, the first step is to better align the Goals of both Development and Operation structures. To achieve a successful Digital Transformation and modernize applications both Business KPIs and Service levels goals must be shared by the organization. &#xA0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/04/image-5.png" class="kg-image" alt="Application Modernization - Part 4: engineering the delivery Platform" loading="lazy" width="2000" height="1163" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/04/image-5.png 600w, https://www.stefanoturri.com/content/images/size/w1000/2023/04/image-5.png 1000w, https://www.stefanoturri.com/content/images/size/w1600/2023/04/image-5.png 1600w, https://www.stefanoturri.com/content/images/size/w2400/2023/04/image-5.png 2400w" sizes="(min-width: 720px) 720px"><figcaption>Platform Engineering supporting Dev &amp; Ops</figcaption></figure><p>To implement this, a <strong>Platform Engineering</strong> approach (<a href="https://www.ibm.com/consulting/platform-engineering-services">see also</a>) is critical to support both Dev and Ops activities, by providing common methods, platforms, and services to boost productivity and collaborations within and across both teams.</p><h3 id="conclusion">Conclusion</h3><p>Platform Engineering becomes the critical enabler to effectively manage a Hybrid Multi-Cloud at scale. This is the technological foundation to develop effectively any kind of <a href="https://www.stefanoturri.com/which-kind-of-business-platform/">Business platform</a>, that can drive a real Digital Transformation.</p>]]></content:encoded></item><item><title><![CDATA[Application Modernization - Part 3: Unravel the data]]></title><description><![CDATA[<p>Data in applications has a powerful gravitational pull, so transforming and modernizing applications is heavily impacted by existing data. Digital Transformations have focused on enabling new cloud applications and frontends but remained connected to existing transactional backends (<a href="https://www.stefanoturri.com/application-modernization-part-2-transactions-and-events-in-microservices/">see also</a>). This kind of approach highlighted potential issues in handling traffic load</p>]]></description><link>https://www.stefanoturri.com/application-modernization-part-3-unravel-the-data/</link><guid isPermaLink="false">6294ed9920fd5a0bb5238f69</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Fri, 24 Mar 2023 07:58:34 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/03/resized.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/03/resized.jpg" alt="Application Modernization - Part 3: Unravel the data"><p>Data in applications has a powerful gravitational pull, so transforming and modernizing applications is heavily impacted by existing data. Digital Transformations have focused on enabling new cloud applications and frontends but remained connected to existing transactional backends (<a href="https://www.stefanoturri.com/application-modernization-part-2-transactions-and-events-in-microservices/">see also</a>). This kind of approach highlighted potential issues in handling traffic load shifts in reading vs writing transactional data. I had some direct experience with this on projects:</p><ul><li><strong>Online ticketing:</strong> moving from traditional sales at stations to online apps and services leads to a significant reduction in the conversion rate from travel searches to tickets sold (e.g. an online user tries to plan several trip options before committing to a purchase ), increasing resource consumption. &#xA0;</li><li>Online Banking: The adoption of online banking greatly increased the usage of query operations (e.g. end user can read their account statements online) vs actual financial transactions. To contain the increased load and cost on the backend transactional systems a data replication approach (a.k.a Copy Banking) can be used to offload query traffic from the expensive Mainframe towards a hybrid cloud containerized infrastructure. </li></ul><p>To continue the cloud journey, we need to refactor also backend transactional systems, with their persistent data (of mission-critical, financial nature), and make the new services able to scale adequately and cost-effectively.</p><h3 id="breaking-down-the-monolith">Breaking down the monolith</h3><p>Domain- Driven-Design (DDD) is a very good tool to break down the Business domain (<a href="https://www.stefanoturri.com/application-modernization-part-1-ddd-to-break-the-business-domain/">see also</a>), to identify parts of the business applications that can be modernized and operated as independent microservice components. Analysis of the data is very helpful in this process, to identify contexts based on different data relationship types:</p><ul><li>Foreign key relationships: Group tables that are related to the same entity</li><li>Transactional relationships: Group tables that are updated in the same transaction</li></ul><p>These groups of related tables are indications of candidate DDD aggregates. A good candidate is when the tables of the group are tightly coupled within the group but have few relationships with other tables. &#xA0;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/03/data-strangling.png" class="kg-image" alt="Application Modernization - Part 3: Unravel the data" loading="lazy" width="763" height="444" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/03/data-strangling.png 600w, https://www.stefanoturri.com/content/images/2023/03/data-strangling.png 763w" sizes="(min-width: 720px) 720px"><figcaption>Candidate contexts identified and extracted from data analysis</figcaption></figure><p>This is such a good strategy, that the largest chapter of the &quot;<a href="https://samnewman.io/books/monolith-to-microservices/">Monolith to Microservices</a>&quot; book by Sam Newmann focuses explicitly on patterns for managing data handling.</p><p>The identified contexts can then be extracted (code and data together) using variations of the &quot;Strangler Pattern&quot;, to create the replacement independent components.</p><h3 id="coexistence-architecture">Coexistence architecture</h3><p>While on the front-end and application components, the strangler pattern can be applied using HTTP proxy/routing techniques to dynamically replace sections of the application, the need of seeing consistent data requires other techniques.</p><p>Rolling out a modernized application is rarely a big-bang event, with instead long periods of parallel deployment and testing of the mission-critical applications. This &quot;coexistence&quot; need requires a suitable architecture and in IBM we have a reference cookbook that provides some key fundamental patterns. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/03/IBM-Coexistence-Architecture---annotated.png" class="kg-image" alt="Application Modernization - Part 3: Unravel the data" loading="lazy" width="887" height="406" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/03/IBM-Coexistence-Architecture---annotated.png 600w, https://www.stefanoturri.com/content/images/2023/03/IBM-Coexistence-Architecture---annotated.png 887w" sizes="(min-width: 720px) 720px"><figcaption>IBM Coexistence architecture - data transition patterns&#xA0;</figcaption></figure><p>These patterns help in moving out the data and managing the transition in either direction:</p><ul><li>Current to Modernized</li><li>Modernized to Current</li></ul><p>Let&apos;s have a look at these patterns, focusing on the Current to Modernized direction.</p><p><strong>Change Data Capture</strong></p><p>Current systems events are discovered by consuming changes in the system&apos;s existing artifacts (typically database files and/or data sources). This pattern is used when changes to Current Programs are not affordable or strategically desirable, but in this case, additional effort must usually be spent to adapt the event for the destination systems with on-demand transformations that often duplicate existing legacy logic.</p><p>Key tools for implementing this pattern are:</p><ul><li>IBM&#xAE; IBM Change Data Capture (CDC Replication)</li><li>Oracle GoldenGate</li><li>Debezium, for an open source CDC </li></ul><!--kg-card-begin: html--><style type="text/css">
.tg  {border-collapse:collapse;border-color:#9ABAD9;border-spacing:0;}
.tg td{background-color:#EBF5FF;border-color:#9ABAD9;border-style:solid;border-width:1px;color:#444;
  font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg th{background-color:#409cff;border-color:#9ABAD9;border-style:solid;border-width:1px;color:#fff;
  font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;}
.tg .tg-60hs{font-size:20px;text-align:left;vertical-align:top}
.tg .tg-0lax{text-align:left;vertical-align:top}
</style>
<table class="tg">
<thead>
  <tr>
    <th class="tg-60hs">Pro</th>
    <th class="tg-60hs">Cons</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0lax">
        <li>No changes to Current systems are needed</li>
        <li>Limited performance impact on Current systems</li>
        <li>Near real-time capture of events</li></td>
    <td class="tg-0lax">
        <li>A High volume of fine-grained and &quot;noise&quot; events</li>
<li>Multiple sources might need to be aggregated to form a business event</li>
<li>Complex data transformation might be needed to match the destination data model</li></td>
  </tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Application Event Streaming</strong></p><p>This Pattern is used to replicate the Current system application&apos;s state, through application changes to expose all business events to an event stream(s). Events are sourced to destination systems with on-demand transformation (usually limited to adapting model schemas, but not replicating business logic).</p><p>Events are exposed after the business operation is completed to avoid phantom events. To support this it&apos;s advised to use a message-passing middleware with transactional guarantees (either local transaction or exactly-once/at-least-once guarantees). Such middleware can be:</p><ul><li>Queue-based systems (JMS, IBM MQ, etc...)</li><li>Topic/Partition based (Kafka)</li></ul><p>Further articles in this series will go more in-depth on events/messaging.</p><!--kg-card-begin: html--><table class="tg">
<thead>
  <tr>
    <th class="tg-60hs">Pro</th>
    <th class="tg-60hs">Cons</th>
  </tr>
</thead>
<tbody>
  <tr>
    <td class="tg-0lax">
        <li>Real-time business event discovery</li>
        <li>No coupling with the destination solution</li>
        <li>Possibility to define events in a new domain structure, reducing the need for transformation</li></td>
    <td class="tg-0lax">
        <li>Requires changes to Current Applications</li>
<li>Complex business logic in the Current application might require aggregation of multiple business events (i.e. compensation of failed transactions)</li>
<li>Implementing complex business logic might impact Current application performance</li></td>
  </tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Filtering &amp; Transformation engine</strong></p><p>This pattern is used to reduce event streams relevant events by applying transformation and filtering rules and caching processed events</p><p>Filtering rules are used to:</p><ul><li>Drop irrelevant events (i.e. CDC sends everything)</li><li>Route to different/multiple event destinations</li></ul><p>Event cache is used to:</p><ul><li>Filter out duplicate events (i.e. multiple sources)</li><li>Guaranteed idempotent retries of event transformations </li><li>Aggregate low-level events</li></ul><p>Transformation can become complex both in CDC and Event Streaming scenarios, especially if transformations need to duplicate the business logic of the Current system. &#xA0;EAI pattern-aware tools such as Camel/Fuse are particularly useful for these kinds of transformations.</p><!--kg-card-begin: html--><table class="tg">
<thead>
  <tr>
    <th class="tg-60hs">Pro</th>
    <th class="tg-60hs">Cons</th>
  </tr>
</thead>
<tbody>
  <tr>
        <td class="tg-0lax">
        <li>Transformation logic is decoupled from the event source</li>
        <li>If co-located with the source, reduces the transferred data amount and can use source data for correlation</li>
        <li>If co-located with the destination, employs modernized tools and platform capabilities</li></td>
    <td class="tg-0lax">
        <li>High effort for implementing error handling and compensation in case of missing events</li>
<li>Adds extra latency for low-level events aggregation</li>
<li>Complexity and latency worst cases when implementing event correlation</li></td>
  </tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Choosing an approach</strong></p><p>Ultimately, CDC is not a silver bullet for modernizing systems. All these patterns are tools for modernizing applications, each with its own strengths and complexity, and each, in the wrong context, can become an anti-pattern. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/03/approaches.jpg" class="kg-image" alt="Application Modernization - Part 3: Unravel the data" loading="lazy" width="932" height="917" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/03/approaches.jpg 600w, https://www.stefanoturri.com/content/images/2023/03/approaches.jpg 932w" sizes="(min-width: 720px) 720px"><figcaption>Strategic approaches in application modernization</figcaption></figure><p>We need to choose the right balance of complexity based on the solution we want to address. &#xA0;As a criterion for this Litmus test, I would use the target envisioned architecture, that can either completely replace the old system or partially reuse it: </p><ul><li><strong>Replace:</strong> The old system no longer has strategic value, so the goal is moving out of legacy and transitioning completely to a new solution. In this scenario, <strong>CDC</strong> with <strong>Filtering and Transformation</strong> logic eases the transition to the new data model, with the goal of removing these steps with duplicated logic as soon as the transition is complete. &#xA0;This scenario would fit better with a <strong>monodirectional </strong>data flow.</li><li><strong>Coexist</strong>: The old system still has strategic value, so the goal is to get back ownership of the old legacy application and integrate it with the new components. In this scenario, <strong>Event Streaming</strong> will work best at decoupling the systems and replication data based on a shared semantical model, but CDC might still be effectively used if the two data models do not require significant transformation logic to be maintained. It&apos;s also a more appropriate target solution for <strong>bidirectional</strong> data flows. &#xA0;</li></ul><p>Especially with the second approach, It would be better to avoid a 2-speed architecture organizational model, but rather have the legacy application teams included in the overall IT process, to foster an effective Agile/DevSecOps environment in maintaining the two systems and their data flows. &#xA0;</p>]]></content:encoded></item><item><title><![CDATA[Application Modernization - Part 2: Transactions and events in microservices]]></title><description><![CDATA[<p>Cloud usage has steadily increased in recent years, with most enterprises adopting cloud solutions to deliver new applications and migrate workloads out of proprietary data centers. &#xA0;However, application modernization towards the cloud has not yet started for a lot of mission-critical systems and workloads. What&apos;s slowing this</p>]]></description><link>https://www.stefanoturri.com/application-modernization-part-2-transactions-and-events-in-microservices/</link><guid isPermaLink="false">6294ed7720fd5a0bb5238f65</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Mon, 06 Mar 2023 17:04:19 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/03/equilibrateTradoffs.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/03/equilibrateTradoffs.jpg" alt="Application Modernization - Part 2: Transactions and events in microservices"><p>Cloud usage has steadily increased in recent years, with most enterprises adopting cloud solutions to deliver new applications and migrate workloads out of proprietary data centers. &#xA0;However, application modernization towards the cloud has not yet started for a lot of mission-critical systems and workloads. What&apos;s slowing this down? reasons for this are in the complexity of interactions of Business Enterprise Platforms, and at the heart of it, we have the <strong>transactionality challenge </strong>of handling critical business data. </p><p>An effective move to the cloud needs to tackle this issue in some way to be effective. As a first step, let&apos;s start with defining the problem in the context of existing legacy platforms.</p><h2 id="traditional-transactional-applications">Traditional Transactional applications</h2><p>Some examples of transactional systems I have worked with include:</p><ul><li>Financial and banking systems that move money between accounts. Every operation must complete atomically, and failures should not cause side effects</li><li>Commercial platforms for Travel and Transportation, which ensure the consistent completion of the ticket purchase process. Either the ticket is issued, the seat reserved and the payment is finalized as a single action or no effect at all should happen.</li></ul><p>To achieve this traditional transactional applications are based on some key enabling technologies such as the Mainframe or the Relational Database, which provides facilities (e.g., 2-phase commits, ACID properties) to simplify the widespread usage and creation of transactional logic. </p><p>What&apos;s the commonality between a DB and Mainframe? it&apos;s the presence of a centralized component that ensures the consistency of the system, but what happens if we move toward cloud-native solutions with multiple interacting components on a globally distributed scale?</p><h2 id="why-not-distributed-transactions">Why not Distributed Transactions?</h2><p>Having a distributed and partitioned system introduces new failure possibilities and additional network delays and this makes the scenario more complex:</p><ul><li>Distributed transactions in SOA/WebServices solutions proved to be complex, and brittle with additional pain points created by tightly coupling systems. &#xA0;</li><li>Middleware such as relational databases become vulnerable to networking issues (e.g: <a href="https://en.wikipedia.org/wiki/Split-brain_(computing)">Split Brain</a>)</li></ul><p>Like Newtonian physics encountered one of its limits with handling the speed of light, here also the speed and availability of the communication network forces us to rethink the approach in broader terms.</p><p>Enter the CAP (or Brewer&apos;s) Theorem that tells us that <em>&quot;any distributed system or data store can simultaneously provide only two of three guarantees: consistency, availability, and partition tolerance (CAP)&quot; </em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/03/CAPTheorem-1.png" class="kg-image" alt="Application Modernization - Part 2: Transactions and events in microservices" loading="lazy" width="531" height="441"><figcaption>CAP Theorem</figcaption></figure><p>A new theory must improve on an old one, so how does CAP Theorem apply to legacy systems? </p><p>As seen above, these are based on centralized, high-performing systems, such as Relation DBMSs or Mainframe boxes. The key aspect of these solutions is the very limited use of partitioning and a strong focus on ACID consistency and replication for High Availability and Disaster Recovery. </p><p>So, these systems are examples of the <strong>Consistent-Available (CA) </strong>type of solution allowed by the CAP Theorem.<strong> </strong> &#xA0;</p><h2 id="towards-eventual-consistency">Towards Eventual Consistency </h2><p>Now, with the cloud, we are choosing to increase the partitioning<strong> </strong>and distribution of our systems. </p><p>So we are left with two types of possible systems:</p><ol><li><strong>Consistent-Partition Tolerant (CP)</strong></li><li><strong>Available-Partition Tolerant (AP)</strong></li></ol><p>While it would be nice to guarantee Consistency, to avoid compromising end-user service in a cloud-distributed solution composed of many moving parts, each of which can fail at any time, forces us to favor Availability.</p><p>But not all is lost on the Consistency side. While there is no guarantee that all clients see the same data at the same time, it is possible to quickly converge toward a share data consensus (a.k.a. <strong>Eventual Consistency</strong>). </p><h2 id="tools-to-achieve-it">Tools to achieve it</h2><p>Let&apos;s see how to combine some techniques to achieve this.</p><h3 id="component-internal-transactions">Component internal transactions</h3><p>Fortunately, like General Relativity did not invalidate Newtonian physics tools when applied in specific contexts, we can often continue to use traditional ACID transactions inside each component, since each component is tightly coupled in its implementation, with limited internal networking and partitioning.</p><p>This is a key criterion in Microservice Decomposition, which can be guided by the transactional boundaries of specific business entities to effectively partition a monolithic system. &#xA0;Domain-Driven-Design (DDD) techniques are based on defining atomic operations on &quot;<em>aggregates</em>&quot; that focus on business entity data that should be updated transactionally (<a href="https://www.stefanoturri.com/domain-model-versioning-a-cornerstone-for-architecture-evolution/">see also</a>).</p><p>How to break down a system thus become a critical architectural decision, to evaluate trade-offs in coarse-grained vs fine-grained service decomposition, since services doing transactional coordination might be more effective with the former approach. &#xA0;</p><h3 id="idempotency">Idempotency</h3><p>When communicating across components it&apos;s necessary to handle and resolve networking errors. Since messages can be lost either before or after the remote systems receive them a mechanism for safe retries is needed. This can be implemented using techniques to ensure idempotency. In short, <strong>Idempotency </strong>means that duplicate calls are not processed multiple times, preventing errors or unwanted side effects in the system (e.g. the same payment must be processed only once).</p><p>This can be implemented with some steps like this:</p><ol><li>The system receiving a message checks whether the message has been processed before. (e.g. by comparing its unique identifier to a list of previously processed messages).</li><li>If the message has not been processed before, the system processes the message and adds its outcome indexed by a unique identifier to the list of processed messages.</li><li>If there&apos;s a need for a synchronous response, the outcome (generated by the current or the previous call) is returned.</li></ol><p>This pattern is particularly effective for asynchronous notifications since:</p><ul><li>no response is needed (no step 3)</li><li>messaging systems (e.g., JMS, MQ, or Kafka) only-once/at least-once delivery guarantees can be used to simplify retries, limiting impacts on the overall process latency.</li><li>messaging systems usually automatically provides a unique identifier for messages</li></ul><h3 id="compensations">Compensations</h3><p>This technique is typical of Business Process Modelling (BPM). BPM solutions target process integrations across heterogeneous systems, and this is a scenario in which distributed transactions are not possible because of the loose coupling f the systems. In instances of a Business Process, compensations occur when the process cannot complete a series of operations after some of them have already been completed, so the process must backtrack and undo the previously completed steps.</p><p>The price to pay is the additional complexity of implementing the reversal operations and applying them to execute the backtrack correctly.</p><h3 id="saga-pattern">SAGA pattern </h3><p>This pattern combines the three previous techniques to implement a cloud-native BPM implementation, building a sequence of local transactions where each one of these updates the data of its competence (based on the service model decomposition), with each subsequent step activated by the completion of the previous one. Failures and interruptions in the process are identified (e.g., using timeouts) and trigger compensation logic, while external systems are notified of updates via event notification.</p><p>SAGA pattern can be implemented with different approaches using:</p><ul><li>a central process <strong>Orchestrator </strong>service</li><li>a <strong>Choreography </strong>based on message passing</li><li>a combination of both</li></ul><p>Here&apos;s an example of how I approach this in designing a solution for selling transportation Tickets:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/03/SAGA.png" class="kg-image" alt="Application Modernization - Part 2: Transactions and events in microservices" loading="lazy" width="773" height="504" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/03/SAGA.png 600w, https://www.stefanoturri.com/content/images/2023/03/SAGA.png 773w" sizes="(min-width: 720px) 720px"><figcaption>Implementing a SAGA for purchasing transportation tickets</figcaption></figure><p>I based the main transaction loop on a more coarse grain service orchestrating the completion of the transactional process, but I leveraged idempotency and event streaming to trigger notifications to update target systems that could tolerate more delays in reaching an eventually consistent state. </p><h2 id="conclusion-designing-applications">Conclusion: designing applications </h2><p>In the end, it is a trade-off between requirements and complexity. Different client contexts might require different solutions, even in the same industry (e.g., Banking in Europe tries to achieve ACID consistency, while other countries, such as the US, are more tolerant towards eventual consistency). &#xA0;</p><p>So, a crucial skill for Lead Architects and Designers is being able to work to shape requirements and solutions, together with other business and technical stakeholders. &#xA0;This can be facilitated by adopting a structured approach such as <a href="https://www.ibm.com/design/thinking/">Enterprise Design Thinking</a> to converge on mutually agreed expectations regarding solutions.</p><p>Transactional cloud-native systems based on microservices can be realized effectively, but the complexity increase had to be managed. On the requirement side, Design Thinking and <a href="https://www.stefanoturri.com/application-modernization-part-1-ddd-to-break-the-business-domain/">Domain-Driven-Design</a> are good tools to enable this, but implementation complexity should also be managed. I&apos;ll look in the future at techniques such as Async API and DevSecOps that enables managing larger and more complex solutions.</p>]]></content:encoded></item><item><title><![CDATA[Evolving Domain Model Entities]]></title><description><![CDATA[<p>Successful business platforms and architectures need to handle change and evolution gracefully. A good problem domain decomposition, documentation, and versioning of Business API and Entities, ideally using Domain-Driven-Design (DDD) principles, help evolve the functional side.</p><p>But there is an additional need. The choice of the Database platform and how to</p>]]></description><link>https://www.stefanoturri.com/domain-model-versioning-a-cornerstone-for-architecture-evolution/</link><guid isPermaLink="false">63d7877f20fd5a0bb52392e1</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Sun, 05 Feb 2023 16:38:17 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2023/01/pyramid-evolution.png" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2023/01/pyramid-evolution.png" alt="Evolving Domain Model Entities"><p>Successful business platforms and architectures need to handle change and evolution gracefully. A good problem domain decomposition, documentation, and versioning of Business API and Entities, ideally using Domain-Driven-Design (DDD) principles, help evolve the functional side.</p><p>But there is an additional need. The choice of the Database platform and how to use it will impose operational constraints on evolution options and costs.</p><p>Handling effectively the evolution of Persistent Data is a crucial aspect, especially when there is a need to keep data records available for a long time. A flexible and cost-effective solution is required for evolving in an Agile and incremental way the persistent data together with the Domain Model updates. </p><p>In this post I will touch on an approach I used on very large-scale engagement:</p><ul><li>Choosing a persistency Strategy</li><li>Versioning the persisted entities</li><li>Evolving the entities</li><li>Key Highlights </li></ul><h3 id="choosing-a-persistency-strategy-is-relational-vs-object-the-issue">Choosing a persistency Strategy: is Relational vs Object the issue? &#xA0;</h3><p>For this approach, the choice between Relation vs Object (or SQL vs noSQL) is not really the heart of the matter. &#xA0;What is really required is having a database layer that does not enforce a strict explicit schema, but allows an implicit one. &#xA0;With an implicit schema, an Aggregate (as a unit of transactional updates related to an entity) can be persisted and be flexibly updated only when needed.</p><p>NoSQL databases (such as MongoDB) are particularly effective in working with implicit schemas, but this strategy can be applied also using relational databases with the help of object mapping features (e.g. DB2 with native XML columns, or Postgres JSON support). &#xA0;I have used this mixed approach to persist and model transportation ticket entities effective, with the ability to choose the most appropriate strategy for each different entity/aggregate.</p><h3 id="versioning-domain-model-entitiesa-cornerstone-for-architecture-evolution">Versioning Domain Model entities - a cornerstone for architecture evolution</h3><p> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/01/AggregatesEvolution.writing.png" class="kg-image" alt="Evolving Domain Model Entities" loading="lazy" width="699" height="311" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/01/AggregatesEvolution.writing.png 600w, https://www.stefanoturri.com/content/images/2023/01/AggregatesEvolution.writing.png 699w"><figcaption>Entity/Aggregate persistency with version tracking</figcaption></figure><p>Applying this approach works in two steps, and the first one is the persisting/writing of the entity/aggregate data. </p><p>The Domain Model information is serialized using a standard format (e.g XML or JSON) and is always stored with the explicit version being used at the time of writing. &#xA0;Effective implementation of Domain entities serialization using frameworks (e.g JAXB), code-generation, or templating techniques. </p><h3 id="evolving-entities-through-chaining-model-transformations">Evolving Entities through chaining model transformations</h3><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2023/01/AggregatesEvolution.reading.png" class="kg-image" alt="Evolving Domain Model Entities" loading="lazy" width="699" height="326" srcset="https://www.stefanoturri.com/content/images/size/w600/2023/01/AggregatesEvolution.reading.png 600w, https://www.stefanoturri.com/content/images/2023/01/AggregatesEvolution.reading.png 699w"><figcaption>Entity/Aggregate retrieval with on-the-fly updates</figcaption></figure><p>The second step is reading back the persisted entity/aggregate.</p><p>After reading the raw data, version of the persisted entity is compared with the current one. If it&apos;s the same, good ! Otherwise the system applies a chain of tranformations to progressively update the information up to current version. </p><p>Transformations can be implemented in different ways. When persisting in XML format I did found XSLT a natural way to chain XML transformation, but plain code also works. &#xA0; </p><p>In the examples presented on the above picture, the aggregate with id #2, originally persisted with Version 2.0, is being read twice:</p><ul><li>The first time, when current aggregate Versio &#xA0;is 3.1, only transformation <strong>tB </strong>is applied</li><li>The second time, when aggregate Version has increased further to 4.0, thre transformations are chained <strong>tB, tC, and tD</strong>.</li></ul><p> The entity information, now up-to-date, can be deserialized with the same tools used for serializing it.</p><h3 id="key-highlights">Key Highlights</h3><p>Here I focus on some Key Highlights and consequences of adopting this approach. </p><ul><li>On-Demand vs Pre-Emptive evolution</li></ul><p>The approach described above updates the entitiy information when reading it, but different trade offs can be applied in &#xA0;chosing when to write it back to database:</p><ol><li>Only if the entity is being explicitely modified</li><li>After reading it </li><li>With a scheduled, pre-emptive updated</li></ol><p>Again, in all the scenarios, the entity information will have the updated Version number persisted together with the data.</p><p>The third option might be similar to a traditional schema evolution, but with this approach there is no global schema change that might cause outages, allowing each entity record to be updated in background at different times. These updates can be scheduled via batch processes or triggered with database DevOps automation (e.g. Flyway DB updated tasks on relational databases)</p><ul><li>Maintaining transformations</li></ul><p>Pre-emptive updates are important also to avoid an increase in the number of transformations to be managed. After having ensured that all the records have reache a certain versio level, the older transformations are no longer required.</p><ul><li>Encapsulation</li></ul><p>This is where the DDD approach and encapsulating the transformation logic into the Domain Services did really shine. These services will always provide outside an up-to-date view of data, with a clearly documented API and semantics, published through standards such as Web Services or REST Services through specific API Gateways. </p><p>The lack of encapsulation instead quickly becomes an anti-pattern, unless Data published outside of the Bounded Context is documented really well, with clearly defined API and data exchange formats. I did find examples of this antipattern in legacy data models (e.g. of old mainframe applications), with a combination of structured and relational data, evolved over time and lacking a consistent model description. Exposing this data directly to external consumers (e.g. through Copy Banking projects using Change Data Capture - CDC technologies) is then a very risky and complex proposition. &#xA0;</p><h3 id="conclusion">Conclusion</h3><p>This kind of persistency approach is not applicable in every scenario, but focus on handling application specific data over shared/normalized data models. This make it a good fit for encapsulating persistency in microservices implementation. </p>]]></content:encoded></item><item><title><![CDATA[Application Modernization - Part 1: Domain-Driven Design (DDD) to break the business domain]]></title><description><![CDATA[<p>Business enterprise platforms are complex systems with an ecosystem of many internal and external integrations and dependencies. Modernizing these kinds of applications requires a <strong>divide and conquer </strong>approach, with a transformation program composed of multiple steps, ideally performed in an Agile way. &#xA0;But, how to proceed? Let&apos;s</p>]]></description><link>https://www.stefanoturri.com/application-modernization-part-1-ddd-to-break-the-business-domain/</link><guid isPermaLink="false">6294ed4f20fd5a0bb5238f61</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Fri, 19 Aug 2022 19:25:27 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2022/05/DDD-breakdown.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2022/05/DDD-breakdown.jpeg" alt="Application Modernization - Part 1: Domain-Driven Design (DDD) to break the business domain"><p>Business enterprise platforms are complex systems with an ecosystem of many internal and external integrations and dependencies. Modernizing these kinds of applications requires a <strong>divide and conquer </strong>approach, with a transformation program composed of multiple steps, ideally performed in an Agile way. &#xA0;But, how to proceed? Let&apos;s see how Domain-Driven Design (DDD) addresses this.</p><h3 id="splitting-the-domain-into-bounded-contexts">Splitting the domain into Bounded Contexts</h3><p>DDD uses <strong>Bounded Contexts</strong> as a way to split the overall system into subdomains. It&apos;s important to note that each Bounded Context has also its own <strong>ubiquitous language</strong> that defines the concepts of that domain. &#xA0;This is important since Business Organizations and IT Systems are linked together in their evolution by <a href="https://en.wikipedia.org/wiki/Conway%27s_law">Conways&apos;s law</a>, so any effort to decompose the business domain should be based also on business criteria, and in different subdomains, concepts and entities might have their own specific and precise meaning. </p><p>Since a map is always a useful tool to understand the big picture (see also <a href="https://www.stefanoturri.com/my-map-on-technology/">this article</a>), let&apos;s see how the relationship between the Bounded Context could be visualized with a Context Map, such as this one that I have drawn inspired by Travel &amp; Transportation domain experience.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.stefanoturri.com/content/images/2022/08/image-1.png" class="kg-image" alt="Application Modernization - Part 1: Domain-Driven Design (DDD) to break the business domain" loading="lazy" width="2000" height="1103" srcset="https://www.stefanoturri.com/content/images/size/w600/2022/08/image-1.png 600w, https://www.stefanoturri.com/content/images/size/w1000/2022/08/image-1.png 1000w, https://www.stefanoturri.com/content/images/size/w1600/2022/08/image-1.png 1600w, https://www.stefanoturri.com/content/images/size/w2400/2022/08/image-1.png 2400w" sizes="(min-width: 1200px) 1200px"><figcaption>Travel &amp; Transportation Context Map</figcaption></figure><p>In this example, we see that the same concept might appear in more than one Bounded Context. Is this a problem? </p><p>No, this is on purpose, since in different contexts the same entity is used and characterized in its own specific way, based on the ubiquitous language of that specific context. </p><p>So in the above example, the Customer of the <strong>CRM Context </strong>is linked but not the same as the Customer of the <strong>Sale Context</strong>. However, these are linked via IDs, that allow semantic references across different contexts.</p><h3 id="whats-inside-a-bounded-context-aggregates-to-define-microservices">What&apos;s inside a Bounded Context? Aggregates to define microservices</h3><p>We have just seen that each Bounded Context has its own Domain entities, which sometimes can be simple, but often are a composite of multiple data in hierarchical (think object classes) or relational (think table) relationships. &#xA0;How can we organize the domain models of each context? </p><p>In DDD the divide and conquer is applied also at this level, grouping together domain data that is handled together into <strong>Aggregates</strong>. An aggregate is updated atomically and enforces rules of consistency dependent on the Business domain.</p><p>Multiple aggregates can refer to a single domain concept, and these can be related via IDs. For example, in a further drill down of the Context Map shown above, focusing CRM Context we see the main <strong>Customer</strong> aggregate but also other aggregates related to Customer via the ID, such as:</p><ul><li>PreferredDestinations</li><li>PreferredTravellers</li><li>PaymentOptions </li></ul><p>Each of these can be updated independently of the others, and are good candidates for a possible implementation as separate microservices, even in the same domain. </p><h3 id="next-step-transactionality">Next step: transactionality</h3><p>We have used two main DDD tools for Domain decomposition:</p><ul><li>Bounded Contexts</li><li>Aggregates</li></ul><p>These are the key to defining the application modernization journey since they drive the microservice solution. Specifically, a microservice cannot be bigger than a bounded context or smaller than an aggregate.</p><p>This also provides key elements for managing the transactions of the solution, with each Aggregate as the natural place for using database transaction facilities to ensure their atomic updates, with eventual consistency used between different Bounded Contexts.</p><p>But for this, I&apos;ll go more in-depth in Part II - &quot;<em>Transaction and Events microservices</em>&quot;.</p>]]></content:encoded></item><item><title><![CDATA[Application Modernization - Intro: A Gordian knot issue]]></title><description><![CDATA[<p>In a complex climb or on a mountaineering expedition the goal and the map (<a href="https://www.stefanoturri.com/my-map-on-technology/">see also</a>) to achieve it are essential but are not enough. &#xA0;On top of these, a set of trade-offs and decisions need to be handled to successfully and safely get to the goal, such as:</p>]]></description><link>https://www.stefanoturri.com/application-modernization-a-gordian-knot-issue/</link><guid isPermaLink="false">6294ebfe20fd5a0bb5238f59</guid><category><![CDATA[Technology]]></category><dc:creator><![CDATA[Stefano Turri]]></dc:creator><pubDate>Fri, 03 Jun 2022 16:06:31 GMT</pubDate><media:content url="https://www.stefanoturri.com/content/images/2022/05/GordianKnot.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://www.stefanoturri.com/content/images/2022/05/GordianKnot.jpg" alt="Application Modernization - Intro: A Gordian knot issue"><p>In a complex climb or on a mountaineering expedition the goal and the map (<a href="https://www.stefanoturri.com/my-map-on-technology/">see also</a>) to achieve it are essential but are not enough. &#xA0;On top of these, a set of trade-offs and decisions need to be handled to successfully and safely get to the goal, such as:</p><ul><li>how much material to have: in this case the advantage of less weight against safety and hunger in case of delays caused by poor weather</li><li>length of pitches and how many anchors to use in rock climbing: trading off speed vs the length of potential falls</li><li>Rope discipline: taking the time to keep the belays organized to avoid creating risks in handling messed up ropes</li></ul><p>Likewise, in complex IT systems, like <a href="https://www.stefanoturri.com/which-kind-of-business-platform/">Business Platforms</a>, it&apos;s not straightforward how to address a transformation toward a cloud solution. It&apos;s essential to manage the complexity of the problem across multiple aspects, decoupling problems and issues to avoid complexity pile-ups and exponentially difficult situations.</p><p>Decoupling will not be perfect, but like in the Gordian knot myth, forceful actions and decisions are necessary to get a situation unstuck and develop a new and better design equilibrium. &#xA0;These decisions will have costs (measured in different ways, such as money, time, effort, or lost features) that make it complex to find the target solution with the optimal trade-offs. However, not deciding is also a choice with its own costs (e.g because of security, maintainability, and obsolescence).</p><p>In this series, I plan to go in more depth into a set of different aspects to address and optimize these hard decisions, in the context of decoupling and evolving complex enterprise systems. Specifically, I will look into:</p><ol><li><strong><a href="https://www.stefanoturri.com/application-modernization-part-1-ddd-to-break-the-business-domain/">DDD to Break down the Business Domain</a> </strong>- Here the focus is on functional aspects of the business domain, to identify a better functional partition and decoupling of components. Also exploring techniques to break down independent microservices in a single bounded context.</li><li><strong>Transaction and Events microservices</strong> - &#xA0;Here the focus is on breaking the monolith by addressing the compute side. Traditional enterprise systems are centralized around a transactional core to guarantee business consistency. Cloud and distributed services require re-thinking of requirements and approaches (e.g. with Event Streaming and CQRS) to move from a traditional ACID approach to an eventually consistent one within the constraints of the CAP Theorem.</li><li><strong>Unravel the data </strong>- An often overlooked aspect, that creates long-lasting complexity in large-scale integrations that need data flowing across multiple systems and domains. This is a critical challenge in breaking monoliths since data encapsulation in old legacy systems is lacking because of ad-hoc batch point-to-point integrations. &#xA0;</li><li><strong>DevOps to assemble the pieces</strong> - All previous aspects focus on decoupling to handle the complexity of the application modernization initiative. This however increases the number of running pieces in the solution and DevOps is the key to handling this complexity, with a documented and auditable approach. This is not limited to traditional build and deploy pipelines but should address all tools to design, observe, manage and improve the solution.</li></ol>]]></content:encoded></item></channel></rss>