<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software Architecture on Peter Fulop</title><link>https://peterfulop.tech/tags/software-architecture/</link><description>Recent content in Software Architecture on Peter Fulop</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Peter Fulop</copyright><lastBuildDate>Sun, 17 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://peterfulop.tech/tags/software-architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>From principles to production: starting a new series</title><link>https://peterfulop.tech/p/from-principle-to-production/</link><pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate><guid>https://peterfulop.tech/p/from-principle-to-production/</guid><description>&lt;img src="https://peterfulop.tech/p/from-principle-to-production/from-principles-to-production.jpg" alt="Featured image of post From principles to production: starting a new series" /&gt;&lt;p&gt;A short note on why I am starting a new series, and what I hope to do with it.&lt;/p&gt;
&lt;h2 id="fundamentals-still-matter-in-the-ai-era"&gt;Fundamentals still matter in the AI era
&lt;/h2&gt;&lt;p&gt;Syntax has become cheap. That is the real shift. The leverage is no longer in churning out lines — it is in deciding what should exist, steering the model toward the patterns and architectural boundaries you actually mean to enforce, and being straight about whether what comes back is safe to ship. That is usually what decides whether you end up with something scalable and maintainable.&lt;/p&gt;
&lt;p&gt;If you have the room, double down on the fundamentals. It is not wasted time.&lt;/p&gt;
&lt;p&gt;The differentiator is not how well you prompt a model. It is the quality of context you bring to the conversation, your ability to challenge and refine the output across iterations, and the judgement to evaluate, debug, and safely integrate the result.&lt;/p&gt;
&lt;p&gt;Models generate code and propose designs. In my experience, they rarely surface the architectural decisions that make a system resilient, scalable, or secure. Without guidance and steering, the output is often surface-level, not production-grade.&lt;/p&gt;
&lt;p&gt;Should that message be published through a transactional outbox? Does the API Gateway need IP allow-listing and a WAF for this customer integration? Is hexagonal architecture justified here, or overhead? Should we cache these responses on the frontend with something like TanStack Query?&lt;/p&gt;
&lt;p&gt;These are still human judgement calls — for now. They lean on experience and on internalised engineering principles, and those are exactly the muscles that do not develop from prompt iteration.&lt;/p&gt;
&lt;h2 id="the-pattern-i-keep-noticing"&gt;The pattern I keep noticing
&lt;/h2&gt;&lt;p&gt;In my own work, the moments that matter most are not the moments an AI can decide for me. They are the moments where a fundamental law of software engineering applies, and the right move is to follow the principle, not the suggestion.&lt;/p&gt;
&lt;p&gt;The model can sketch the option. The principle tells me whether to take it.&lt;/p&gt;
&lt;p&gt;That pattern has become more visible to me as AI tooling has matured, not less. The decisions still rest on the same handful of laws and trade-offs I have been bumping into for the last 20 years across database work, pipeline design, and team-lead roles.&lt;/p&gt;
&lt;h2 id="the-reinforcement"&gt;The reinforcement
&lt;/h2&gt;&lt;p&gt;That observation is what made &lt;a class="link" href="https://www.linkedin.com/in/milanmilanovic/" target="_blank" rel="noopener"
&gt;Milan Milanović&lt;/a&gt;&amp;rsquo;s &lt;a class="link" href="https://lawsofsoftwareengineering.com" target="_blank" rel="noopener"
&gt;&lt;em&gt;Laws of Software Engineering&lt;/em&gt;&lt;/a&gt; land harder than I expected when I read it recently. Most chapters were not new to me — I have walked into these patterns sideways over a long career. But seeing them laid out side by side was a useful reminder that the laws are still doing the heavy lifting, regardless of which tool is generating the first draft.&lt;/p&gt;
&lt;p&gt;Take &lt;strong&gt;Gall&amp;rsquo;s Law&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A complex system that works is invariably found to have evolved from a simple system that worked.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That one is not stuck in a textbook. It is in every greenfield project I have seen attempt the &amp;ldquo;let us design the whole thing up front&amp;rdquo; approach, and in every one that survived by starting smaller. It is a law I live with on a daily basis — AI tooling or no AI tooling.&lt;/p&gt;
&lt;p&gt;The book was the last reinforcement I needed to write more of this down.&lt;/p&gt;
&lt;h2 id="the-series"&gt;The series
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; &lt;em&gt;From principle to production.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cadence:&lt;/strong&gt; one post every two weeks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shape:&lt;/strong&gt; one principle, pattern, or lived lesson per post. The structure will be loose, but the intent is consistent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What the principle actually says, in plain language.&lt;/li&gt;
&lt;li&gt;A real story from my own work whenever I have one — what I got wrong, what I got right, what I would do differently now.&lt;/li&gt;
&lt;li&gt;The nuance that the textbook version usually skips. The place where the rule bends, breaks, or needs a second sentence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I do not have a clean story of my own, I will say so and lean on the principle itself. I would rather skip an anecdote than invent one.&lt;/p&gt;
&lt;p&gt;The series is not a chapter-by-chapter walkthrough of Milan&amp;rsquo;s book. Sometimes a post will line up with a law from it — YAGNI, Gall, Conway. Sometimes the topic will come from a pattern that does not have a famous name attached, just years of seeing the same trade-off repeat: a migration that went sideways, a schema decision that came back three years later, a team-level habit that quietly multiplied output. What I want to do is translate. The gap between &lt;em&gt;knowing&lt;/em&gt; a principle and &lt;em&gt;using&lt;/em&gt; it under real constraints — late projects, mixed-experience teams, systems that downstream consumers already depend on — is where most of the interesting decisions live. That gap is what this series is about.&lt;/p&gt;
&lt;h2 id="first-post"&gt;First post
&lt;/h2&gt;&lt;p&gt;The series opens this May with &lt;strong&gt;Gall&amp;rsquo;s Law&lt;/strong&gt;. It is one of the principles I keep returning to when a system is under pressure to become more complex than its current maturity can support.&lt;br&gt;
The hard part is resisting the urge to design the final platform on day one, and instead starting with the simplest working system that can survive contact with production, then evolving it deliberately as the constraints become real.&lt;/p&gt;
&lt;p&gt;After that, we will see which law the next project hands me.&lt;/p&gt;</description></item></channel></rss>