<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>software architecture &#8211; Rafael Bernard Araujo</title>
	<atom:link href="https://rafael.bernard-araujo.com/tag/software-architecture/feed" rel="self" type="application/rss+xml" />
	<link>https://rafael.bernard-araujo.com</link>
	<description>desenvolvendo... while(!success){  try(); }</description>
	<lastBuildDate>Tue, 19 May 2026 00:58:20 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<site xmlns="com-wordpress:feed-additions:1">21941730</site>	<item>
		<title>Building Evolutionary Architectures &#8211; Chapter 2: Fitness Functions</title>
		<link>https://rafael.bernard-araujo.com/building-evolutionary-architectures-chapter-2-fitness-functions.php</link>
					<comments>https://rafael.bernard-araujo.com/building-evolutionary-architectures-chapter-2-fitness-functions.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Tue, 19 May 2026 00:58:20 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[fitness functions]]></category>
		<category><![CDATA[software architecture]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2376</guid>

					<description><![CDATA[Chapter 2 introduces the concept of architectural fitness functions, the mechanism that makes &#34;evolutionary&#34; more than a buzzword. The origin: borrowing from evolutionary computing The term comes from genetic algorithm design. In evolutionary computing, a fitness function defines what &#34;better&#34; means so that solutions can gradually emerge through small changes across generations. The classic example: [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Chapter 2 introduces the concept of <strong>architectural fitness functions</strong>, the mechanism that makes &quot;evolutionary&quot; more than a buzzword.</p>
<h2>The origin: borrowing from evolutionary computing</h2>
<p>The term comes from genetic algorithm design. In evolutionary computing, a fitness function defines what &quot;better&quot; means so that solutions can gradually emerge through small changes across generations. The classic example: when using a genetic algorithm to optimise wing design, the fitness function assesses wind resistance, weight, air flow, and other desirable characteristics. At each generation, the engineer asks: is this closer to or further away from the goal?</p>
<p>Ford, Parsons and Kua borrow this concept for software:</p>
<blockquote>
<p><strong>An architectural fitness function provides an objective integrity assessment of some architectural characteristic(s).</strong></p>
</blockquote>
<p>In software, fitness functions check that developers preserve important architectural characteristics; the &quot;-ilities&quot; architects care about: scalability, security, performance, maintainability, resilience.</p>
<h2>The core idea</h2>
<p>An evolutionary architecture supports <em>guided</em>, incremental change across multiple dimensions. The key word is <strong><em>guided</em></strong>. Without guidance, incremental change is just drift. Fitness functions are what provide the guidance.</p>
<p>The fitness function protects the various architectural characteristics required for the system. These requirements differ greatly across systems and organisations: some require intense security; others require significant throughput or low latency; others need resilience to failure. A crucial early architecture decision is to define which dimensions matter most for a given system, based on business drivers, technical capabilities, and scale.</p>
<h2>Why this matters</h2>
<p>Most teams have implicit architectural goals: &quot;the system should be fast&quot;, &quot;services should be loosely coupled&quot;, &quot;we should be secure&quot;. The problem is that implicit goals erode. Nobody notices the slow degradation until a characteristic has already failed.</p>
<p>Fitness functions make the implicit explicit. They turn architectural aspirations into verifiable checks. Automated where possible, manual where necessary.</p>
<p>A key insight: improving one architectural dimension can accidentally harm another. Improving performance with caching might harm data freshness or security. Fitness functions act as guardrails that detect these tradeoff violations before they reach production.</p>
<h2>Categorising fitness functions</h2>
<p>The book defines several dimensions for classifying fitness functions:</p>
<h3>Atomic vs Holistic</h3>
<ul>
<li><strong>Atomic</strong> — tests one particular aspect of the architecture in isolation. Example: a unit test checking for cyclic dependencies in a package, or a code metric that checks cyclomatic complexity.</li>
<li><strong>Holistic</strong> — tests a combination of architectural aspects, assessing interactions between different concerns. Example: testing the number of concurrent users within a certain latency range while caching is enabled — this simultaneously checks scalability and data freshness. Holistic functions are harder to build but capture what atomic ones miss.</li>
</ul>
<h3>Triggered vs Continuous vs Temporal</h3>
<ul>
<li><strong>Triggered</strong> — executed in response to a specific event: a developer running a unit test, a CI pipeline stage, a QA person performing exploratory testing.</li>
<li><strong>Continuous</strong> — constant verification of architectural aspects. Monitoring and alerting are the classic examples. Netflix's Chaos Monkey — which runs in production and randomly terminates instances — is a continuous holistic fitness function that forces teams to build resilient services.</li>
<li><strong>Temporal</strong> — have a particular time component. Example: a reminder to check whether important security updates have been performed, or a scheduled dependency check that alerts on outdated libraries.</li>
</ul>
<h3>Static vs Dynamic</h3>
<ul>
<li><strong>Static</strong> — fixed predefined acceptable values. Binary pass/fail (a unit test), or a threshold (latency must be &lt; 200ms).</li>
<li><strong>Dynamic</strong> — acceptable values depend on context. Acceptable latency might depend on actual system scale; security requirements might vary based on the regulatory environment.</li>
</ul>
<h3>Automated vs Manual</h3>
<ul>
<li><strong>Automated</strong> — unit tests, deployment pipeline checks, stress tests, chaos engineering. Ideally as much automation as possible.</li>
<li><strong>Manual</strong> — some things can't be automated (legal approval requirements, certain QA processes). Some things aren't automated <em>yet</em>. The goal is to push the boundary toward automation over time.</li>
</ul>
<h2>What fitness functions look like in practice</h2>
<p>Fitness functions encompass existing engineering practices but also extend beyond them:</p>
<table>
<thead>
<tr>
<th>Category</th>
<th>Examples</th>
<th>Type</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Architecture tests</strong></td>
<td>phpat (PHP/PHPStan) or ts-arch (TypeScript) rules checking component dependencies, layer violations, naming conventions, import directionality</td>
<td>Atomic, triggered</td>
</tr>
<tr>
<td><strong>Code metrics</strong></td>
<td>Cyclomatic complexity thresholds, afferent/efferent coupling limits</td>
<td>Atomic, triggered</td>
</tr>
<tr>
<td><strong>Contract tests</strong></td>
<td>API contract verification ensuring requirements are met</td>
<td>Atomic, triggered</td>
</tr>
<tr>
<td><strong>Security scanning</strong></td>
<td>Vulnerability scanning, licence compliance checks for open-source dependencies</td>
<td>Atomic, triggered</td>
</tr>
<tr>
<td><strong>Performance testing</strong></td>
<td>Load tests validating latency SLOs under expected concurrency</td>
<td>Holistic, triggered</td>
</tr>
<tr>
<td><strong>Monitoring &amp; alerting</strong></td>
<td>p99 latency monitors, error rate thresholds, SLO compliance dashboards</td>
<td>Atomic/holistic, continuous</td>
</tr>
<tr>
<td><strong>Chaos engineering</strong></td>
<td>Netflix Simian Army — randomly terminating instances, availability zones, or entire regions</td>
<td>Holistic, continuous</td>
</tr>
<tr>
<td><strong>Security reviews</strong></td>
<td>Quarterly security audits, penetration testing</td>
<td>Holistic, manual/temporal</td>
</tr>
<tr>
<td><strong>Dependency freshness</strong></td>
<td>Scheduled checks for outdated libraries or security patches</td>
<td>Atomic, temporal</td>
</tr>
</tbody>
</table>
<p><strong>The best fitness functions are</strong> <strong>automated and triggered</strong>: they give feedback at the point of change, not weeks later. Place them in the deployment pipeline. Fast atomic functions early, slow holistic functions later.</p>
<h2>Deployment pipelines as the enforcement mechanism</h2>
<p>Fitness functions only work if they're part of the delivery workflow. The deployment pipeline is where they live:</p>
<ol>
<li><strong>Early stages</strong> — fast, atomic checks: architecture tests (phpat, ts-arch), code metrics, linting, security scanning, contract tests.</li>
<li><strong>Middle stages</strong> — integration and performance tests, holistic triggered functions.</li>
<li><strong>Later stages / production</strong> — continuous monitoring, chaos engineering, temporal reminders.</li>
</ol>
<p>As Thoughtworks puts it: <em>&quot;creating the desired fitness functions — and including them in appropriate delivery pipelines — communicates these metrics as an important aspect of enterprise architecture.&quot;</em></p>
<h2>The four layers of fitness (from NILUS)</h2>
<p>A useful framing from practice splits fitness functions across four layers:</p>
<ol>
<li><strong>Structural fitness</strong> — code dependencies, database access patterns, API contracts, service boundaries.</li>
<li><strong>Behavioural fitness</strong> — latency, resilience, throughput, consistency, recovery behaviour.</li>
<li><strong>Operational fitness</strong> — deployment independence, observability coverage, runbook readiness, SLO compliance.</li>
<li><strong>Semantic fitness</strong> — bounded context integrity, event naming quality, policy ownership, domain model consistency.</li>
</ol>
<p>Most teams start at structural (the easiest to automate) and never reach semantic. But <strong>semantic fitness functions</strong> (checking that your domain model remains coherent as it evolves) <strong>are often the most valuable for long-lived systems</strong>.</p>
<h2>Systems thinking</h2>
<p>Dr. Russell Ackoff's quote captures the deeper point:</p>
<blockquote>
<p>A system is never the sum of its parts. It is the product of the interaction of its parts.</p>
</blockquote>
<p>Fitness functions that only measure individual components miss the point. The interesting failures happen at integration boundaries — between services, between teams, between intentions and reality. Holistic fitness functions (end-to-end latency, deployment frequency, change failure rate) capture what atomic ones cannot.</p>
<h2>How I'm applying this</h2>
<p>This connects directly to work I care about:</p>
<ul>
<li><strong>Platform modernisations</strong> I've designed and implemented were operational fitness: bringing reliability through automated deployment pipelines, observability and monitoring, and runbook readiness. I just called it &quot;keeping things running.&quot;</li>
<li><strong>ADRs</strong> capture the <em>decisions</em>. Fitness functions verify those decisions are still holding. Decisions and verification go hand in hand.</li>
<li><strong>Kent Beck's Test Desiderata</strong> is itself a fitness function for test quality — a checklist of characteristics that tests should exhibit (isolated, deterministic, fast, behavioural, structure-insensitive, specific, predictive).</li>
<li><strong>DORA metrics</strong> (deployment frequency, lead time, change failure rate, MTTR) are fitness functions for delivery capability.</li>
<li><strong>Code health metrics</strong> (as described in the Loveholidays case from <a href="https://rafael.bernard-araujo.com/tropecando-120.php">Tropeçando 120</a>) are fitness functions that enabled their AI-first shift — they invested in code health metrics <em>before</em> adopting AI, which is exactly the fitness-function-first approach.</li>
<li><strong>phpat</strong> (PHP, as a PHPStan extension) and <strong>ts-arch</strong> (TypeScript) — writing architecture rules as unit tests that run in CI is the purest implementation of triggered atomic fitness functions.</li>
</ul>
<p>The pattern: define what matters, measure it, enforce it automatically, and revisit periodically. Architecture that can't be verified can't evolve — it can only decay.</p>
<h2>Further reading</h2>
<ul>
<li><a href="https://martinfowler.com/articles/evo-arch-forward.html">Foreword to Building Evolutionary Architectures</a> — Martin Fowler's foreword to the book, framing fitness functions as the mechanism to monitor architectural state in an evolutionary style.</li>
<li><a href="https://www.thoughtworks.com/en-gb/insights/articles/fitness-function-driven-development">Fitness function-driven development</a> — Paula Paul &amp; Rosemary Wang apply the TDD mindset to architecture: write the fitness function first, then develop to pass it.</li>
<li><a href="https://martinfowler.com/articles/fitness-functions-data-products.html">Governing data products using fitness functions</a> — Extending fitness functions into Data Mesh governance (2024).</li>
<li><a href="https://www.thoughtworks.com/en-ca/insights/books/building-evolutionaryarchitectures-second-edition">Building Evolutionary Architectures, 2nd Edition</a> — The book.</li>
</ul>
<hr />
<p><em>Part of my reading notes on <a href="https://rafael.bernard-araujo.com/building-evolutionary-architectures-notes.php">Building Evolutionary Architectures</a> (Ford, Parsons, Kua).</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/building-evolutionary-architectures-chapter-2-fitness-functions.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2376</post-id>	</item>
		<item>
		<title>Building Evolutionary Architectures Notes</title>
		<link>https://rafael.bernard-araujo.com/building-evolutionary-architectures-notes.php</link>
					<comments>https://rafael.bernard-araujo.com/building-evolutionary-architectures-notes.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Tue, 19 May 2026 00:30:15 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[software architecture]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2378</guid>

					<description><![CDATA[Notes Chapter 1: Software Architecture Despite our best efforts, software becomes harder to change over time. For a variety of reasons, the parts that comprise software systems defy easy modifications, becoming more brittle and intractable over time. Changes in software projects are usually driven by a reevaluation of functionality and/or scope. But another type of [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>Notes</h2>
<h3>Chapter 1: Software Architecture</h3>
<blockquote>
<p>Despite our best efforts, software becomes harder to change over time. For a variety of reasons, the parts that comprise software systems defy easy modifications, becoming more brittle and intractable over time. Changes in software projects are usually driven by a reevaluation of functionality and/or scope. But another type of change occurs outside the control of architects and long-term planners. Though architects like to be able to strategically plan for the future, the constantly changing software development ecosystem makes that difficult. Since we can't avoid change, we need to exploit it.</p>
</blockquote>
<p>— On <em>Evolutionary Architecture</em></p>
<blockquote>
<p>An evolutionary architecture supports guided, incremental changes across multiple dimensions.</p>
</blockquote>
<p>— Definition of <em>Evolutionary Architecture</em></p>
<h3>Related: Ralph Johnson on Architecture (via Fowler, 2003)</h3>
<p>These quotes from Ralph Johnson (from [[2026-04-24 - Martin Fowler - Who Needs an Architect|Who Needs an Architect?]]) are foundational to the ideas in this book:</p>
<blockquote>
<p>&quot;In most successful software projects, the expert developers working on that project have a shared understanding of the system design. This shared understanding is called 'architecture.' [...] the architecture only includes the components and interfaces that are understood by all the developers.&quot;</p>
</blockquote>
<p>— Architecture as a social construct, not a diagram.</p>
<blockquote>
<p>&quot;There is no theoretical reason that anything is hard to change about software. If you pick any one aspect of software then you can make it easy to change, but we don't know how to make everything easy to change. Making something easy to change makes the overall system a little more complex, and making everything easy to change makes the entire system very complex. Complexity is what makes software hard to change. That, and duplication.&quot;</p>
</blockquote>
<p>— The fundamental tension that evolutionary architectures try to navigate: change vs complexity.</p>
<blockquote>
<p>&quot;Software is not limited by physics, like buildings are. It is limited by imagination, by design, by organization. In short, it is limited by properties of people, not by properties of the world. 'We have met the enemy, and he is us.'&quot;</p>
</blockquote>
<p>— The constraint is us, not the technology.</p>
<h3>Chapter 2: Fitness Functions</h3>
<blockquote>
<p>An evolutionary architecture supports <em>guided</em>, incremental change across multiple dimensions.</p>
</blockquote>
<p>-- on FItness Functions, chapter 2</p>
<blockquote>
<p>The fitness function protects the various archutectural characteristics required for the system. The specific architectural requirements differ greatly across systems and organizations, based on business drivers, technical capabilities, and a host of other factors. Some systems require intense security; others require significant throughput factors.</p>
</blockquote>
<p>-- on Fitness Functions, chapter 2</p>
<blockquote>
<p>A system is never the sum of its parts. It is the product of the interaction of its parts.</p>
</blockquote>
<p>-- Dr. Russel Ackoff</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/building-evolutionary-architectures-notes.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2378</post-id>	</item>
		<item>
		<title>Tropeçando 120</title>
		<link>https://rafael.bernard-araujo.com/tropecando-120.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-120.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Mon, 18 May 2026 00:02:13 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[developer experience]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2363</guid>

					<description><![CDATA[AI Management &#38; Organizational Restructuring The Foreman Problem: Managing Teams When Your Best Worker Isn't Human - Willian Correa Every major technology shift invented a new management role. Steam power → foreman. Office computing → project manager. Internet → product manager. AI is doing the same, but this time the failure mode is invisible: confident, [&#8230;]]]></description>
										<content:encoded><![CDATA[<h3>AI Management &amp; Organizational Restructuring</h3>
<p><a href="https://businessasusual.io/p/the-foreman-problem-managing-teams">The Foreman Problem: Managing Teams When Your Best Worker Isn't Human</a> - Willian Correa</p>
<blockquote>
<p>Every major technology shift invented a new management role. Steam power → foreman. Office computing → project manager. Internet → product manager. AI is doing the same, but this time the failure mode is invisible: confident, polished, wrong output. The new job is not directing effort but verifying that things that <em>look</em> like they're running actually are.</p>
</blockquote>
<p><a href="https://theengineeringmanager.substack.com/p/who-will-be-the-senior-engineers">Who Will Be the Senior Engineers of 2035?</a> - James Stanier</p>
<blockquote>
<p>The traditional junior-to-senior pipeline is breaking: entry-level tech postings down 67% since 2022, junior employment down ~20%. Firms adopting AI saw junior employment fall 7.7% vs non-adopters. 54% of engineering leaders plan to hire fewer juniors.</p>
</blockquote>
<h3>Compound Engineering &amp; Code Health</h3>
<p><a href="https://refactoring.fm/p/the-compounding-software-factory">The Compounding Software Factory</a> - Luca Rossi (Software Factory series, Part 3 of 3)</p>
<blockquote>
<p>What causes teams to degrade: poor coding hygiene (bad testing, poor code health, missing abstractions), failure to capture knowledge (no ADRs, no playbooks, no snapshots), and building the wrong things.</p>
</blockquote>
<p><a href="https://refactoring.fm/p/ai-coding-meets-code-health-with">AI Coding Meets Code Health</a> - Stuart Caborn</p>
<blockquote>
<p>Loveholidays' journey to becoming an AI-first engineering organization. Core thesis: code health is the foundation for successful AI adoption. By deliberately investing in code health metrics <em>before</em> adopting AI, they achieved 80+ deployments/month, 60% AI-written code, &lt;1% change failure rate, all while maintaining elite code health.</p>
</blockquote>
<h3>Security &amp; Infrastructure</h3>
<p><a href="https://www.wiz.io/blog/github-actions-security-ai-powered-actions-vulnerabilities">The (In)security Landscape of AI-Powered GitHub Actions</a> - Shay Berkovich</p>
<blockquote>
<p>AI-powered GitHub Actions from vendors like OpenAI, Anthropic, and Google are now running in thousands of public workflows. Research found bypasses of non-default configurations letting any external attacker trigger AI execution, a novel secret exfiltration vector for dynamically-created credential files, and widespread misconfigurations in production workflows.</p>
</blockquote>
<p><a href="https://www.allthingsdistributed.com/2026/04/the-invisible-engineering-behind-lambdas-network.html">The Invisible Engineering Behind Lambda's Network</a> - Werner Vogels</p>
<blockquote>
<p>A decade-long story of invisible infrastructure engineering by Lambda's networking team.</p>
</blockquote>
<h3>Career &amp; Token Economics</h3>
<p><a href="https://businessasual.io/p/tokenmaxxing-is-the-budget-game-played">Tokenmaxxing Is the Budget Game Played With AI Tokens</a> - Willian Correa</p>
<blockquote>
<p>Tokenmaxxing — maximising AI token consumption for visibility — is the corporate &quot;use it or lose it&quot; budget game in a new currency. Meta's internal &quot;Claudeonomics&quot; leaderboard ranked 85K employees by token consumption; top user burned 281B tokens in 30 days.</p>
</blockquote>
<h3>Tools</h3>
<p><a href="https://docs.docker.com/compose/how-tos/file-watch/">Use Compose Watch</a></p>
<p>Docker bind volumes gets a supercharge. Compose Watch does not replace bind mounts but exists as a companion specifically suited to developing in containers.</p>
<blockquote>
<p>More importantly, watch allows for greater granularity than is practical with a bind mount. Watch rules let you ignore specific files or entire directories within the watched tree.<br />
For example, in a Node.js project, it's not recommended to sync the node_modules/ directory. Even though JavaScript is interpreted, npm packages can contain native code that is not portable across platforms.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-120.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2363</post-id>	</item>
		<item>
		<title>Introduce Parameter Object &#124; Refactoring Patterns</title>
		<link>https://rafael.bernard-araujo.com/introduce-parameter-object-refactoring-patterns.php</link>
					<comments>https://rafael.bernard-araujo.com/introduce-parameter-object-refactoring-patterns.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 05:45:10 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[refactoring patterns]]></category>
		<category><![CDATA[rust]]></category>
		<category><![CDATA[software architecture]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2357</guid>

					<description><![CDATA[This refactoring pattern involves grouping parameters that naturally go together into a single object. When you see a group of data items that regularly travel together, appearing in function after function, it's a sign they should be combined into a single object. Check https://rafael.bernard-araujo.com/refactoring-patterns/introduce-parameter-object There are PHP and Rust implemenation examples.]]></description>
										<content:encoded><![CDATA[<p>This refactoring pattern involves grouping parameters that naturally go together into a single object. When you see a group of data items that regularly travel together, appearing in function after function, it's a sign they should be combined into a single object.</p>
<p>Check <a href="https://rafael.bernard-araujo.com/refactoring-patterns/introduce-parameter-object">https://rafael.bernard-araujo.com/refactoring-patterns/introduce-parameter-object</a></p>
<p>There are PHP and Rust implemenation examples.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/introduce-parameter-object-refactoring-patterns.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2357</post-id>	</item>
		<item>
		<title>Tropeçando 118</title>
		<link>https://rafael.bernard-araujo.com/tropecando-118.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-118.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 02:47:29 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[domain-driven design]]></category>
		<category><![CDATA[ia]]></category>
		<category><![CDATA[middleware]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2273</guid>

					<description><![CDATA[Your AI Coding agent doesn’t know when to ask for help Why do multi-agent coding systems fall apart on complex, real-world tasks? How to Manage Context in AI Coding Focus on building multiplayer, dynamic systems that provide the right information reliably, rather than crafting magical wording. Design workflows where AI can fetch what it needs [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://medium.com/@igorcosta/your-ai-coding-agent-doesnt-know-when-to-ask-for-help-75c10be496c5">Your AI Coding agent doesn’t know when to ask for help</a></p>
<blockquote>
<p>Why do multi-agent coding systems fall apart on complex, real-world tasks?</p>
</blockquote>
<p><a href="https://refactoring.fm/p/managing-context-for-ai-coding?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web">How to Manage Context in AI Coding</a></p>
<blockquote>
<p>Focus on building multiplayer, dynamic systems that provide the right information reliably, rather than crafting magical wording. Design workflows where AI can fetch what it needs automatically.</p>
</blockquote>
<p><a href="https://martinfowler.com/bliki/ValueObject.html">Value Object</a></p>
<blockquote>
<p>When programming, I often find it's useful to represent things as a compound.</p>
</blockquote>
<p><a href="https://martinfowler.com/eaaDev/Range.html">Range - Further Enterprise Application Architecture development</a></p>
<blockquote>
<p>It's quite common to see comparisons where a value is checked against a range of values. Ranges are usually handled by a pair of values and you check against them both. Range instead uses a single object to represent the range as a whole, and then provides the relevant operations to test to see if values fall in the range and to compare ranges.</p>
</blockquote>
<p><a href="https://dzone.com/articles/jdk-memory-bloat-containers?email_hash=d5eba7663d4e04a1e0f4886103285fd8">JDK 17 Memory Bloat in Containers: A Post-Mortem</a></p>
<p>I just love runtime upgrades. Runtime upgrade are very important. And they need careful planning. Not unusual that they teach us important lessons for the next upgrade.</p>
<blockquote>
<p>When engineering teams modernize Java applications, the shift from JDK 8 to newer Long-Term Support (LTS) versions, such as JDK 11, 17, and soon 21, might seem straightforward at first. Since Java maintains backward compatibility, it's easy to assume that the runtime behavior will remain largely unchanged. However, that's far from reality.</p>
</blockquote>
<p><a href="https://tidyfirst.substack.com/p/my-fitbit-buzzed-and-i-understood?utm_source=post-email-title&amp;publication_id=256838&amp;post_id=180524868&amp;utm_campaign=email-post-title&amp;isFreemail=false&amp;r=6fpjy1&amp;triedRedirect=true&amp;utm_medium=email">My Fitbit Buzzed and I Understood Enshittification</a></p>
<blockquote>
<p>My Fitbit started buzzing at me a year ago. “It looks like you’re exercising.”</p>
<p>Product development is also an exercise in human relationships. And when we reduce those relationships to metrics, we lose something essential. We lose the ability to say, “This would be rude.” We lose the ability to treat users like people instead of engagement vectors.</p>
</blockquote>
<p><a href="https://maximegosselin.com/posts/using-the-middleware-pattern-to-extend-php-libraries/">Using the Middleware Pattern to Extend PHP Libraries</a></p>
<blockquote>
<p>PSR-15 did not invent middleware. But it showed the PHP community what a well-designed, typed middleware interface looks like. There is no reason to leave that idea at the HTTP layer.</p>
<p>If you maintain a PHP library with any non-trivial processing, consider building middleware support in from day one. Your users will thank you, and so will your future self.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-118.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2273</post-id>	</item>
		<item>
		<title>Tropeçando 114</title>
		<link>https://rafael.bernard-araujo.com/tropecando-114.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-114.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Fri, 27 Sep 2024 04:44:36 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[developer experience]]></category>
		<category><![CDATA[front-end]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PostGreSQL]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[testing]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2076</guid>

					<description><![CDATA[What's new in PHP 8.4 Don't miss these great features Property hooks new without parentheses JIT changes RFC Implicit nullable types New HTML5 support array_find Serverless Ephemeral Environments with Serverful AWS Services How to successfully use ephemeral environments with serverful resources, with example in the AWS CDK and Typescript. Comparison of Serverless Development and Hosting [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://stitcher.io/blog/new-in-php-84">What's new in PHP 8.4</a></p>
<blockquote>
<p>Don't miss these great features</p>
<ul>
<li>Property hooks</li>
<li>new without parentheses</li>
<li>JIT changes RFC</li>
<li>Implicit nullable types</li>
<li>New HTML5 support</li>
<li>array_find</li>
</ul>
</blockquote>
<p><a href="https://blog.serverlessadvocate.com/serverless-ephemeral-environments-with-serverful-aws-services-c803d24b353f">Serverless Ephemeral Environments with Serverful AWS Services</a></p>
<blockquote>
<p>How to successfully use ephemeral environments with serverful resources, with example in the AWS CDK and Typescript.</p>
</blockquote>
<p><a href="https://dev.to/aws-builders/comparison-of-serverless-development-and-hosting-platforms-5dld">Comparison of Serverless Development and Hosting Platforms</a></p>
<blockquote>
<p>When designing solutions in the cloud, there is (almost) always more than one alternative for achieving the same goal.</p>
<p>One of the characteristics of cloud-native applications is the ability to have an automated development process (such as the use of CI/CD pipelines).</p>
<p>In this blog post, I will compare serverless solutions for developing and hosting web and mobile applications in the cloud. </p>
</blockquote>
<p><a href="https://vnegrisolo.github.io/postgresql/generate-fake-data-using-sql">Generating fake data using SQL</a></p>
<blockquote>
<p>Fake data are very useful in development environment for testing your application or some query performances for example.</p>
</blockquote>
<p><a href="https://khalilstemmler.com/articles/client-side-architecture/introduction/">Client-Side Architecture Basics [Guide]</a></p>
<blockquote>
<p>Though the tools we use to build client-side web apps have changed substantially over the years, the fundamental principles behind designing robust software have remained relatively the same. In this guide, we go back to basics and discuss a better way to think about the front-end architecture using modern tools like React, xState, and Apollo Client.</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-114.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2076</post-id>	</item>
		<item>
		<title>Notes &#8211; ServerlessDays NZ 2024</title>
		<link>https://rafael.bernard-araujo.com/notes-serverlessdays-nz-2024.php</link>
					<comments>https://rafael.bernard-araujo.com/notes-serverlessdays-nz-2024.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Wed, 05 Jun 2024 23:57:13 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=2011</guid>

					<description><![CDATA[Those are my notes for ServelessDays NZ - Auckland, at 24th May 2024. Sheen Brisals - Think, Architect, and Build Serverless Applications as Set Pieces During ServerlessDaysNZ Sheen Brisals gave the talk Think, Architect, Build, Sustain Serverless Application Set Pieces. It was full of important insights to Set Pieces and sustain Serverless Applications. I particularly [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Those are my notes for <a href="https://anz.serverlessdays.io/auckland/">ServelessDays NZ - Auckland, at 24th May 2024</a>.</p>
<h2>Sheen Brisals - Think, Architect, and Build Serverless Applications as Set Pieces</h2>
<p>During <a href="https://lnkd.in/gsACxdcY">ServerlessDaysNZ</a> Sheen Brisals gave the talk Think, Architect, Build, Sustain Serverless Application Set Pieces. It was full of important insights to Set Pieces and sustain Serverless Applications.</p>
<p>I particularly liked how he touched on the fact that legacy applications being rewritten to Serverless is a thing, as this is everywhere being part of lots of engineers' lives.</p>
<p>More than that, Brisals highlighted how patterns and pivotal for a maintainable and reliable application, despite the execution model:</p>
<ul>
<li>Identify Domains so you can decouple a domain to rewrite it more effectively</li>
<li>Complexity is better abstracted, becoming simpler, when you know and apply good proven Patterns -- the exception is to invent a new one</li>
<li>Design Patterns, Architecture Patterns, Execution Model patterns, Software Design, etc, will improve the quality of your Application. As Serverless will likely push you to learn them, you have the opportunity to develop as an Architect</li>
<li>The Serverless should help you to think in the whole picture, as the settled pieces need communication between them, therefore optimising value to the end-user</li>
</ul>
<p>Unfortunately, I was not selected to win the book Serverless Development on AWS, but for those who won, I wish they could learn a lot there. What a great indication of how good a fellow is Sheen. Giving away those books is a gigantic contribution to the community!</p>
<p>I am very pleased to know you in person, Sheen.</p>
<p>This presentation talked a lot with Michael Walmsley's. So nice.</p>
<h2>Heitor Lessa - Let Them Retry: Idempotency for the Rest of Us</h2>
<p>Despite being common to talk or to assess if a given application or infrastructure follows best practices and great architectural patterns, implementing this is a challenge for development teams for different reasons.</p>
<p>Heitor Lessa, in his talk <a href="https://lnkd.in/giRTzEvx">&quot;Let Them Retry: Idempotency for the Rest of Us&quot;</a>, demonstrates how a tool that improves the Developer Experience bringing the implementation of the patterns close to the code is powerful to win adoption. PowerTools is a developer toolkit to accelerate development providing interfaces and abstractions to implement Serverless best practices.</p>
<p>Heitor used a sample code, emulating an existent codebase, from an application already working in Production. We had the opportunity to see the appeal of <a href="https://github.com/aws-powertools/">PowerTools</a>. Usually, Idempotency (to handle duplicated transactions) is associated with a good amount of change in the code. Still, PowerTools was designed to introduce no or very few impacts to a code that is very dangerous to change. As building blocks, adding more complex functionalities, such as caching, payload tempering and failure mode.</p>
<p>The existence of tools like PowerTools reinforces how implementing good and proven software (and architectural) patterns is pivotal for a scalable and reliable application. The Serverless execution mode can mislead to relaxed code, but that would weaken the performance and stability of an application. The lesson is that working smarter is applying known solutions for specific problems.</p>
<p>PowerTools provides a wide range of functionalities, not surprisingly being able to match Well-Architected frameworks in their implementation: Secrets/System Manager Parameters, Event Source Data Classes, Validation, Feature Flag, Idempotency, Data Masking, Streaming, Middleware, JMESPath, Batch processing, Metrics, Tracing. We avoid writing boilerplates, repeated code and even the need to create a shared lib of constructs ourselves. The community is improving it.</p>
<p>PowerTools is a helpful tool to implement these features. This is an opportunity to learn and deep dive into best practices and designs. It also enhances how you observe and monitor your application. It is a serious tool to consider if you intend to leverage how your code is executed, deployed, monitored and performed.</p>
<p>In his talk, Heitor implemented, live in the meeting, Idempotency into a legacy code. He enriched it with failure modes, caching, payload tampering and order tolerance. So, PowerTools is also very easy and quick to use.</p>
<blockquote>
<p>Best practices for everyone</p>
<ul>
<li>Heitor Lessa</li>
</ul>
</blockquote>
<h2>Michael Walmsley - Unleashing Serverless Scalability on AWS: Practical Strategies and Proven Patterns</h2>
<p>Some started Michael Walmsley introduction saying &quot;A fantastic human being...&quot;. And I will start from there as well because I have experienced that myself.</p>
<p>I bumped into Michael while walking to the conference venue. I first heard about it from a great friend, Joshua Katz, who was impressed with Michael. It was a very pleasant walk while sharing quick impressions of being AWS Community Builders and excitement about the conference.</p>
<p>It happens that Michael is now an AWS Hero with many years of experience to share. One of the first things he said in his talk was replaying Suzana Melo Moraes (you should listen to this girl - so inspiring), who has three years in tech, when she was saying that, mostly every day, she struggles with something usually starting from having no idea how to fix a particular problem she was assigned to solve. Michael sympathised, saying that, even after 30 years, there are days that things happen to him the same way. This happens in everyone involved in this field and it was so humbling coming from him.</p>
<p>As usual, Michael doesn't keep secrets by himself but shares insightful tips. His presentation was about Unleashing Serverless Scalability on AWS:</p>
<ul>
<li>Start the design with the needed scalability in mind (can you see that links to Sheen Brassals talk?)</li>
<li>Master and understand well the limits, they are there for a reason and as early you design your application to work with them, better design your application and scalable-ready it is</li>
<li>Events, Messages, and Commands are the way of communication for Serverless and a must-know subject</li>
<li>Do not ignore Flow Control</li>
<li>Break your application limits before someone else does -- use performance tests in your favour</li>
<li>Study and use proven patterns (check <a href="https://serverlessland.com">https://serverlessland.com</a>)</li>
</ul>
<h2>Brad Jacques - Delivering at pace while evolving a Serverless architecture</h2>
<p><a href="https://www.linkedin.com/in/bradjacques/">Brad Jacques</a> delivered a talk titled <a href="https://lnkd.in/grFK_7ND">&quot;Delivering at pace while evolving a Serverless architecture&quot;</a> at ServerlessDays NZ. Brad covered a challenging project where file manipulation use cases were an important feature. </p>
<p>&quot;Complexity is everywhere&quot;. Brad could not help it advise that a successful delivery starts from breaking the complexity into pieces, to plan ahead of time and to <strong>do the simple things first</strong>. He mentioned that the deadline was short, affirming it was the right strategy to evolve the architecture.</p>
<p>He also stressed the use of established patterns for success, such as breaking down complexity, identifying domains and context boundaries, and understanding limits and messaging.</p>
<p>It was also important how the work was planned with the team. Having a small committed team, fast feedback loops and continuous measurement were key to proving the solution was correct.</p>
<p>The summary is so great that I will copy it here entirely:</p>
<ul>
<li>Do the simple thing first</li>
<li>Small teams with a fast feedback loop (showcase often)</li>
<li>Identify risk early, shift left, and spike</li>
<li>Continuously measure performance, and stress test</li>
<li>Isolate context boundaries</li>
<li>The solution must prove itself correct</li>
</ul>
<p>Brad's insights were based on his experience with a new project for a major client at a consultancy company. However, it was clear that the principles and strategies he shared apply to any application, in any industry, and of any size.</p>
<p>His parting advice was to &quot;evolve your architecture, measure, and make decisions throughout the process.&quot;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/notes-serverlessdays-nz-2024.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2011</post-id>	</item>
		<item>
		<title>Tropeçando 111</title>
		<link>https://rafael.bernard-araujo.com/tropecando-111.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-111.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Mon, 30 Oct 2023 07:37:05 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1851</guid>

					<description><![CDATA[Don't do this: creating useless indexes This is why, when I’m called for a performance problem (or for an audit), my first take is to look at the size of the data compared to the size of the indexes. If you store more indexes than data for a transactional workload, that’s bad. The worst I’ve [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://web.archive.org/web/20240525164456/https://mydbanotebook.org/post/too-many-indexes/">Don't do this: creating useless indexes</a></p>
<blockquote><p>
This is why, when I’m called for a performance problem (or for an audit), my first take is to look at the size of the data compared to the size of the indexes. If you store more indexes than data for a transactional workload, that’s bad. The worst I’ve seen was a database with 12 times more indexes stored on disk than data! Of course, it was a transactional workload… Would you buy a cooking book with 10 pages of recipes and 120 pages of indexes at the end of the book?</p>
<p>The problem with indexes is that each time you write (insert, update, delete), you will have to write to the indexes too! That can become very costly in resources and time.
</p></blockquote>
<p><a href="http://blog.cleancoder.com/uncle-bob/2023/01/18/functional-classes.html">Functional Classes</a></p>
<blockquote>
<blockquote><p>
A place for everything, and everything in its place.
</p></blockquote>
<p>What is a class? According to the dictionary a class is:</p>
<blockquote><p>
A set, collection, group, or configuration containing members regarded as having certain attributes or traits in common; a kind or category.
</p></blockquote>
</blockquote>
<p><a href="https://frederickvanbrabant.com/blog/2019-04-03-the-simple-class/">The Simple Class</a></p>
<blockquote><p>
I work in many legacy code bases, and in fact, I’ve made it a big part of my career. I love diving into big monoliths that have grown out of proportion and tidying them up. One of the best parts of that work is rewriting a God class into a collection of small reusable classes. Let’s take a look at what makes a simple class great.
</p></blockquote>
<p><a href="https://frederickvanbrabant.com/blog/2020-02-07-the-economics-of-clean-code/">The economics of clean code</a></p>
<blockquote><p>
Code smarter. Code balanced. That is OK to have some debt. But pay them off quickly.
</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-111.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1851</post-id>	</item>
		<item>
		<title>Tropeçando 110</title>
		<link>https://rafael.bernard-araujo.com/tropecando-110.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-110.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Sat, 05 Aug 2023 14:24:46 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws-cdk]]></category>
		<category><![CDATA[ci/cd]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1829</guid>

					<description><![CDATA[Enabling the Optimal Serverless Platform Team — CDK and Team Topologies Serverless, and related technologies, have enabled teams to move faster, reduce total cost of ownership and overall empowered developers to have greater ownership of the systems they build. However, Serverless is not a silver bullet — there is an organisational side that’s key to [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://medium.com/serverless-transformation/enabling-the-optimal-serverless-platform-team-cdk-and-team-topologies-fe4d9299adc9">Enabling the Optimal Serverless Platform Team — CDK and Team Topologies</a></p>
<blockquote><p>
Serverless, and related technologies, have enabled teams to move faster, reduce total cost of ownership and overall empowered developers to have greater ownership of the systems they build. However, Serverless is not a silver bullet — there is an organisational side that’s key to unlock the full benefits of Cloud.
</p></blockquote>
<p><a href="https://laravel-news.com/controller-refactor">Restructuring a Laravel Controller using Services, Events, Jobs, Actions, and more</a></p>
<blockquote><p>
A simple but nice walk-though about code decoupling.
</p></blockquote>
<p><a href="https://fly.io/blog/the-serverless-server/">The Serverless Server </a></p>
<blockquote><p>
I'm Will Jordan, and I work on SRE at Fly.io. We transmogrify Docker containers into lightweight micro-VMs and run them on our own hardware in racks around the world, so your apps can run close to your users. Check it out—your app can be up and running in minutes. This is a post about how services like ours are structured, and, in particular, what the term &quot;serverless&quot; has come to mean to me.
</p></blockquote>
<p><a href="https://web.archive.org/web/20240617070102/https://tomasvotruba.com/blog/keep-cognitive-complexity-low-with-phpstan/">Keep Cognitive Complexity Low with PHPStan</a></p>
<blockquote><p>
What is cognitive complexity? It's the amount of information we have to hold in our heads simultaneously to understand the code. The more indents, continue, break, nested foreach, and if/else branches, the harder is code to read.</p>
<p>You can use PHPStan rules to decrease the cognitive complexity of your codebase. This brings matuiry to your application and a more maintainable code.
</p></blockquote>
<p><a href="https://tomasvotruba.com/blog/how-to-release-php-81-and-72-package-in-the-same-repository">How to release PHP 8.1 and 7.2 package in the Same Repository</a></p>
<blockquote><p>
Some steps to release a package in more than one version, to allow compatibility for different PHP runtimes.
</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-110.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1829</post-id>	</item>
		<item>
		<title>Tropeçando 108</title>
		<link>https://rafael.bernard-araujo.com/tropecando-108.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-108.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Thu, 23 Mar 2023 23:16:54 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[kubernetes]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serverless]]></category>
		<category><![CDATA[software architecture]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1758</guid>

					<description><![CDATA[Why I Will Never Use Alpine Linux Ever Again Alpine image is heavily use as a base image for all sort of applications. Some applications, usually running in Kubernetes, are facing issues due to Alpine implementation of musl. This article describes how those issues can cause a great amount of grief. 3 years of lift-and-shift [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://medium.com/better-programming/why-i-will-never-use-alpine-linux-ever-again-a324fd0cbfd6">Why I Will Never Use Alpine Linux Ever Again</a></p>
<blockquote><p>
Alpine image is heavily use as a base image for all sort of applications. Some applications, usually running in Kubernetes, are facing issues due to Alpine implementation of <code>musl</code>. This article describes how those issues can cause a great amount of grief.
</p></blockquote>
<p><a href="https://blog.deleu.dev/lift-and-shift-aws-lambda/">3 years of lift-and-shift into AWS Lambda</a></p>
<blockquote><p>
Let’s set the scene. We’re looking for scaling a PHP application. Googling around take us to find out that AWS Lambda is the most scalable service out there. It doesn’t support PHP natively, but we got <a href="https://bref.sh">https://bref.sh</a>. Not only that, we also have Serverless Visually Explained which walk us through what we need to know to get PHP up and running on AWS Lambda. But we have a 8 year old project that was not designed from the ground up to be serverless. It’s not legacy. Not really. It works well, has some decent test coverage, a handful of engineers working on it and it’s been a success so far. It just has not been designed for horizontal scaling. What now?
</p></blockquote>
<p><a href="https://chemaclass.com/blog/different-beliefs-about-software-quality/">Different beliefs about software quality</a></p>
<blockquote><p>
Good advices on how to deal with an environment where you have conflicts about your beliefs and how the environment work.
</p></blockquote>
<p><a href="https://andreas.heigl.org/2022/08/28/increase-code-coverage-successively/">Increase code coverage successively</a></p>
<blockquote><p>
I often come across legacy projects that have a very low code coverage (or none at all). Getting such a project up to a high code coverage can be very frustrating as you will have a poor code coverage for a very long time.</p>
<p>So instead of generating an overall code coverage report with every pull request I tend to create a so called patch coverage report that checks how much of the patch is actually covered by tests.
</p></blockquote>
<p><a href="https://martinfowler.com/bliki/ConwaysLaw.html">Conway's Law</a></p>
<blockquote><p>
Pretty much all the practitioners I favor in Software Architecture are deeply suspicious of any kind of general law in the field. Good software architecture is very context-specific, analyzing trade-offs that resolve differently across a wide range of environments. But if there is one thing they all agree on, it's the importance and power of Conway's Law. Important enough to affect every system I've come across, and powerful enough that you're doomed to defeat if you try to fight it.
</p></blockquote>
<p><a href="https://matthiasnoback.nl/2022/09/is-it-a-dto-or-a-value-object/">Is it a DTO or a Value Object?</a></p>
<blockquote><p>
A common misunderstanding in my workshops (well, whose fault is it then? ;)), is about the distinction between a DTO and a value object. And so I've been looking for a way to categorize these objects without mistake.
</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-108.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1758</post-id>	</item>
	</channel>
</rss>
