<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en" xml:base="https://allarddewinter.net/">
  <title>Linkblog</title>
  <subtitle>Allard de Winter - a linkblog on tech and strategy.</subtitle>
  <link href="https://allarddewinter.net/feed.xml" rel="self" />
  <link href="https://allarddewinter.net/" />
  <updated>2026-03-20T09:44:27Z</updated>
  <id>https://allarddewinter.net/</id>
  <author>
    <name>Allard de Winter</name>
  </author>
	<entry>
      <title>AI and Architecture: Future or Folly?</title>
      <link href="https://allarddewinter.net/blog/ai-and-architecture-future-or-folly/" />
      <updated>2026-03-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/ai-and-architecture-future-or-folly/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://www.globalaea.org/general/custom.asp?page=AEA_Webinars&quot; rel=&quot;noopener&quot;&gt;AEA Webinars - AI and Architecture: Future or Folly?&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I recently listened to a webinar by Chris Armstrong, President of Armstrong Process Group, regarding the intersection of AI and Enterprise Architecture (EA). While the session focused on how AI fits into established frameworks like TOGAF, Chris offered a lot of wisdom between the lines on what it actually means to be a “good” architect. This is exactly the kind of perspective I needed when I first started in this field.&lt;/p&gt;&lt;h2 id=&quot;the-core-concept-abstraction&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/ai-and-architecture-future-or-folly/#the-core-concept-abstraction&quot;&gt;The Core Concept: Abstraction&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A central theme was the principle of abstraction—the ability to represent the essential characteristics of a system while de-emphasising the irrelevant. Chris highlighted that what makes an abstraction “good” is inherently subjective and varies by domain.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“An abstraction represents the essential characteristics of an entity that distinguish it from all other kinds of entities… What makes an abstraction ‘good’ is a matter of perspective.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;He made a clear distinction between Architecture Building Blocks (ABBs), which focus on the “what,” and Solution Building Blocks (SBBs), which focus on the “how.”&lt;/p&gt;&lt;h2 id=&quot;where-ai-fits-and-where-it-does-not&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/ai-and-architecture-future-or-folly/#where-ai-fits-and-where-it-does-not&quot;&gt;Where AI Fits (and Where It Does Not)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The webinar captured the current pain points of EA work: keeping models current, correlating content, and the mundane struggle of wrestling with tool user experience. Chris suggested that AI could help raise the level of abstraction, allowing architects to focus on “true” ABBs while AI handles the solution-level assets.&lt;/p&gt;&lt;p&gt;However, he identified several “unique capabilities” that should remain in human hands:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Subjectivity:&lt;/strong&gt; Determining what is “architecturally significant.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Collaboration:&lt;/strong&gt; Building consensus with stakeholders.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Innovation:&lt;/strong&gt; Applying best practices in a specific, human context.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“Architects should not surrender their unique contribution and creativity… There are critical activities that are best suited to remain in human hands.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;my-take&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/ai-and-architecture-future-or-folly/#my-take&quot;&gt;My Take&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;While Chris captured the current struggles of the profession perfectly, I think he is being very modest about the impact of generative AI. I believe it will have a much larger effect than he suggests, automating a significant portion of the workflow and making architecture data far more reliable and up to date.&lt;/p&gt;&lt;p&gt;That said, he was spot on regarding why certain parts of the job must remain human. Strategy, deep understanding, and human interaction are not things AI can replicate. His examples of why we build models—to build consensus and explore alternatives—remind us that architecture is as much about people as it is about diagrams.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Software Factories and the Quest for Agentic Proof</title>
      <link href="https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/" />
      <updated>2026-02-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/</id>
      <content type="html">
				&lt;p&gt;The landscape of software development has reached a significant inflection point. We are moving beyond simple code assistance toward “Software Factories”—environments where human engineers no longer write or even review code. This shift, highlighted by Simon Willison in &lt;a href=&quot;https://simonwillison.net/2026/Feb/7/software-factory/&quot; rel=&quot;noopener&quot;&gt;How StrongDM’s AI team build serious software without even looking at the code&lt;/a&gt;, suggests a future where the primary role of a developer is to build the systems that build the software.&lt;/p&gt;&lt;h3 id=&quot;the-dark-factory-model&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/#the-dark-factory-model&quot;&gt;The Dark Factory Model&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The concept of the “Dark Factory,” a term borrowed from manufacturing to describe fully automated plants, is being applied to software by teams like StrongDM. Their approach is governed by radical rules: code must not be written or reviewed by humans.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“We built a Software Factory: non-interactive development where specs + scenarios drive agents that write code, run harnesses, and converge without human review.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To make this viable, StrongDM utilizes several advanced techniques:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Technique&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Scenario Testing&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;End-to-end user stories kept as “holdout sets” that agents cannot see, used to validate satisfaction.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Digital Twin Universe&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Behavioral clones of third-party APIs (like Slack or Okta) built by agents to allow high-volume testing.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Gene Transfusion&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Using agents to extract patterns from existing systems to reuse them in new contexts.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Pyramid Summaries&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Multi-level documentation that allows agents to scan quickly and zoom in on details.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;proving-that-code-works&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/#proving-that-code-works&quot;&gt;Proving That Code Works&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;If humans are not reviewing the code, the burden of proof shifts entirely to automated validation. Simon introduces two tools in &lt;a href=&quot;https://simonwillison.net/2026/Feb/10/showboat-and-rodney/&quot; rel=&quot;noopener&quot;&gt;Introducing Showboat and Rodney, so agents can demo what they’ve built&lt;/a&gt; designed to address this. These tools allow agents to demonstrate their work to human overseers through generated artifacts rather than raw code.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Showboat:&lt;/strong&gt; A CLI tool that allows agents to construct Markdown documents. It records commands, outputs, and screenshots to “show” the progress of a feature.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rodney:&lt;/strong&gt; A browser automation tool designed for agents to perform web-based tasks and accessibility audits, feeding the results back into Showboat.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“The more code we churn out with agents, the more valuable tools are that reduce the amount of manual QA time we need to spend.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;economic-and-professional-implications&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/#economic-and-professional-implications&quot;&gt;Economic and Professional Implications&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This transition is not without its challenges. StrongDM suggests that a high-performing software factory might require a spend of $1,000 per day per engineer on LLM tokens. While this cost is significant, it raises a fundamental question: is it more profitable to pay for tokens than for a massive QA department?&lt;/p&gt;&lt;p&gt;For the individual engineer, the concern is twofold: how to remain relevant and how to maintain a business model when competitors can use similar agents to clone features rapidly. The focus is shifting from the “how” of implementation to the “what” of system design and verification. We are moving from being writers to being architects of automated pipelines.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This reflects a broader trend where the value of a software engineer is increasingly found in their ability to define requirements and validation criteria rather than syntax. &lt;a href=&quot;https://allarddewinter.net/blog/software-factories-and-the-quest-for-agentic-proof/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>The Agentic AI Handbook: Production-Ready Patterns</title>
      <link href="https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/" />
      <updated>2026-01-21T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://www.nibzard.com/agentic-handbook&quot; rel=&quot;noopener&quot;&gt;https://www.nibzard.com/agentic-handbook&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The transition from experimental AI demos to stable production systems requires more than clever prompting; it demands architectural rigour. Nikola Balić has compiled 113 patterns derived from real-world implementations, providing a shared vocabulary for developers building autonomous and semi-autonomous systems.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Agentic patterns are the bridge across this gap. Each pattern represents something more than one team has implemented and validated. They’re not theoretical—they’re born from production experience.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;core-categories-of-agentic-design&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/#core-categories-of-agentic-design&quot;&gt;Core Categories of Agentic Design&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The handbook organises these patterns into eight functional areas to address the specific challenges of agent reliability and security:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Category&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Focus Area&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Key Pattern Example&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Orchestration&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Decision making and planning&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Plan-Then-Execute&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Tool Use&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Interaction with external APIs/DBs&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Code-Over-API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Managing memory and token limits&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Episodic Memory Retrieval&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Feedback Loops&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Iterative improvement&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Reflection Loop&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;UX/Collaboration&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Human-in-the-loop dynamics&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Spectrum of Control&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Reliability/Eval&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Quality assurance and testing&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Workflow Evals&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Learning&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Institutional knowledge building&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Skill Library Evolution&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Safeguards and privacy&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Lethal Trifecta Model&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;how-to-start-foundational-patterns&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/#how-to-start-foundational-patterns&quot;&gt;How to Start: Foundational Patterns&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For those moving away from “vibe coding” toward structured engineering, Nikola suggests starting with these four pillars:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Plan-Then-Execute&lt;/strong&gt;: Separate the reasoning phase from the action phase. This prevents untrusted data from hijacking the agent’s logic mid-stream.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Inversion of Control&lt;/strong&gt;: Instead of micromanaging every step, provide the agent with tools and a high-level goal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Reflection Loop&lt;/strong&gt;: Implement a system where the model critiques its own draft against a metric before finalising output.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Chain-of-Thought Monitoring&lt;/strong&gt;: Maintain “a finger on the trigger” by observing intermediate reasoning and interrupting if the agent drifts off-course.&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;“The jump from single-agent to multi-agent systems follows a natural progression. Specialization beats generalization. An agent optimized for code review will outperform a generalist agent asked to review code.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-lethal-trifecta-security-framework&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/#the-lethal-trifecta-security-framework&quot;&gt;The “Lethal Trifecta” Security Framework&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A critical takeaway for production environments is the security model. To prevent data exfiltration via prompt injection, a system should never simultaneously possess:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Access to private data.&lt;/li&gt;&lt;li&gt;Exposure to untrusted content.&lt;/li&gt;&lt;li&gt;The ability to communicate externally.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By ensuring at least one of these “circles” is missing in any execution path, developers can create a robust safety boundary that does not rely solely on the model’s ability to follow instructions.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This pattern is notably used in Claude Code’s “plan mode” to increase success rates in complex tasks. &lt;a href=&quot;https://allarddewinter.net/blog/the-agentic-ai-handbook-production-ready-patterns/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>The Human Element in Chatbot Exams</title>
      <link href="https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/" />
      <updated>2026-01-20T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://ploum.net/2026-01-19-exam-with-chatbots.html&quot; rel=&quot;noopener&quot;&gt;https://ploum.net/2026-01-19-exam-with-chatbots.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Lionel Dricot (Ploum), teaching “Open Source Strategies” at École Polytechnique de Louvain, recently experimented with a radical exam format. He allowed students full internet access and the choice to use chatbots, provided they followed strict accountability rules.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“You can use chatbots, but you will be held accountable for it. Mistakes made by chatbots will be considered more important than honest human mistakes, resulting in the loss of more points.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-experiment-and-results&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/#the-experiment-and-results&quot;&gt;The Experiment and Results&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Out of 60 students, 57 chose not to use chatbots. Lionel identified four distinct clusters among those who declined:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Cluster&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Performance Range (out of 20)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Motivation&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Personal Preference&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;15 – 19&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Pride in their own work; perceived AI as a time-sink for verification.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Never Use&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;~13&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Active dislike for the interaction style of LLMs.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Pragmatic&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;12 – 16&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Judged the specific exam as unsuitable for AI assistance.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Heavy Users&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;8 – 11&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Afraid of the accountability constraints and missing AI errors.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;key-observations&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/#key-observations&quot;&gt;Key Observations&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The Accountability Paradox:&lt;/strong&gt; When students are forced to justify AI output and are penalised more heavily for AI-generated errors, most abandon the tool.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Stream of Consciousness:&lt;/strong&gt; Lionel introduced a “stream of consciousness” text file where students recorded their thoughts in real-time without editing. This provided a “glimpse inside the minds” of students, helping to save those who understood the material but struggled with oral articulation due to stress.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Generational Fear:&lt;/strong&gt; Students expressed a significant fear of “cheating,” even regarding standard collaborative practices. Many were panicked by Google’s forced AI overviews, fearing they would be accused of academic dishonesty.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“Can chatbots help? Yes, if you know how to use them. But if you do, chances are you don’t need chatbots.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;comparison-to-automated-oral-exams&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/#comparison-to-automated-oral-exams&quot;&gt;Comparison to Automated Oral Exams&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This method contrasts sharply with the Voice AI approach used by Panos Ipeirotis.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; While the Voice AI model focuses on &lt;strong&gt;scalability&lt;/strong&gt; and high-integrity automated testing, Lionel’s method focuses on &lt;strong&gt;human interaction&lt;/strong&gt; and the “stream of consciousness” to mitigate stress. Lionel’s approach is deeply personal—averaging 26 minutes per student—making it difficult to scale to large cohorts, whereas the Voice AI model handles dozens of students for pennies.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;See the previous discussion on &lt;a href=&quot;https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/&quot; rel=&quot;noopener&quot;&gt;Scalable Oral Exams with Voice AI&lt;/a&gt;. &lt;a href=&quot;https://allarddewinter.net/blog/the-human-element-in-chatbot-exams/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>ChatGPT Health: The Marketplace Where You Are the Product</title>
      <link href="https://allarddewinter.net/blog/chatgpt-health-the-marketplace-where-you-are-the-product/" />
      <updated>2026-01-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/chatgpt-health-the-marketplace-where-you-are-the-product/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://consciousdigital.org/chatgpt-health-is-a-marketplace-guess-who-is-the-product/&quot; rel=&quot;noopener&quot;&gt;https://consciousdigital.org/chatgpt-health-is-a-marketplace-guess-who-is-the-product/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;OpenAI’s new &lt;strong&gt;ChatGPT Health&lt;/strong&gt; service integrates medical records and wellness data (Apple Health, Peloton) to offer insurance comparisons and health advice. While marketed as a personal assistant, the infrastructure reveals a marketplace designed for insurers and payers.&lt;/p&gt;&lt;p&gt;Ther risks:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The Partnership:&lt;/strong&gt; OpenAI partnered with b.well, a company that helps insurers assess member risk “before the first claim.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Privacy Gap:&lt;/strong&gt; Data shared with OpenAI is generally not protected by HIPAA&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/chatgpt-health-the-marketplace-where-you-are-the-product/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, leaving it subject to corporate policy rather than federal law.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Pay-to-be-Product Model:&lt;/strong&gt; Even paid users are not exempt from data harvesting.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“If you’re not paying for the product, you are the product. ChatGPT showed us that even this formulation is too optimistic. You can pay for ChatGPT Plus or even Pro and still end up as the product.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This serves as a grim reminder of how “privacy theatre” operates. I am very happy that this is not released in Europe. The fact that OpenAI has bypassed the EU, UK, and Switzerland—regions with strict GDPR enforcement—suggests the product cannot meet high privacy standards. When a company under financial pressure aggregates health data, you are no longer a patient; you are inventory.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;HIPAA: US law protecting health information held by doctors and insurers, but often not tech platforms. &lt;a href=&quot;https://allarddewinter.net/blog/chatgpt-health-the-marketplace-where-you-are-the-product/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>The Model Context Protocol is a fad</title>
      <link href="https://allarddewinter.net/blog/the-model-context-protocol-is-a-fad/" />
      <updated>2026-01-09T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-model-context-protocol-is-a-fad/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://tombedor.dev/mcp-is-a-fad/&quot; rel=&quot;noopener&quot;&gt;https://tombedor.dev/mcp-is-a-fad/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The Model Context Protocol (MCP) has gained rapid traction as a standard for connecting AI agents to various toolsets. However, Tom Bedor argues that this popularity is driven more by marketing momentum and ease of initial integration than by long-term technical utility. While it aims to solve the “NxM” problem—connecting N agents to M tools—the architectural trade-offs and security implications suggest it may be a transient trend.&lt;/p&gt;&lt;h3 id=&quot;the-nxm-problem-and-mcps-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-model-context-protocol-is-a-fad/#the-nxm-problem-and-mcps-approach&quot;&gt;The NxM Problem and MCP’s Approach&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The core promise of MCP is to eliminate the need for bespoke connectors between different LLM APIs (like Gemini or OpenAI) and various tools. Currently, frameworks like LangChain or LiteLLM already handle these minor schema differences. MCP shifts tool execution into separate, long-lived processes.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“This abstracts away schema generation and invocation, but at a cost. Tool logic runs in a separate process, making resource management opaque. The application loses control over tool instructions, logging, and error handling.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;key-structural-issues&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-model-context-protocol-is-a-fad/#key-structural-issues&quot;&gt;Key Structural Issues&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The transition to MCP introduces several technical hurdles:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Incoherent Toolboxes:&lt;/strong&gt; Tools developed in isolation lack context regarding other available tools, leading to “tool confusion” where an agent might use pliers when a hammer is more appropriate.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Runtime Complexity:&lt;/strong&gt; Each MCP server requires its own environment. Users often struggle with dangling subprocesses, memory leaks, and dependency management across different runtimes like Node and Python.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security Vulnerabilities:&lt;/strong&gt; MCP often bypasses traditional security infrastructure. Recent CVEs have highlighted risks such as Remote Code Execution (RCE) and data exfiltration through prompt injection.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“You’re not eliminating trust; you’re redirecting it to third-party code that, as the CVEs demonstrate, is often unaudited and vulnerable.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;better-alternatives&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-model-context-protocol-is-a-fad/#better-alternatives&quot;&gt;Better Alternatives&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For most use cases, existing methods provide more robust results without the protocol overhead:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;User Type&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Better Alternative&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Reason&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Technical Users&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Local scripts + command runners&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;AI can easily write these; they work for humans too.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;App Developers&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;1st party tools&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Better auth, logging, and shared memory state.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Tool Authors&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;OpenAPI / REST&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Decades of battle-tested tooling and validation.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Simon Willison has also expressed skepticism regarding MCP’s long-term dominance, and I agree that the protocol’s benefits rarely outweigh its complexity and token cost. As model providers introduce native capabilities like Claude Skills, the need for a separate, over-engineered protocol is likely to diminish.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Fighting Fire with Fire: Scalable Oral Exams with Voice AI</title>
      <link href="https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/" />
      <updated>2026-01-07T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html&quot; rel=&quot;noopener&quot;&gt;https://www.behind-the-enemy-lines.com/2025/12/fighting-fire-with-fire-scalable-oral.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The traditional take-home exam is dead. When student submissions start looking like professional memos but the authors cannot explain their own logic during cold calls, the assessment model has failed. Panos Ipeirotis and Konstantinos Rizakos addressed this by deploying a Voice AI agent to conduct scalable, personalized oral exams.&lt;/p&gt;&lt;h3 id=&quot;the-core-experiment&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/#the-core-experiment&quot;&gt;The Core Experiment&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Using ElevenLabs and a “Council of LLMs” for grading, the instructors transformed a 30-hour manual grading task into a $15 automated process.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“If you cannot defend your own work live, then the written artifact is not measuring what you think it is measuring.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/#key-takeaways&quot;&gt;Key Takeaways&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; The system cost $0.42 per student and handled 36 exams over 9 days without instructor fatigue.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Council Method:&lt;/strong&gt; Grading was handled by three models (Claude, Gemini, GPT). While they initially disagreed, a “consultation” round where they viewed each other’s evidence led to high consistency.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Instructional Mirror:&lt;/strong&gt; The data revealed that students failed “Experimentation” questions consistently, highlighting a specific gap in how the professors had taught the material.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Human Factors:&lt;/strong&gt; Students found the AI voice “intimidating” and “condescending,” proving that the persona of the AI is as important as its logic.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;grading-convergence&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/#grading-convergence&quot;&gt;Grading Convergence&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Metric&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Round 1 (Independent)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Round 2 (Consultation)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Within 1 point&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;0%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;62%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Within 2 points&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;23%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;85%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Mean max difference&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;3.93 pts&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;1.41 pts&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The experiment suggests that while AI created the cheating problem, it also provides the only scalable way to return to high-integrity oral examination.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Panos Ipeirotis is a Professor at NYU Stern. &lt;a href=&quot;https://allarddewinter.net/blog/fighting-fire-with-fire-scalable-oral-exams-with-voice-ai/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Useful patterns for building HTML tools</title>
      <link href="https://allarddewinter.net/blog/useful-patterns-for-building-html-tools/" />
      <updated>2025-12-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/useful-patterns-for-building-html-tools/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://simonwillison.net/2025/Dec/10/html-tools/&quot; rel=&quot;noopener&quot;&gt;Useful patterns for building HTML tools&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I’ve started using the term &lt;strong&gt;HTML tools&lt;/strong&gt; to refer to HTML applications that I’ve been building which combine HTML, JavaScript, and CSS in a single file and use them to provide useful functionality.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Simon Willison has built over 150 such tools, almost all with the help of LLMs. Here are the core insights and reusable patterns from his experience.&lt;/p&gt;&lt;h3 id=&quot;core-characteristics-of-html-tools&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/useful-patterns-for-building-html-tools/#core-characteristics-of-html-tools&quot;&gt;Core characteristics of HTML tools&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Single file&lt;/strong&gt;: inline JavaScript and CSS, no separate files.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;No React or build steps&lt;/strong&gt;: avoids complexity and eases copying.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dependencies from CDNs&lt;/strong&gt;: load libraries like PDF.js from CDNjs or jsDelivr.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Small size&lt;/strong&gt;: typically a few hundred lines, making them easy to rewrite or understand.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;development-workflow&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/useful-patterns-for-building-html-tools/#development-workflow&quot;&gt;Development workflow&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Prototype with LLM canvases&lt;/strong&gt;: Use ChatGPT Canvas, Claude Artifacts, or Gemini Canvas to quickly generate a working tool.&lt;blockquote&gt;&lt;p&gt;“Build a canvas that lets me paste in JSON and converts it to YAML. No React.”&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Switch to coding agents for complex projects&lt;/strong&gt;: Tools like Claude Code or Codex CLI can test code with Playwright and submit pull requests.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Self-host on GitHub Pages&lt;/strong&gt;: Copy-paste the HTML into a repository and enable GitHub Pages for reliable, sandbox-free hosting.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;key-patterns&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/useful-patterns-for-building-html-tools/#key-patterns&quot;&gt;Key patterns&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Copy and paste&lt;/strong&gt;: Leverage clipboard events for input and output; include “Copy to clipboard” buttons for mobile convenience.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Debugging tools&lt;/strong&gt;: Build tools to inspect browser capabilities (e.g., clipboard formats, key codes, CORS).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;State persistence&lt;/strong&gt;:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;URL&lt;/strong&gt;: store state in query parameters or hash for bookmarkable/shareable tools.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;localStorage&lt;/strong&gt;: for larger state or secrets like API keys.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CORS-enabled APIs&lt;/strong&gt;: Directly fetch data from APIs with open CORS headers (iNaturalist, PyPI, GitHub raw content, Bluesky, Mastodon).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Calling LLM APIs&lt;/strong&gt;: OpenAI, Anthropic, and Gemini APIs are CORS-enabled; store API keys in &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;File handling&lt;/strong&gt;: Use &lt;code&gt;&amp;lt;input type=&quot;file&quot;&gt;&lt;/code&gt; to read files locally and process them with JavaScript libraries (PDF.js, Tesseract.js).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Downloadable files&lt;/strong&gt;: Generate files client-side and offer download via &lt;code&gt;URL.createObjectURL()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pyodide&lt;/strong&gt;: Run Python in the browser, loading additional packages via micropip.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;WebAssembly&lt;/strong&gt;: Use WebAssembly ports of existing tools (e.g., Tesseract.js, SLOCCount).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Remixing previous tools&lt;/strong&gt;: Reference existing tools in your prompt to leverage proven patterns. For example, to create &lt;code&gt;pypi-changelog&lt;/code&gt;, Simon instructed:&lt;blockquote&gt;&lt;p&gt;“Look at the pypi package explorer tool… Build a new tool pypi-changelog.html which uses the PyPI API to get the wheel URLs…”&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>How Google Maps Quietly Allocates Survival Across London&#39;s Restaurants</title>
      <link href="https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/" />
      <updated>2025-12-11T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://laurenleek.substack.com/p/how-google-maps-quietly-allocates&quot; rel=&quot;noopener&quot;&gt;How Google Maps quietly allocates survival across London’s restaurants - and how I built a dashboard to see through it&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Lauren Leek’s analysis provides a data-driven look at how Google Maps’ ranking system doesn’t just reflect consumer choice but actively shapes it, creating a cumulative advantage for some restaurants while leaving others algorithmically invisible.&lt;/p&gt;&lt;h3 id=&quot;google-maps-as-a-market-maker&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/#google-maps-as-a-market-maker&quot;&gt;Google Maps as a Market Maker&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The platform’s public story is one of passive reflection, but its ranking is built on three signals: relevance, distance, and prominence. It is the last one—prominence—that is politically and economically significant. Google defines it using review volume, review velocity, average rating, brand recognition, and web visibility.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Visibility on these ranked lists determines foot traffic. Foot traffic determines how quickly reviews accumulate. Review accumulation then feeds directly back into the prominence signal. The system compounds.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This creates a feedback loop that disproportionately benefits chains and venues in high-footfall areas, while new independents face a cold-start problem. The dynamic resembles Robert Merton’s Matthew Effect: ‘unto every one that hath shall be given.’ In economic terms, Google Maps functions less like a directory and more like a market maker, allocating attention and steering demand.&lt;/p&gt;&lt;h3 id=&quot;building-a-counterfactual-with-machine-learning&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/#building-a-counterfactual-with-machine-learning&quot;&gt;Building a Counterfactual with Machine Learning&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To separate a restaurant’s intrinsic appeal from its platform-amplified visibility, Leek built a machine learning model. It predicts a restaurant’s expected Google rating based on structural features like review count, cuisine, chain status, price, and location. The difference between the actual rating and this predicted baseline is the &lt;em&gt;rating residual&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;A positive residual indicates a restaurant performs better than the algorithm typically rewards for its type; a negative one suggests it is underperforming relative to the platform’s structural biases. This residual acts as a measure of “algorithmic mispricing.”&lt;/p&gt;&lt;h3 id=&quot;the-london-food-dashboard&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/#the-london-food-dashboard&quot;&gt;The London Food Dashboard&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The practical output of this analysis is a &lt;a href=&quot;https://laurenleek.eu/food-map&quot; rel=&quot;noopener&quot;&gt;public dashboard&lt;/a&gt;. Users can filter London restaurants by cuisine, borough, price, and, crucially, by “underrated gems”—those with high positive residuals. The tool makes the abstract effects of the algorithm concretely visible.&lt;/p&gt;&lt;h3 id=&quot;from-restaurants-to-neighbourhood-ecosystems&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/#from-restaurants-to-neighbourhood-ecosystems&quot;&gt;From Restaurants to Neighbourhood Ecosystems&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Scaling the analysis up, Leek aggregated restaurant data into spatial cells to classify neighbourhoods into hub types: elite, strong, everyday, and weak. The analysis reveals that culinary diversity is not evenly distributed. Migrant cuisines often cluster in areas with weaker algorithmic visibility, tied to settlement histories and affordability.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Cuisine diversity, in other words, is not just about taste. It is about where families settled, which high streets remained affordable long enough for a second generation to open businesses, and which parts of the city experienced displacement before culinary ecosystems could mature.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-takeaway&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-google-maps-quietly-allocates-survival-across-londons-restaurants/#the-takeaway&quot;&gt;The Takeaway&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The core insight is that platforms like Google Maps now quietly structure economic survival in urban markets. What appears as consumer choice is increasingly a downstream effect of ranking algorithms. This has implications for policy, suggesting that tools for urban regeneration and small business support must now consider platform transparency and auditability.&lt;/p&gt;&lt;p&gt;Leek concludes that we audit financial markets, so we should also audit the attention markets that increasingly govern local economies.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Optimising LLM Agent Instructions with CLAUDE.md</title>
      <link href="https://allarddewinter.net/blog/optimising-llm-agent-instructions-with-claudemd/" />
      <updated>2025-12-01T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/optimising-llm-agent-instructions-with-claudemd/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://humanlayer.com/blog/writing-a-good-claude-md&quot; rel=&quot;noopener&quot;&gt;Writing a good CLAUDE.md | HumanLayer Blog&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This article explores best practices for creating effective &lt;code&gt;CLAUDE.md&lt;/code&gt; (or &lt;code&gt;AGENTS.md&lt;/code&gt;) files, which are crucial for instructing large language model (LLM) agents. It highlights that LLMs are largely stateless and require explicit instruction for each session, making &lt;code&gt;CLAUDE.md&lt;/code&gt; a high-leverage point for onboarding agents to a codebase.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“&lt;a href=&quot;http://CLAUDE.md&quot; rel=&quot;noopener&quot;&gt;CLAUDE.md&lt;/a&gt; (or &lt;a href=&quot;http://AGENTS.md&quot; rel=&quot;noopener&quot;&gt;AGENTS.md&lt;/a&gt;) is the only file that by default goes into &lt;em&gt;every single conversation&lt;/em&gt; you have with the agent.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The author notes that LLMs often ignore &lt;code&gt;CLAUDE.md&lt;/code&gt; content if it is not deemed relevant to the current task, due to an embedded system reminder. This underscores the importance of keeping instructions concise and universally applicable.&lt;/p&gt;&lt;h3 id=&quot;key-principles-for-a-good-claudemd&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/optimising-llm-agent-instructions-with-claudemd/#key-principles-for-a-good-claudemd&quot;&gt;Key Principles for a Good &lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The article outlines several recommendations for crafting an effective &lt;code&gt;CLAUDE.md&lt;/code&gt; file:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Onboard the Agent:&lt;/strong&gt; Use &lt;code&gt;CLAUDE.md&lt;/code&gt; to provide the agent with essential context about the codebase, covering:&lt;ul&gt;&lt;li&gt;&lt;strong&gt;WHAT:&lt;/strong&gt; Technology stack, project structure, and codebase map (especially for monorepos).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;WHY:&lt;/strong&gt; The project’s purpose and the function of its various parts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HOW:&lt;/strong&gt; How the agent should operate, including tools (e.g., &lt;code&gt;bun&lt;/code&gt; instead of &lt;code&gt;node&lt;/code&gt;) and verification steps (tests, typechecks).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Less is More:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;LLMs, particularly smaller models, have limitations on the number of instructions they can reliably follow (around 150-200 for frontier models).&lt;/li&gt;&lt;li&gt;Instruction-following quality decreases uniformly as instruction count increases.&lt;/li&gt;&lt;li&gt;The Claude Code system prompt already consumes about 50 instructions.&lt;/li&gt;&lt;li&gt;Therefore, &lt;code&gt;CLAUDE.md&lt;/code&gt; should contain as few, universally applicable instructions as possible.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Concise and Universally Applicable:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;The context window performs better with focused, relevant information.&lt;/li&gt;&lt;li&gt;Since &lt;code&gt;CLAUDE.md&lt;/code&gt; is included in &lt;em&gt;every&lt;/em&gt; session, its contents must be broadly applicable. Avoid task-specific instructions.&lt;/li&gt;&lt;li&gt;Aim for less than 300 lines; shorter is generally better. The HumanLayer root &lt;code&gt;CLAUDE.md&lt;/code&gt; is under sixty lines.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Progressive Disclosure:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Instead of including all instructions in &lt;code&gt;CLAUDE.md&lt;/code&gt;, store task-specific instructions in separate Markdown files (e.g., &lt;code&gt;agent_docs/building_the_project.md&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; can then list these files and instruct the agent to read them only when relevant.&lt;/li&gt;&lt;li&gt;Prefer pointers (&lt;code&gt;file:line&lt;/code&gt; references) over copying code snippets to avoid outdated information.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;LLMs are Not Linters:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Do not use LLMs for code style guidelines or formatting; they are expensive and slow compared to deterministic tools like linters and formatters.&lt;/li&gt;&lt;li&gt;LLMs are in-context learners; if your code follows conventions, they should adapt with minimal explicit instruction.&lt;/li&gt;&lt;li&gt;Consider using &lt;code&gt;Stop&lt;/code&gt; hooks or Slash Commands to integrate linters and formatters, allowing the agent to fix issues identified by these tools.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Avoid Auto-Generation:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; is a critical leverage point for agent performance.&lt;/li&gt;&lt;li&gt;Carefully craft its contents rather than relying on auto-generation tools, as a poorly constructed &lt;code&gt;CLAUDE.md&lt;/code&gt; can negatively impact every phase of the workflow.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;my-take&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/optimising-llm-agent-instructions-with-claudemd/#my-take&quot;&gt;My Take&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;My recent experience with LLMs, particularly Gemini Pro 2.5, has shown a noticeable decrease in performance and instruction adherence, even with human-readable instructions. This article provides a compelling explanation for why this might be the case and offers practical strategies to mitigate it.&lt;/p&gt;&lt;p&gt;The concept of “less is more” and the emphasis on “universally applicable” instructions are particularly relevant. I have often been guilty of trying to stuff too much detail into initial prompts, hoping to cover all eventualities. The idea of using “Progressive Disclosure” by pointing to separate, task-specific Markdown files is a game-changer. This allows for detailed guidance without overwhelming the agent’s primary context window.&lt;/p&gt;&lt;p&gt;I also appreciate the strong stance against using LLMs as linters. It reinforces the principle of using the right tool for the job, leveraging deterministic tools for deterministic tasks and reserving LLMs for more complex, non-deterministic problem-solving. I plan to implement the “CRITICAL (PRIORITY 0)!!!” approach mentioned in the Hacker News discussion for my &lt;code&gt;AGENTS.md&lt;/code&gt; files, alongside these structured principles, to see if it improves instruction following.&lt;/p&gt;&lt;p&gt;This approach aligns well with the idea of creating a “README for agents,” where the &lt;code&gt;README.md&lt;/code&gt; remains for humans, but the agent-specific documentation is optimised for LLM processing efficiency and instruction adherence.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Navigating the AI Tsunami: Investment, Product, and the Professional Services Imperative</title>
      <link href="https://allarddewinter.net/blog/navigating-the-ai-tsunami-investment-product-and-the-professional-services-imperative/" />
      <updated>2025-11-27T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/navigating-the-ai-tsunami-investment-product-and-the-professional-services-imperative/</id>
      <content type="html">
				&lt;p&gt;The artificial intelligence boom continues its relentless march, prompting both excitement and apprehension. With unprecedented capital flowing into AI infrastructure and a rapid pace of technological advancement, a critical question emerges: are we witnessing an AI bubble, or is this a foundational shift? The answer, it seems, is nuanced, depending on which part of the AI ecosystem one examines.&lt;/p&gt;&lt;h3 id=&quot;the-ai-investment-landscape-a-three-tiered-view&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/navigating-the-ai-tsunami-investment-product-and-the-professional-services-imperative/#the-ai-investment-landscape-a-three-tiered-view&quot;&gt;The AI Investment Landscape: A Three-Tiered View&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Andrew NG offers a framework for understanding where investment is flowing and where the opportunities and risks lie, as detailed in his newsletter &lt;a href=&quot;https://info.deeplearning.ai/google-rules-arena-leaderboards-microsoftanthropic-record-labels-back-ai-music-personality-control-for-llms-1&quot; rel=&quot;noopener&quot;&gt;Is there an AI bubble?&lt;/a&gt;. He categorises AI investment into three distinct areas:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;AI Application Layer:&lt;/strong&gt; Andrew believes this area is currently &lt;strong&gt;underinvested&lt;/strong&gt;. There is immense potential for new applications built atop AI infrastructure, and these applications, by their nature, must be more valuable than the underlying technology to sustain the ecosystem. He observes “many green shoots across many businesses that are applying agentic workflows” and notes that Venture Capital investors often hesitate here, preferring the more understood recipe of infrastructure deployment.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;AI Infrastructure for Inference:&lt;/strong&gt; This sector still requires &lt;strong&gt;significant investment&lt;/strong&gt;. The demand for processing power to generate tokens (AI outputs) already outstrips supply. Andrew highlights that businesses are “supply-constrained rather than demand-constrained,” a positive problem indicating strong underlying need. As agentic coders like Claude Code, OpenAI Codex (with GPT-5), and Gemini 3’s Google CLI improve and gain market penetration, the aggregate demand for token generation will only grow.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;AI Infrastructure for Model Training:&lt;/strong&gt; While Andrew is “cautiously optimistic” about this sector, he considers it the &lt;strong&gt;riskiest&lt;/strong&gt; of the three. The rise of open-source/open-weight models and continuous algorithmic and hardware improvements weaken the “technology moat” for training frontier models. This could lead to a scenario where companies pouring billions into training might not see attractive financial returns.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Andrew’s primary concern regarding a potential “bubble” is not a fundamental flaw in AI, but rather the risk that overinvestment and a subsequent collapse in one part of the stack (e.g., training infrastructure) could trigger negative market sentiment across the entire field. However, he remains “very confident about the long-term health of AI’s fundamentals.”&lt;/p&gt;&lt;h3 id=&quot;the-product-reality-what-actually-works-and-whats-next&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/navigating-the-ai-tsunami-investment-product-and-the-professional-services-imperative/#the-product-reality-what-actually-works-and-whats-next&quot;&gt;The Product Reality: What Actually Works (and What’s Next)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sean Goedecke offers a pragmatic view on the types of AI products that have genuinely found traction, noting that despite massive investment, many “new AI products” are simply chatbots, as discussed in his article &lt;a href=&quot;https://www.seangoedecke.com/ai-products/&quot; rel=&quot;noopener&quot;&gt;Only three kinds of AI products actually work&lt;/a&gt;. He identifies three successful archetypes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Chatbots:&lt;/strong&gt; While ubiquitous, Sean argues that “the best chatbot product is the model itself.” AI labs possess decisive advantages in model access and simultaneous development of chatbot harnesses (e.g., Anthropic with Claude Code, OpenAI with Codex). Most bespoke chatbots struggle to compete with general-purpose models like ChatGPT.&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Caveat: Explicit Roleplay:&lt;/strong&gt; A niche exists for chatbots that fulfil requests (e.g., adult content) that mainstream models avoid. However, this segment is likely to be absorbed by major AI labs as they become more flexible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Caveat: Chatbots with Tools:&lt;/strong&gt; These “AI assistants” often fail because “chat is not a good user interface.” Savvy users can manipulate tools, and simple actions are often more efficiently performed via traditional UIs.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Completions:&lt;/strong&gt; Products like GitHub Copilot, which predated ChatGPT, exemplify this. They act as “smart autocompletes,” allowing users to leverage AI power without changing their workflow. The genius lies in users &lt;em&gt;never having to talk to the model&lt;/em&gt;. Sean expresses surprise that this hasn’t taken off more widely outside coding.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Agents:&lt;/strong&gt; This is the most recent successful archetype, with coding agents making significant strides in the last year. Agents differ from chatbots-with-tools because they take an initial request and autonomously implement and test it. Their success in coding stems from the ease of verifying changes (running tests) and AI labs’ incentive to produce effective coding models. The “multi-billion-dollar question” is whether agents can be useful for tasks beyond coding, with research agents (e.g., in law or medicine) showing promise.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Sean also identifies two types of LLM-based products that “don’t work yet but may soon”:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LLM-generated Feeds:&lt;/strong&gt; With major players like Mark Zuckerberg, OpenAI (Sora), and xAI exploring infinite personalised content feeds, this could become a primary mode of interaction. The advantage, like completions, is that users don’t need to interact with a chatbot; inputs come from user behaviour.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Games:&lt;/strong&gt; While speculative, the integration of LLMs into video games, from full world simulations to AI-generated dialogue, holds potential. However, long development cycles, gamer resistance to AI, and challenges in making AI-generated content genuinely “challenging” are hurdles.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-professional-services-imperative-productise-or-perish&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/navigating-the-ai-tsunami-investment-product-and-the-professional-services-imperative/#the-professional-services-imperative-productise-or-perish&quot;&gt;The Professional Services Imperative: Productise or Perish&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The rapid evolution of AI, particularly agentic capabilities, is profoundly reshaping professional services. Jonas Braadbaart starkly illustrates this with the recent news of Accenture firing 11,000 employees who couldn’t adapt to AI, as detailed in his post &lt;a href=&quot;https://jonasbraadbaart.substack.com/p/accenture-just-fired-11000-people&quot; rel=&quot;noopener&quot;&gt;Accenture Just Fired 11,000 People. You’re Next.&lt;/a&gt;. These were not underperformers, but consultants whose billable-hour work was rendered obsolete by AI performing tasks in minutes that once took hours.&lt;/p&gt;&lt;p&gt;This event underscores a critical shift: professional services firms are moving from billable-hour models to &lt;strong&gt;outcome-based business models&lt;/strong&gt;. The economic reality is stark: a EUR 500 per hour client engagement struggles against an AI competitor charging EUR 20 per month.&lt;/p&gt;&lt;p&gt;Jonas argues that firms must “productise or perish.” This involves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Embracing Opportunity:&lt;/strong&gt; Identifying services that can be productised through AI and agentic solutions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Value-Based Pricing:&lt;/strong&gt; Aligning offerings with the value created for customers, rather than time spent. A “back-of-the-napkin” calculation reveals that €20 (the hourly rate for entry-level white-collar positions) can buy 5 million Gemini 3 Pro tokens, translating to 3 million input words and 0.75 million output words. This volume of information would take a human 625 hours to process, costing €12,500 at €20 per hour—a staggering 625x difference in processing cost.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Re-architecting for AI:&lt;/strong&gt; Traditional firm structures, organised around human cognitive limits, are out of sync with AI’s capabilities.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;While venture capital pours into vertical agentic AI startups, Jonas contends that these often struggle to gain significant market share due to the complexity of real-world economies. This presents a unique opportunity for existing professional services firms. By leveraging their “local industry and client expertise” and packaging it into “agentic, done-for-you productised services that create direct customer outcomes,” they can gain a significant advantage.&lt;/p&gt;&lt;p&gt;Jonas makes a bold prediction for 2026 and beyond: “The next big platform play will be to build the Shopify or Stripe of agentic service delivery: a platform that allows professional services firms to build and deliver agentic done-for-you services to their existing clients in a composable no-code environment.”&lt;/p&gt;&lt;h3 id=&quot;synthesis-the-intertwined-future&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/navigating-the-ai-tsunami-investment-product-and-the-professional-services-imperative/#synthesis-the-intertwined-future&quot;&gt;Synthesis: The Intertwined Future&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The perspectives of Andrew Ng, Sean Goedecke, and Jonas Braadbaart paint a cohesive picture of the AI future. Andrew’s call for underinvestment in the AI application layer directly aligns with Sean’s identification of successful product archetypes like completions and agents. These are the “green shoots” Andrew observes, and they represent the kind of AI applications that professional services firms must learn to build and productise, as Jonas argues.&lt;/p&gt;&lt;p&gt;The increasing demand for AI inference capacity, highlighted by Andrew, is a direct consequence of the growing adoption of agentic tools and the massive token consumption demonstrated by Jonas’s calculations. The rapid advancements in models like Claude Sonnet 3.7, GPT-5, and Gemini 3, which have only truly enabled effective agents in the past year, are the catalysts for this transformation.&lt;/p&gt;&lt;p&gt;The AI landscape is not merely a speculative bubble but a rapidly evolving ecosystem. Strategic investment, focused product development on truly effective archetypes, and a fundamental re-evaluation of business models in professional services are not just opportunities but necessities for navigating this transformative period. The future belongs to those who can effectively build, deploy, and productise AI’s capabilities to deliver tangible outcomes.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to Remember Everything You Read</title>
      <link href="https://allarddewinter.net/blog/how-to-remember-everything-you-read/" />
      <updated>2025-11-26T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/how-to-remember-everything-you-read/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://substack.com/@polymathinvestor/note/c-181277895&quot; rel=&quot;noopener&quot;&gt;https://substack.com/@polymathinvestor/note/c-181277895&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This guide offers a systematic approach to transforming reading from passive consumption into active knowledge construction. It addresses a common frustration: investing hours in reading only to find the details slip away within days. The framework combines cognitive science with practical heuristics used by elite learners.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Passive reading (just moving your eyes over text) is a recipe for low retention.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;encoding-and-comprehension-heuristics&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-remember-everything-you-read/#encoding-and-comprehension-heuristics&quot;&gt;Encoding &amp; Comprehension Heuristics&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The foundation lies in how you initially process material:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Preview first&lt;/strong&gt;: Spend 5–10 minutes surveying structure—contents, headings, introduction, summary—before diving into details. This creates a mental framework for new information.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ask questions&lt;/strong&gt;: Convert headings into questions. Reading becomes an active hunt for answers rather than passive intake.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Layered reading&lt;/strong&gt;: Make multiple passes. A quick skim maps the territory; a slower read builds understanding; deep dives target only the most relevant sections.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Active engagement&lt;/strong&gt;: Mark up texts with marginal notes, but highlight sparingly—no more than 10–20% of content. Over-highlighting bypasses the critical decision of what truly matters.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Paraphrase relentlessly&lt;/strong&gt;: Write notes in your own words. If notes approach the length of the source, you are transcribing, not summarising.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;memory-and-retention-frameworks&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-remember-everything-you-read/#memory-and-retention-frameworks&quot;&gt;Memory &amp; Retention Frameworks&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Long-term retention requires deliberate reinforcement:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Spaced repetition&lt;/strong&gt;: Review material at increasing intervals (e.g., one day later, then a few days, then weeks). This exploits the brain’s consolidation processes, with optimal intervals around 10–20% of your desired retention period.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Active recall&lt;/strong&gt;: Test yourself without looking at the material. Close the book and write down key ideas from memory. This strengthens neural pathways far more effectively than re-reading.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Immediate review&lt;/strong&gt;: Revisit new material within 24 hours. Without this, up to 70–80% of new information can vanish before it consolidates.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The “one month later” test&lt;/strong&gt;: True learning is measured by what you can recall after weeks, not minutes. Set a calendar reminder to test yourself a month later; gaps reveal what needs reinforcement.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;If you can’t explain it simply, you don’t really understand it.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;synthesis-and-integration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-remember-everything-you-read/#synthesis-and-integration&quot;&gt;Synthesis &amp; Integration&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Knowledge becomes useful when connected to existing mental models:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Build a latticework&lt;/strong&gt;: Deliberately connect new ideas to what you already know. Each connection creates an additional retrieval cue.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Feynman technique&lt;/strong&gt;: Explain concepts in simple terms as if teaching a novice. Struggling to simplify reveals gaps in understanding.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Zettelkasten method&lt;/strong&gt;: Break ideas into atomic notes, each containing one concept in your own words, and link them to related notes. This external system mirrors a well-connected brain.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Progressive summarisation&lt;/strong&gt;: Distil material in layers—first highlights, then bold the most critical points among those, then write a high-level summary. Each pass reinforces memory while creating ultra-condensed review material.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;tools-and-systems&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-remember-everything-you-read/#tools-and-systems&quot;&gt;Tools &amp; Systems&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Experts offload cognitive load to reliable external systems:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Analog note-taking&lt;/strong&gt;: Writing by hand forces concision and processing. Many maintain a commonplace book or index card system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Digital second brain&lt;/strong&gt;: Tools like Obsidian or Notion allow you to capture, link, and retrieve knowledge with minimal friction. The key is consistent review, not complex organisation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Spaced repetition software&lt;/strong&gt;: For facts requiring verbatim recall, apps like Anki automatically schedule reviews at optimal intervals.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frictionless capture&lt;/strong&gt;: Carry a notebook or use quick-capture apps. If an idea takes more than a few seconds to record, you will resist doing it.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;mindset-and-behavioural-heuristics&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-remember-everything-you-read/#mindset-and-behavioural-heuristics&quot;&gt;Mindset &amp; Behavioural Heuristics&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The underlying psychology determines success:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Curiosity as engine&lt;/strong&gt;: Approach material with genuine questions. Curiosity primes the brain’s reward and memory centres, releasing dopamine that enhances learning.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Growth mindset&lt;/strong&gt;: Believe memory is improvable through strategy and practice, not a fixed trait. This reduces anxiety and encourages persistence.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Patience and persistence&lt;/strong&gt;: Deep understanding forms gradually. Accept that you will forget some material and treat each review as part of the journey.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deep work habit&lt;/strong&gt;: Dedicate uninterrupted blocks to single-tasking. Divided attention produces shallow, fragmented encoding.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Memory is a marathon, not a sprint; train and fuel accordingly.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A personal note on implementation: the resistance to reading things twice—or only partially—stems from a desire for efficiency. Yet elite readers accept that strategic re-reading of high-value material yields greater returns than consuming more content superficially. The key is selectivity: skim widely, but invest deeply in the 20% that matters most. Experimentation will reveal which techniques integrate naturally into existing habits.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Good Engineering Management - Is a Fad</title>
      <link href="https://allarddewinter.net/blog/good-engineering-management-is-a-fad/" />
      <updated>2025-11-24T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/good-engineering-management-is-a-fad/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://lethain.com/good-eng-mgmt-is-a-fad/&quot; rel=&quot;noopener&quot;&gt;https://lethain.com/good-eng-mgmt-is-a-fad/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Larson’s bird’s-eye view of leadership evolution provides a useful antidote to prevailing narratives. The ability to step back and recognise these cyclical patterns is valuable. Rather than chasing fashionable management doctrines, focusing on these common characteristics offers a more stable foundation. These eight skills serve as practical anchors while the industry continues its inevitable shifts.&lt;/p&gt;&lt;p&gt;Will Larson observes that engineering management has cycled through distinct eras, each demanding different behaviours from its leaders. What constitutes “good” management is not a timeless truth but a response to prevailing business conditions. This macro perspective reveals that while styles fluctuate, certain foundational skills persist.&lt;/p&gt;&lt;h2 id=&quot;three-eras-of-engineering-leadership&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#three-eras-of-engineering-leadership&quot;&gt;Three Eras of Engineering Leadership&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Larson identifies three periods with sharply different expectations:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Era&lt;/th&gt;&lt;th&gt;Time Period&lt;/th&gt;&lt;th&gt;Business Context&lt;/th&gt;&lt;th&gt;Expected Manager Behaviour&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Yahoo&lt;/td&gt;&lt;td&gt;Late 2000s&lt;/td&gt;&lt;td&gt;Stable organisations, limited resources&lt;/td&gt;&lt;td&gt;Navigate bureaucracy, identify opportunities, minimal direct reports contact&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hypergrowth&lt;/td&gt;&lt;td&gt;2010s&lt;/td&gt;&lt;td&gt;Zero-interest-rate policy&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, hiring as constraint&lt;/td&gt;&lt;td&gt;Attract and retain engineers, stop coding, focus on team motivation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Post-ZIRP&lt;/td&gt;&lt;td&gt;Late 2022+&lt;/td&gt;&lt;td&gt;Higher interest rates, AI productivity promises&lt;/td&gt;&lt;td&gt;Flattened hierarchies, hands-on technical work, coordination roles reduced&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Each transition arrived with a morality tale. The 2010s framed empowering engineers as a fundamental good; the 2020s recast middle managers as bureaucratic drag. Larson argues these narratives obscure the true driver: shifting business realities.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The industry will want different things from you as it evolves, and it will tell you that each of those shifts is because of some complex moral change, but it’s pretty much always about business realities changing.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If you accept any morality tale as absolute truth, you risk being misaligned when the cycle shifts again.&lt;/p&gt;&lt;h2 id=&quot;eight-foundational-skills&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#eight-foundational-skills&quot;&gt;Eight Foundational Skills&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Despite these swings, Larson proposes eight enduring skills that transfer across eras. He groups them into core and growth categories.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Core skills&lt;/strong&gt; (essential for all management levels):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Execution&lt;/strong&gt;: Lead teams to deliver tangible and intangible work consistently. Examples include shipping projects, managing on-call rotations, and incident response.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Team&lt;/strong&gt;: Shape team and environment to balance organisational and individual needs. This covers hiring, coaching, performance management, and advocacy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ownership&lt;/strong&gt;: Navigate reality to make progress despite systemic difficulties. This means showing up when uncomfortable and being accountable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Alignment&lt;/strong&gt;: Build shared understanding across leadership, stakeholders, and teams. This prevents surprises and ensures realistic planning.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Growth skills&lt;/strong&gt; (determine career progression):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Taste&lt;/strong&gt;: Exercise discerning judgment about what “good” looks like technically, in business terms, and in process/strategy. This helps avoid high-risk rewrites and refine product concepts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clarity&lt;/strong&gt;: Ensure all parties understand your approach, reasoning, and how you overcome biggest problems.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Navigating ambiguity&lt;/strong&gt;: Move from messy, open-ended problems to viable approaches.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Working across timescales&lt;/strong&gt;: Balance short-term delivery with long-term sustainability without cutting corners.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The distinction between core and growth is not fixed. Execution, for example, was less central during hypergrowth but has regained prominence today.&lt;/p&gt;&lt;h2 id=&quot;self-assessing-on-these-skills&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#self-assessing-on-these-skills&quot;&gt;Self-Assessing on These Skills&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Larson includes a set of reflective questions in his article to help managers evaluate their proficiency across each of the eight skills. These questions probe areas such as team delivery friction, hiring and retention track record, problem ownership, stakeholder alignment, technical judgment, decision-making clarity, ability to unstick ambiguous problems, and trade-offs between short and long-term priorities. He also observes that executives often poach managers onto their most important problems that correspond to their strengths—if they never attempt to pull you in, you may not be considered particularly strong on that dimension.&lt;/p&gt;&lt;h2 id=&quot;career-trade-offs&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#career-trade-offs&quot;&gt;Career Trade-offs&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The “Manage your priorities and energy” chapter in &lt;em&gt;The Engineering Executive’s Primer&lt;/em&gt; captures an important reality: the perfect allocation of work is not the mathematically ideal allocation that maximises impact. Instead, it’s the balance between that mathematical ideal and doing things that energise you enough to stay motivated over the long haul.&lt;/p&gt;&lt;p&gt;Recognising where you are in your career and making deliberate trade-offs is one of the highest value things you can do. Most importantly, it’s extremely hard to have a career at all if you don’t think about these dimensions and have a healthy amount of self-awareness to understand the tradeoffs that will allow you to stay engaged over half a lifetime.&lt;/p&gt;&lt;h2 id=&quot;takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#takeaways&quot;&gt;Takeaways&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Management expectations change with business cycles, not moral imperatives&lt;/li&gt;&lt;li&gt;Morality tales about leadership obscure economic drivers&lt;/li&gt;&lt;li&gt;Develop a broad base across all eight skills to remain effective across eras&lt;/li&gt;&lt;li&gt;Prioritise work that energises you to sustain a long-term career&lt;/li&gt;&lt;li&gt;Recognise where you are in your career and make deliberate trade-offs&lt;/li&gt;&lt;/ul&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;ZIRP refers to the zero-interest-rate policy environment that characterised much of the 2010s, where central banks kept interest rates near zero to stimulate economic growth. &lt;a href=&quot;https://allarddewinter.net/blog/good-engineering-management-is-a-fad/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Thinking Like an Architect: Beyond the Job Title</title>
      <link href="https://allarddewinter.net/blog/thinking-like-an-architect-beyond-the-job-title/" />
      <updated>2025-11-19T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/thinking-like-an-architect-beyond-the-job-title/</id>
      <content type="html">
				&lt;p&gt;Interesting and funny talk from Gregor: &lt;a href=&quot;https://www.youtube.com/watch?v=xtxfrxf0mfE&quot; rel=&quot;noopener&quot;&gt;https://www.youtube.com/watch?v=xtxfrxf0mfE&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Gregor Hohpe challenges the traditional view of an architect as a decision-maker or the “smartest person in the room.” Instead, he posits that an architect’s true value lies in making everyone else smarter, acting as an amplifier and translator across different organisational levels. This involves connecting disparate parts of a business, using powerful metaphors to bridge communication gaps, and employing models to sharpen thinking and facilitate better decisions.&lt;/p&gt;&lt;p&gt;Hohpe argues that the architect’s role is not to dictate but to empower, enabling teams to navigate complexity and make informed choices.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“I don’t think the architects should strive or pretend to be the smartest people in the room and decide for other people. Rather, we should make everybody else a little bit smarter.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-architect-as-an-amplifier&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/thinking-like-an-architect-beyond-the-job-title/#the-architect-as-an-amplifier&quot;&gt;The Architect as an Amplifier&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hohpe outlines several key ways architects can amplify intelligence within an organisation:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Connecting Different Levels (The Architect Elevator):&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Organisations often suffer from disconnects between “upper management” (the penthouse) and “development teams” (the engine room).&lt;/li&gt;&lt;li&gt;Architects act as an “elevator,” facilitating fast vertical movement and translation between these levels, ensuring technical efforts align with business strategy and vice versa.&lt;/li&gt;&lt;li&gt;This isn’t about telling different stories but translating decisions and constraints so they make sense to each audience.&lt;/li&gt;&lt;li&gt;The architect’s role is not to “dig” (code extensively) but to ensure the “tunnels meet,” occasionally picking up a shovel to stay connected to reality.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Using Metaphors:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Metaphors translate complex technical problems, constraints, and decisions into a domain easily understood by the audience.&lt;/li&gt;&lt;li&gt;They are not merely “cute stories” but powerful tools that allow the audience to “think along with you” in their own context.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Example:&lt;/strong&gt; Hohpe uses car metaphors (accelerator vs. gas pedal, disruption with Japanese cars, “Halo products” in cloud services) and train metaphors (self-centering wheels, guard rails vs. lane assist) to explain complex concepts like technical debt, platforms, and governance.&lt;/li&gt;&lt;li&gt;The most effective metaphors leverage the audience’s business domain (e.g., financial options in a financial services context).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seeing More Dimensions:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Architects often perceive more dimensions in a problem than others, moving discussions from a binary “either/or” to a multi-dimensional “both/and.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Example:&lt;/strong&gt; Instead of viewing “cutting project timelines” and “compromising quality” as opposing forces, an architect might introduce dimensions like “shifting testing earlier” or “automated testing” to show how both can be achieved.&lt;/li&gt;&lt;li&gt;Discussing “vendor lock-in” can be reframed by considering the “utility” gained from a service versus the “switching cost,” leading to a more balanced ROI discussion.&lt;/li&gt;&lt;li&gt;Lock-in is not just vendor-specific; any change has a switching cost, even within open-source products or different versions.&lt;/li&gt;&lt;li&gt;“Mental lock-in” occurs when thinking is confined to a vendor’s product terms (e.g., always thinking in AWS SQS/SNS instead of generic queues and retry policies).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expanding the Solution Space:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Architects break down problems, add dimensions, and understand interdependencies to expand the range of possible solutions.&lt;/li&gt;&lt;li&gt;This moves discussions beyond simple “left or right” choices, making people “smarter and ultimately happier” by offering more nuanced options.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Architect Boomerang:&lt;/strong&gt; When faced with buzzword-driven demands (e.g., “we need to be cloud-native”), an architect asks “what are we really after?” (resilience, scalability, developer productivity, reduced switching cost). This allows them to identify more options, understand trade-offs, and return with a better-fitting solution.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-architect-as-a-modeller&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/thinking-like-an-architect-beyond-the-job-title/#the-architect-as-a-modeller&quot;&gt;The Architect as a Modeller&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Models for Sharpening Thinking:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Models are powerful tools for making people smarter, particularly at mid-levels of the organisation.&lt;/li&gt;&lt;li&gt;They are not meant to be accurate depictions of reality but rather to sharpen thinking and aid decision-making.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Example:&lt;/strong&gt; The shift from a geocentric to a heliocentric model of the solar system simplified understanding by using a more suitable model, even though all models are inherently “wrong.”&lt;/li&gt;&lt;li&gt;Simple models are often more useful than over-elaborate ones, as they abstract away complexity to focus on key insights.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The “Read the Rest of the Paper” Rule:&lt;/strong&gt; Architects delve deeper than surface-level understanding, applying principles like George Box’s quote: “All models are wrong, but some are useful.” Simple models are the most useful.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context-Dependent Models:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The “best” model depends on the question being asked. A topographical map is excellent for planning a hike but useless for understanding population density.&lt;/li&gt;&lt;li&gt;When asked to “show me your architecture,” a valid retort is “what question are you looking to answer?”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sketching for Two-Way Communication:&lt;/strong&gt; While standard models (UML, C4) are great for broadcasting information, custom sketches are powerful for two-way conversations, aiding dialogue and decision-making.&lt;/li&gt;&lt;li&gt;Sketches can express over 20 dimensions (colour, shape, size, proximity, squiggliness for certainty), making them incredibly rich tools for communication.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Raising the Level of Abstraction:&lt;/strong&gt; “High-level diagrams” should not “dumb down” information. Instead, they should raise the level of abstraction to deepen thinking and reveal different complexities, as seen in the “Powers of Ten” concept.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;failure-modes-and-countermeasures&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/thinking-like-an-architect-beyond-the-job-title/#failure-modes-and-countermeasures&quot;&gt;Failure Modes and Countermeasures&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hohpe highlights common pitfalls architects face:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Believing the Audience “Doesn’t Get It”:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;People are not stupid; they have different incentives and motivations.&lt;/li&gt;&lt;li&gt;An architect must translate their message into the audience’s language (e.g., selling “speed” to someone who cares about “cost” by linking speed to reduced operational costs or opportunity costs).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Trying to Change Behaviour Directly:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;It’s nearly impossible to change behaviour without first changing underlying assumptions and beliefs.&lt;/li&gt;&lt;li&gt;If someone resists change, it’s often because they believe “change brings operational risk” (e.g., “never touch a running system”). The architect must address these beliefs with evidence and alternative approaches.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Being Labelled “Too Academic”:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;When using the “architect boomerang” to explore options, some may demand a quick decision.&lt;/li&gt;&lt;li&gt;Hohpe’s “coin toss” analogy illustrates that an “informed decision” is preferable to a random one, justifying a brief pause for architectural thinking.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Making Things “More Complicated”:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;This perception arises when others assume a stable, predictable future.&lt;/li&gt;&lt;li&gt;Architects must challenge this “wrong assumption” by highlighting that complexity arises from uncertainty and change, which good architecture helps manage.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/thinking-like-an-architect-beyond-the-job-title/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hohpe concludes that “architect” is not a job title but a way of thinking. By embracing the roles of amplifier, translator, and modeller, architects can empower others, foster better decision-making, and ultimately make organisations more effective and adaptable.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Architecture and agility are absolutely no opposites; they’re no contradiction. Both thrive with high levels of uncertainty.”&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Three Kinds of AI Products That Currently Work</title>
      <link href="https://allarddewinter.net/blog/three-kinds-of-ai-products-that-currently-work/" />
      <updated>2025-11-16T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/three-kinds-of-ai-products-that-currently-work/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://www.seangoedecke.com/ai-products/&quot; rel=&quot;noopener&quot;&gt;https://www.seangoedecke.com/ai-products/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Sean Goedecke identifies three categories of AI products that have demonstrated viability and success in the market: chatbots, completion tools, and agents. While many “AI products” are merely variations of chatbots, Goedecke argues that only specific implementations of these three archetypes truly deliver value. He also discusses two emerging categories—AI-generated feeds and AI-powered games—that show future potential.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“As far as I can tell, there are only three types of AI product that currently work.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-three-working-ai-product-archetypes&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/three-kinds-of-ai-products-that-currently-work/#the-three-working-ai-product-archetypes&quot;&gt;The Three Working AI Product Archetypes&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Goedecke categorises successful AI products into three distinct types:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chatbots:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; The most popular LLM product, exemplified by ChatGPT. These allow users to interact with an LLM in natural language for a wide range of tasks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; The best chatbot is often the model itself (e.g., ChatGPT), which has advantages in model access and simultaneous harness development.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Variants:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Explicit Roleplay:&lt;/strong&gt; Chatbots that cater to niches (e.g., adult content) that mainstream models avoid. Goedecke notes ethical concerns and the likelihood of large labs eventually entering this space.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Chatbots with Tools (AI Assistants):&lt;/strong&gt; These allow the model to perform actions (e.g., booking meetings). However, they are prone to “jailbreaking” for malicious use (e.g., refunds) and often provide a worse user interface than direct actions (e.g., &lt;code&gt;Ctrl+Plus&lt;/code&gt; for font size).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Completion Tools:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Products that act as “smart autocomplete,” suggesting completions as a user types. GitHub Copilot is the prime example.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Advantage:&lt;/strong&gt; Users do not need to interact with a chatbot, seamlessly integrating AI power into existing workflows without changing user interface habits.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Observation:&lt;/strong&gt; While highly successful in coding, their adoption in other areas like professional writing has been slower, possibly due to user familiarity with existing autocomplete in code editors.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agents:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Description:&lt;/strong&gt; Systems where the AI takes an initial natural language request and autonomously implements and tests the solution. Coding agents (e.g., Claude Code, GPT-5-Codex) are the most prominent example.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Distinction from Chatbots with Tools:&lt;/strong&gt; Agents manage a sequence of actions, rather than just single tool calls, making them effective for complex tasks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Why Coding Agents Work:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Verifiability:&lt;/strong&gt; Changes can be easily validated through tests or compilation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Incentive:&lt;/strong&gt; AI labs are motivated to develop effective coding models for their own use.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Future Potential:&lt;/strong&gt; Research agents (e.g., for skimming search results or data analysis) are emerging, with potential in specialised fields like medicine or law.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;emerging-ai-product-categories&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/three-kinds-of-ai-products-that-currently-work/#emerging-ai-product-categories&quot;&gt;Emerging AI Product Categories&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Goedecke also identifies two categories that are not yet widely successful but show significant future potential:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;LLM-Generated Feeds:&lt;/strong&gt; Infinite, personalised content feeds generated by AI, similar to social media feeds but with AI-created content. This leverages existing user habits of scrolling feeds.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;AI-Based Video Games:&lt;/strong&gt; Games that incorporate LLMs for content generation, dialogue, or even full world simulations. Challenges include long development cycles, gamer resistance to AI-generated content, and the difficulty of making AI-generated content engaging and challenging.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;commentary&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/three-kinds-of-ai-products-that-currently-work/#commentary&quot;&gt;Commentary&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sean’s analysis highlights a crucial distinction between AI as a feature and AI as a standalone product. Many “AI products” are simply chatbots, which often struggle to compete with general-purpose models like ChatGPT or face usability issues when trying to integrate tools. The success of completion tools like GitHub Copilot underscores the value of AI that enhances existing workflows without forcing a new interaction paradigm.&lt;/p&gt;&lt;p&gt;The rise of agents, particularly in coding, points towards a future where AI handles more complex, multi-step tasks autonomously. This shift from conversational interfaces to task-oriented execution is a significant development. The discussion on “AI-generated feeds” and “AI-based video games” also touches on the broader impact of generative AI on content creation and consumption, suggesting a future where AI plays a more direct role in shaping our digital experiences.&lt;/p&gt;&lt;p&gt;A key takeaway is that the most successful AI products often integrate AI capabilities seamlessly into existing user behaviours or solve specific, verifiable problems, rather than trying to replace established user interfaces with chat. The Hacker News comments further elaborate on this, pointing out successful AI applications in areas like grammar checking (Grammarly), translation (DeepL), and document processing, which often operate as embedded features rather than overt “AI products.” This suggests that the most impactful AI might be the one users don’t explicitly notice, working behind the scenes to enhance functionality.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Mastering Claude Code: Core Settings and Process for Developers</title>
      <link href="https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/" />
      <updated>2025-11-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://blog.sshh.io/p/how-i-use-every-claude-code-feature&quot; rel=&quot;noopener&quot;&gt;https://blog.sshh.io/p/how-i-use-every-claude-code-feature&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Shrivu Shankar’s guide highlights key strategies for optimising Claude Code, focusing on practical application for both personal and enterprise development. This summary distils the core settings and processes essential for effective AI integration into coding workflows.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“The single most important file in your codebase for using Claude Code effectively is the root &lt;a href=&quot;http://CLAUDE.md&quot; rel=&quot;noopener&quot;&gt;CLAUDE.md&lt;/a&gt;. This file is the agent’s “constitution,” its primary source of truth for how your specific repository works.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;claudemd-the-agents-constitution&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#claudemd-the-agents-constitution&quot;&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;: The Agent’s Constitution&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;CLAUDE.md&lt;/code&gt; file is fundamental, acting as the primary source of truth for how Claude Code interacts with your repository.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Core Principles:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Targeted Guardrails:&lt;/strong&gt; Document common agent errors or specific project constraints rather than creating a comprehensive manual.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Context Efficiency:&lt;/strong&gt; Avoid embedding large external documents; instead, provide clear references and conditions for their use.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Actionable Guidance:&lt;/strong&gt; Always provide alternative actions when imposing limitations, preventing the agent from getting stuck.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Simplify Tooling:&lt;/strong&gt; Use &lt;code&gt;CLAUDE.md&lt;/code&gt; to drive the simplification of complex CLI commands into more intuitive wrappers.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;context-management-and-session-control&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#context-management-and-session-control&quot;&gt;Context Management &amp; Session Control&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Efficiently managing Claude’s context window is vital for performance and cost.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Monitor Context:&lt;/strong&gt; Regularly use &lt;code&gt;/context&lt;/code&gt; to track token usage.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Avoid &lt;code&gt;/compact&lt;/code&gt;:&lt;/strong&gt; This automatic compaction is often unreliable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Strategic Resets:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Simple Reboot:&lt;/strong&gt; &lt;code&gt;/clear&lt;/code&gt; followed by a custom &lt;code&gt;/catchup&lt;/code&gt; command (to re-read changed files) is the preferred method.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Complex Tasks:&lt;/strong&gt; For larger efforts, “Document &amp; Clear” involves saving progress to a &lt;code&gt;.md&lt;/code&gt; file, clearing the session, and then instructing Claude to resume from the saved document.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;slash-commands-personal-shortcuts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#slash-commands-personal-shortcuts&quot;&gt;Slash Commands: Personal Shortcuts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Slash commands should be simple, personal shortcuts for frequent actions.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Streamline common tasks (e.g., &lt;code&gt;/catchup&lt;/code&gt; for reading changes, &lt;code&gt;/pr&lt;/code&gt; for pull request preparation).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Avoid Complexity:&lt;/strong&gt; Do not create a complex, mandatory set of commands that requires separate documentation.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;agent-orchestration-master-clone-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#agent-orchestration-master-clone-approach&quot;&gt;Agent Orchestration: Master-Clone Approach&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For complex tasks, the “Master-Clone” architecture offers a flexible alternative to rigid subagents.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Subagent Drawbacks:&lt;/strong&gt; Subagents can hide context and force predefined workflows, limiting the agent’s holistic reasoning.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Master-Clone:&lt;/strong&gt; Centralise core context in &lt;code&gt;CLAUDE.md&lt;/code&gt; and allow the main agent to dynamically delegate work to copies of itself using &lt;code&gt;Task(...)&lt;/code&gt;. This preserves full context while distributing effort.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;hooks-and-session-history&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#hooks-and-session-history&quot;&gt;Hooks &amp; Session History&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Leveraging hooks and historical data enhances control, validation, and continuous improvement.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Session History:&lt;/strong&gt; Use &lt;code&gt;claude --resume&lt;/code&gt; to restart sessions and extract insights from past interactions, informing &lt;code&gt;CLAUDE.md&lt;/code&gt; improvements.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Validation Hooks:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Block-at-Submit:&lt;/strong&gt; Implement hooks (e.g., &lt;code&gt;PreToolUse&lt;/code&gt;) to validate results at the commit stage, forcing the agent to fix issues before committing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Avoid Mid-Process Blocking:&lt;/strong&gt; Allow the agent to complete its task before validating the final outcome, preventing confusion.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;planning-and-skills&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#planning-and-skills&quot;&gt;Planning &amp; Skills&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Evolving agent autonomy through structured planning and “Skills” is key to robust interaction.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Structured Planning:&lt;/strong&gt; Use Claude’s built-in planning mode for complex changes to align on strategy and define inspection checkpoints.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Skills (Scripting Model):&lt;/strong&gt; Formalise the agent’s ability to directly access the environment (binaries, scripts) and generate code on the fly via &lt;code&gt;SKILL.md&lt;/code&gt;. This is more robust than traditional tool-calling.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MCP’s Evolved Role:&lt;/strong&gt; MCPs should act as secure data gateways, providing high-level tools for authentication and security, rather than mirroring entire APIs.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;claude-code-sdk-and-github-actions&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#claude-code-sdk-and-github-actions&quot;&gt;Claude Code SDK &amp; GitHub Actions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Claude Code SDK and GitHub Actions (GHA) enable powerful automation and integration.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;SDK Use Cases:&lt;/strong&gt; Parallel scripting for refactors, building internal chat tools, and rapid agent prototyping.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GitHub Action:&lt;/strong&gt; Operationalise Claude Code within GHAs for automated workflows (e.g., “PR-from-anywhere”) and auditable processes, driving continuous improvement.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;advanced-customisation-settingsjson&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mastering-claude-code-core-settings-and-process-for-developers/#advanced-customisation-settingsjson&quot;&gt;Advanced Customisation (&lt;code&gt;settings.json&lt;/code&gt;)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;settings.json&lt;/code&gt; file provides crucial customisation for advanced users.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Use &lt;code&gt;HTTPS_PROXY/HTTP_PROXY&lt;/code&gt; for traffic inspection.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Timeouts:&lt;/strong&gt; Adjust &lt;code&gt;MCP_TOOL_TIMEOUT/BASH_MAX_TIMEOUT_MS&lt;/code&gt; for long-running commands.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;API Keys:&lt;/strong&gt; Utilise enterprise API keys for usage-based pricing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security:&lt;/strong&gt; Regularly review &lt;code&gt;permissions&lt;/code&gt; for auto-run commands.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By focusing on these core settings and processes, developers can effectively harness Claude Code to enhance productivity and maintain code quality.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Functional Core, Imperative Shell: Separating Logic from Side Effects</title>
      <link href="https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/" />
      <updated>2025-10-28T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://testing.googleblog.com/2025/10/simplify-your-code-functional-core.html?m=1&quot; rel=&quot;noopener&quot;&gt;Simplify Your Code: Functional Core, Imperative Shell&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The “Functional Core, Imperative Shell” (FCIS) pattern advocates for a clear separation between an application’s pure business logic and its interactions with the outside world. This architectural approach aims to enhance testability, maintainability, and adaptability by confining side effects to a thin, imperative layer.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Mixing database calls, network requests, and other external interactions directly with your core logic can lead to code that’s difficult to test, reuse, and understand. Instead, consider writing a functional core that’s called from an imperative shell.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;understanding-the-components&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#understanding-the-components&quot;&gt;Understanding the Components&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Functional Core:&lt;/strong&gt; This part contains pure, testable business logic. It operates solely on the data it is given, producing predictable outputs without causing any side effects (such as I/O operations or external state mutations). Its purity makes it inherently easier to reason about and unit test in isolation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Imperative Shell:&lt;/strong&gt; This layer is responsible for handling all side effects. It orchestrates interactions with external systems like databases, APIs, or user interfaces. The shell uses functions from the functional core to perform business logic, acting as the bridge between the pure logic and the impure reality of external dependencies.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;why-adopt-fcis&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#why-adopt-fcis&quot;&gt;Why Adopt FCIS?&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Enhanced Testability:&lt;/strong&gt; The functional core can be tested exhaustively with unit tests, as its behaviour is deterministic and free from external dependencies. This significantly reduces the need for complex integration tests for core logic.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved Maintainability:&lt;/strong&gt; By isolating side effects, changes to external systems (e.g., swapping a database or email service) primarily affect the imperative shell, leaving the stable functional core untouched.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Increased Reusability:&lt;/strong&gt; Pure functions within the core are highly reusable across different contexts or imperative shells, as they have no hidden dependencies.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clearer Separation of Concerns:&lt;/strong&gt; This pattern enforces a disciplined approach to software design, making it easier to understand which parts of the codebase are responsible for what.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;example-sending-expiration-notifications&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#example-sending-expiration-notifications&quot;&gt;Example: Sending Expiration Notifications&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Consider a function to send expiration notification emails. A common “messy” approach might interleave database calls and email sending directly within the logic:&lt;/p&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Bad: Logic and side effects are mixed&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; datetime

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscription_end_date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; is_free_trial&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; email
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subscription_end_date &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subscription_end_date
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_free_trial &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_free_trial

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Database&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_users&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Simulates fetching all users from a database&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            User&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alice@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            User&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bob@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            User&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Charlie&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;charlie@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; recipient&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subject&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Sending email to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;recipient&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;subject&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;send_user_expiry_email_bad&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    db &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Database&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    email_service &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; EmailService&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    today &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;today&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; user &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_users&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subscription_end_date &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; today&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_free_trial&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;continue&lt;/span&gt;
        email_service&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Your account has expired &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Example usage (not run in actual blog post)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# send_user_expiry_email_bad()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rewriting this using the FCIS pattern separates the pure logic from the side effects:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Functional Core (Python):&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Functional Core: Pure business logic&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; datetime

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Re-using the User class definition from above&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subscription_end_date&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; is_free_trial&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; name
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; email
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subscription_end_date &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subscription_end_date
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_free_trial &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; is_free_trial

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_expired_users&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;users&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;User&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; cutoff_date&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;User&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Filters a list of users to find those with expired, non-free trial subscriptions.&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        user &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; user &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; users
        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;subscription_end_date &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; cutoff_date &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;is_free_trial
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;generate_expiry_emails&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;users&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;User&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Generates email details (recipient, subject) for a list of users.&quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;email&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Your account has expired &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;user&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; user &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; users
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Imperative Shell (Python):&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Imperative Shell: Handles side effects and orchestrates the functional core&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Database&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Re-using the Database class definition from above&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_users&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Simulates fetching all users from a database&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
            User&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;alice@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            User&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;bob@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            User&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Charlie&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;charlie@example.com&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2025&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;EmailService&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Re-using the EmailService class definition from above&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;send_bulk&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; emails&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;tuple&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; recipient&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; subject &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; emails&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Sending email to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;recipient&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;subject&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;send_expiry_notifications_fcis&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    db &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Database&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    email_service &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; EmailService&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    today &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; datetime&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;date&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;today&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    all_users &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_users&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Side effect: database read&lt;/span&gt;
    expired_users &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; get_expired_users&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;all_users&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; today&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Pure function call&lt;/span&gt;
    emails_to_send &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; generate_expiry_emails&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;expired_users&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Pure function call&lt;/span&gt;
    email_service&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send_bulk&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;emails_to_send&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# Side effect: sending emails&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Example usage (not run in actual blog post)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# send_expiry_notifications_fcis()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This refactoring makes the core logic (&lt;code&gt;get_expired_users&lt;/code&gt;, &lt;code&gt;generate_expiry_emails&lt;/code&gt;) pure and easily testable. The imperative shell then handles the actual database retrieval (&lt;code&gt;db.get_users()&lt;/code&gt;) and email dispatch (&lt;code&gt;email_service.send_bulk()&lt;/code&gt;).&lt;/p&gt;&lt;h3 id=&quot;reflections-and-nuances&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#reflections-and-nuances&quot;&gt;Reflections and Nuances&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;From: &lt;a href=&quot;https://news.ycombinator.com/item?id=45701901&quot; rel=&quot;noopener&quot;&gt;https://news.ycombinator.com/item?id=45701901&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The FCIS pattern, while powerful, invites discussion on its practical application and relationship with other architectural principles.&lt;/p&gt;&lt;h4 id=&quot;fcis-vs-generic-core-specific-shell-gcss&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fcis-vs-generic-core-specific-shell-gcss&quot;&gt;FCIS vs. “Generic Core, Specific Shell” (GCSS)&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;A related concept, “Generic Core, Specific Shell,” suggests building a generic core that can address a family of related problems, adapted by a specific shell for particular needs. While seemingly opposed, these two ideas can be seen as orthogonal or even complementary&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;FCIS&lt;/strong&gt; focuses on &lt;em&gt;verification&lt;/em&gt; (“Does it do what it’s supposed to do?”) by isolating side effects for easier testing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GCSS&lt;/strong&gt; focuses on &lt;em&gt;validation&lt;/em&gt; (“Is what it’s supposed to do what we actually need it to do?”) by promoting adaptability and reusability across similar problems.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ideally, GCSS can be applied recursively, with specific shells adapting slightly more generic cores. FCIS, on the other hand, is more about the boundary between pure logic and impure effects within a component.&lt;/p&gt;&lt;h4 id=&quot;practical-considerations-and-criticisms&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#practical-considerations-and-criticisms&quot;&gt;Practical Considerations and Criticisms&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Database Interaction:&lt;/strong&gt; A common critique of the example is the &lt;code&gt;db.get_users()&lt;/code&gt; call within the imperative shell, which implies fetching &lt;em&gt;all&lt;/em&gt; users into memory before filtering. In real-world scenarios, the imperative shell would typically interact with the database to perform filtered queries directly (e.g., &lt;code&gt;db.get_expired_users(datetime.date.today())&lt;/code&gt;) to avoid performance issues&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;. The example serves to illustrate the separation of concerns rather than an optimal database interaction strategy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Readability of Chained Calls:&lt;/strong&gt; The one-liner &lt;code&gt;email.bulkSend(generateExpiryEmails(getExpiredUsers(db.getUsers(), Date.now())));&lt;/code&gt; can be difficult to read and debug. Many developers prefer breaking this into multiple lines with intermediate variables for clarity, or using pipe operators available in some languages&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Over-engineering vs. Adaptability:&lt;/strong&gt; While GCSS promotes adaptability, it also carries the risk of over-engineering if not applied judiciously, potentially violating KISS (Keep It Simple, Stupid) and YAGNI (You Ain’t Gonna Need It) principles. The balance lies in understanding the context and anticipated evolution of the system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The “Good Code” Debate:&lt;/strong&gt; The discussion around FCIS often touches upon the subjective nature of “good code.” Different paradigms (e.g., Object-Oriented Programming, Domain-Driven Design) offer distinct approaches, and what constitutes “good” can depend on the project, team, and specific challenges. FCIS offers a valuable lens for achieving certain qualities like testability and maintainability, but it is not the sole arbiter of code quality.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Time-Dependent Logic:&lt;/strong&gt; The use of &lt;code&gt;Date.now()&lt;/code&gt; (or &lt;code&gt;datetime.date.today()&lt;/code&gt; in Python) in the example highlights a common challenge: how to handle time-dependent logic in a testable way. Injecting a “clock” dependency (e.g., &lt;code&gt;clock.now()&lt;/code&gt;) rather than relying on global time functions is crucial for deterministic testing.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ultimately, FCIS provides a robust framework for structuring code, particularly in languages that support functional programming constructs. It encourages a mindset where core logic is pristine and predictable, while external interactions are managed explicitly at the boundaries. This distinction is crucial for building software that is both robust and easy to evolve.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;As one commenter noted, “I disagree that these two pieces of advice are opposed. I think they are orthogonal at worst, and in agreement at best.” &lt;a href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The author of the original article acknowledged this, stating, “I do regret using ‘db’ a bit now after reading all of the comments here, as it’s taken away focus from the main point.” &lt;a href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Languages like Elixir, with its pipe operator (&lt;code&gt;|&gt;&lt;/code&gt;), can make such chained calls significantly more readable. &lt;a href=&quot;https://allarddewinter.net/blog/functional-core-imperative-shell-separating-logic-from-side-effects/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Securely Accessing OpenWebUI with Tailscale Funnel on Proxmox</title>
      <link href="https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/" />
      <updated>2025-10-22T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/</id>
      <content type="html">
				&lt;p&gt;This guide outlines a method for making your OpenWebUI instance publicly accessible via &lt;a href=&quot;https://tailscale.com/kb/1223/funnel&quot; rel=&quot;noopener&quot;&gt;Tailscale Funnel&lt;/a&gt;, while maintaining robust security on your Proxmox host. The approach isolates OpenWebUI within an LXC container and uses Nginx as a reverse proxy, ensuring that only the OpenWebUI service is exposed.&lt;/p&gt;&lt;p&gt;This solution segments access so only the OpenWebUI service is publicly available while keeping your critical management interfaces secure.&lt;/p&gt;&lt;p&gt;This setup is designed for security and maintainability, providing persistent data, auto-updates, and compatibility with various network environments.&lt;/p&gt;&lt;h2 id=&quot;1-environment-setup-overview&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#1-environment-setup-overview&quot;&gt;1. Environment Setup Overview&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The solution consists of three main environments with specific tools and purposes:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Environment&lt;/th&gt;&lt;th&gt;Tools Installed&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Proxmox Host&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Nginx, Tailscale&lt;/td&gt;&lt;td&gt;Reverse proxy and secure public access&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;LXC Container&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Docker, OpenWebUI&lt;/td&gt;&lt;td&gt;Application isolation and execution&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tailscale Network&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;ACLs, Funnel&lt;/td&gt;&lt;td&gt;Secure access control and public exposure&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;2-architecture-options&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#2-architecture-options&quot;&gt;2. Architecture Options&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before proceeding with the setup, consider these architectural choices based on your specific needs. The standard implementation is optimized for home use where simplicity and reliability are prioritized over enterprise-grade scalability.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Component&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;th&gt;Tool Used&lt;/th&gt;&lt;th&gt;Practical Alternatives&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Container Platform&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Isolates the application from the host system&lt;/td&gt;&lt;td&gt;LXC on Proxmox&lt;/td&gt;&lt;td&gt;Docker on bare metal (simpler but less isolation)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Reverse Proxy&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Routes traffic to the correct service&lt;/td&gt;&lt;td&gt;Nginx on Proxmox host&lt;/td&gt;&lt;td&gt;Caddy (simpler configuration), Traefik (more dynamic)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Public Access&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Provides secure external connectivity&lt;/td&gt;&lt;td&gt;Tailscale Funnel&lt;/td&gt;&lt;td&gt;Cloudflare Tunnel (requires domain), SSH tunneling&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Security Model&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Controls who can access what&lt;/td&gt;&lt;td&gt;Tailscale ACLs with tags&lt;/td&gt;&lt;td&gt;Basic authentication, IP whitelisting&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;OS for Container&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Base operating system for the container&lt;/td&gt;&lt;td&gt;Debian 12&lt;/td&gt;&lt;td&gt;Ubuntu (more familiar), Alpine Linux (smaller footprint)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Home Use Notes:&lt;/strong&gt;&lt;br&gt;For personal deployments, avoid over-engineering. Kubernetes is excessive for a single OpenWebUI instance. The standard implementation provides the right balance of security and simplicity for home use. While OpenWebUI does have a Python version, the Docker implementation is more reliable for persistent deployment.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;3-setting-up-the-lxc-container-on-proxmox&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#3-setting-up-the-lxc-container-on-proxmox&quot;&gt;3. Setting Up the LXC Container on Proxmox&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Create a new LXC container with the following specifications (when not hosting a model locally this is fine):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Operating System:&lt;/strong&gt; Debian 12&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resources:&lt;/strong&gt; 2GB RAM, 2 CPU cores, 20GB disk&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Container ID:&lt;/strong&gt; 101&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hostname:&lt;/strong&gt; &lt;code&gt;opwebui-lxc&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;After creation, enable nesting by adding the following lines to the container’s configuration file at &lt;code&gt;/etc/pve/lxc/101.conf&lt;/code&gt; on the Proxmox host:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;lxc.apparmor.profile: unconfined
lxc.cap.drop: 
lxc.cgroup2.devices.allow: a
lxc.mount.auto: cgroup:rw&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For production use, consider setting a static IP for the LXC container in the Proxmox web interface to avoid IP changes that could disrupt the Nginx configuration. The command &lt;code&gt;pct list&lt;/code&gt; in the Proxmox host terminal can also be used to verify the container’s current IP address.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;4-configuring-the-lxc-container-for-openwebui&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#4-configuring-the-lxc-container-for-openwebui&quot;&gt;4. Configuring the LXC Container for OpenWebUI&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;41-install-docker&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#41-install-docker&quot;&gt;4.1 Install Docker&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Docker is required to run OpenWebUI. Follow the official installation guide for Debian: &lt;a href=&quot;https://docs.docker.com/desktop/setup/install/linux/debian/&quot; rel=&quot;noopener&quot;&gt;Docker Installation for Debian&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;42-create-openwebui-directory-structure&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#42-create-openwebui-directory-structure&quot;&gt;4.2 Create OpenWebUI Directory Structure&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; /root/openwebui
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /root/openwebui&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;43-create-the-env-file&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#43-create-the-env-file&quot;&gt;4.3 Create the &lt;code&gt;.env&lt;/code&gt; File&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This file stores environment variables for the OpenWebUI Docker container. Replace &lt;code&gt;Europe/Amsterdam&lt;/code&gt; with your local timezone.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; .env &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOF
WEBUI_SECRET_KEY=&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;openssl rand &lt;span class=&quot;token parameter variable&quot;&gt;-hex&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
TZ=Europe/Amsterdam
EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Alternatively, you could use &lt;code&gt;nano .env&lt;/code&gt; to create and edit the file.&lt;/p&gt;&lt;h3 id=&quot;44-create-the-docker-composeyml&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#44-create-the-docker-composeyml&quot;&gt;4.4 Create the &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This file defines the OpenWebUI service and a Watchtower service for automatic updates. Note the &lt;code&gt;WEBUI_URL&lt;/code&gt; placeholder; this will be the public URL for your OpenWebUI instance.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; docker-compose.yml &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;EOF&#39;
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main-slim
    container_name: open-webui
    ports:
      - &quot;8080:8080&quot;
    environment:
      - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
      - WEBUI_URL=https://opwebui.yourdomain.ts.net # Replace with your Tailscale Funnel URL
      - ENABLE_SIGNUP=false
      - DEFAULT_USER_ROLE=pending
    volumes:
      - open-webui:/app/backend/data
    restart: unless-stopped
    labels:
      - &quot;com.centurylinklabs.watchtower.enable=true&quot;
    
  watchtower:
    image: containrrr/watchtower:latest
    container_name: openwebui-watchtower
    environment:
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_LABEL_ENABLE=true
      - WATCHTOWER_INCLUDE_RESTARTING=true
      - WATCHTOWER_SCHEDULE=0 0 7 * * *
      - TZ=${TZ:-Europe/Amsterdam}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: unless-stopped
    
volumes:
  open-webui:
EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;45-start-the-containers&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#45-start-the-containers&quot;&gt;4.5 Start the Containers&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; compose up &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;5-configuring-the-proxmox-host&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#5-configuring-the-proxmox-host&quot;&gt;5. Configuring the Proxmox Host&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;51-install-required-packages&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#51-install-required-packages&quot;&gt;5.1 Install Required Packages&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;&amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; upgrade &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt; nginx net-tools&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;52-create-nginx-configuration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#52-create-nginx-configuration&quot;&gt;5.2 Create Nginx Configuration&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This Nginx configuration listens on &lt;code&gt;127.0.0.1:8090&lt;/code&gt; (localhost only) and proxies requests to the OpenWebUI container. This ensures Nginx is not directly exposed to the network.&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /etc/nginx/sites-available/openwebui.conf &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;EOF
server {
    listen 127.0.0.1:8090;
    server_name opwebui.yourdomain.ts.net; # Replace with your Tailscale Funnel URL
    
    client_max_body_size 100M;
    
    location / {
        proxy_pass http://192.168.1.100:8080; # Replace with your LXC&#39;s static IP
        
        proxy_set_header Host &#92;&lt;span class=&quot;token variable&quot;&gt;$host&lt;/span&gt;;
        proxy_set_header X-Real-IP &#92;&lt;span class=&quot;token variable&quot;&gt;$remote_addr&lt;/span&gt;;
        proxy_set_header X-Forwarded-For &#92;&lt;span class=&quot;token variable&quot;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;;
        proxy_set_header X-Forwarded-Proto &#92;&lt;span class=&quot;token variable&quot;&gt;$scheme&lt;/span&gt;;
            
        proxy_http_version 1.1;
        proxy_set_header Upgrade &#92;&lt;span class=&quot;token variable&quot;&gt;$http_upgrade&lt;/span&gt;;
        proxy_set_header Connection &quot;upgrade&quot;;
            
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
        proxy_buffering off;
        proxy_request_buffering off;
    }
    
    location = /health {
        return 200 &quot;OK&lt;span class=&quot;token entity&quot; title=&quot;&#92;n&quot;&gt;&#92;n&lt;/span&gt;&quot;;
        access_log off;
        add_header Content-Type text/plain;
    }
}
EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;53-enable-the-nginx-configuration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#53-enable-the-nginx-configuration&quot;&gt;5.3 Enable the Nginx Configuration&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sf&lt;/span&gt; /etc/nginx/sites-available/openwebui.conf /etc/nginx/sites-enabled/
&lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; /etc/nginx/sites-enabled/default
nginx &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;&amp;&lt;/span&gt; systemctl restart nginx&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;6-configuring-tailscale-security&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#6-configuring-tailscale-security&quot;&gt;6. Configuring Tailscale Security&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;61-install-tailscale&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#61-install-tailscale&quot;&gt;6.1 Install Tailscale&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;On the Proxmox host:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://tailscale.com/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;62-authenticate-tailscale&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#62-authenticate-tailscale&quot;&gt;6.2 Authenticate Tailscale&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tailscale up&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Follow the URL provided in the output to authenticate your Proxmox host with your Tailscale account.&lt;/p&gt;&lt;h3 id=&quot;63-apply-security-tags&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#63-apply-security-tags&quot;&gt;6.3 Apply Security Tags&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tailscale up --advertise-tags&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;tag:openwebui,tag:proxmox&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;64-configure-acls-in-tailscale-dashboard&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#64-configure-acls-in-tailscale-dashboard&quot;&gt;6.4 Configure ACLs in Tailscale Dashboard&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Go to the &lt;a href=&quot;https://login.tailscale.com/admin/acls&quot; rel=&quot;noopener&quot;&gt;Tailscale admin console&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Replace the existing ACL configuration with the following:&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;acls&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;accept&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:members&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;dst&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:self:*&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;accept&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:members&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;dst&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tag:openwebui:443&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;accept&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;dst&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tag:proxmox:22&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tag:proxmox:8006&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      
  &lt;span class=&quot;token property&quot;&gt;&quot;tagOwners&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tag:openwebui&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:members&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;tag:proxmox&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      
  &lt;span class=&quot;token property&quot;&gt;&quot;nodeAttrs&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tag:openwebui&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;attr&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;funnel&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      
  &lt;span class=&quot;token property&quot;&gt;&quot;ssh&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;action&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;check&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;autogroup:admin&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;dst&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;tag:proxmox&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;users&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;root&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Save the configuration&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;65-enable-funnel-for-public-access&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#65-enable-funnel-for-public-access&quot;&gt;6.5 Enable Funnel for Public Access&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;tailscale funnel &lt;span class=&quot;token parameter variable&quot;&gt;--bg&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--https&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8090&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;7-verification-and-testing&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#7-verification-and-testing&quot;&gt;7. Verification and Testing&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;71-verify-openwebui-is-running&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#71-verify-openwebui-is-running&quot;&gt;7.1 Verify OpenWebUI is Running&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In the LXC container:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Should show open-webui and openwebui-watchtower&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;72-verify-nginx-is-listening&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#72-verify-nginx-is-listening&quot;&gt;7.2 Verify Nginx is Listening&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;On the Proxmox host:&lt;/p&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;ss &lt;span class=&quot;token parameter variable&quot;&gt;-tlnp&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; :8090
&lt;span class=&quot;token comment&quot;&gt;# Should show nginx listening on 127.0.0.1:8090&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;73-test-public-access&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#73-test-public-access&quot;&gt;7.3 Test Public Access&lt;/a&gt;&lt;/h3&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-I&lt;/span&gt; https://opwebui.yourdomain.ts.net
&lt;span class=&quot;token comment&quot;&gt;# Should return HTTP 200 OK&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;8-troubleshooting-common-issues&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#8-troubleshooting-common-issues&quot;&gt;8. Troubleshooting Common Issues&lt;/a&gt;&lt;/h2&gt;&lt;h3 id=&quot;if-you-get-connection-refused-errors&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#if-you-get-connection-refused-errors&quot;&gt;If you get “connection refused” errors:&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Check Nginx is running: &lt;code&gt;systemctl status nginx&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Verify Nginx is listening: &lt;code&gt;ss -tlnp | grep :8090&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Check OpenWebUI is running: &lt;code&gt;docker ps&lt;/code&gt; (in LXC container)&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;if-tailscale-funnel-is-not-working&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#if-tailscale-funnel-is-not-working&quot;&gt;If Tailscale Funnel is not working:&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Check Funnel status: &lt;code&gt;tailscale funnel status&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Verify tags are applied: &lt;code&gt;tailscale status | grep Tags&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Check ACL is active in the Tailscale admin console&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;if-websocket-streaming-fails&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#if-websocket-streaming-fails&quot;&gt;If WebSocket streaming fails:&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Verify Nginx has WebSocket headers:&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-A10&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;location /&quot;&lt;/span&gt; /etc/nginx/sites-available/openwebui.conf&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Ensure you are using HTTPS (not HTTP) for public access&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;final-notes&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/securely-accessing-openwebui-with-tailscale-funnel-on-proxmox/#final-notes&quot;&gt;Final Notes&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This configuration:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Secures your Proxmox host while allowing public access to OpenWebUI.&lt;/li&gt;&lt;li&gt;Respects Tailscale’s architecture without workarounds.&lt;/li&gt;&lt;li&gt;Maintains all requirements for persistence, auto-updates, and corporate proxy compatibility.&lt;/li&gt;&lt;li&gt;Follows security best practices with the principle of least privilege.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The solution is intentionally minimal; only the necessary components are used, each with a clear purpose. This reduces complexity and attack surface while ensuring reliable operation. Your OpenWebUI instance is now securely accessible from anywhere, keeping your critical Proxmox management interfaces protected from unauthorised access.&lt;/p&gt;&lt;p&gt;A note on corporate proxies: While this setup is designed to be robust, some corporate proxies can interfere with WebSocket connections, leading to errors such as &lt;code&gt;websocket connection failed to wss://...&lt;/code&gt;. If you encounter this, it may be due to the proxy’s strict filtering or inspection of WebSocket traffic. Unfortunately, direct workarounds for client-side corporate proxies are often limited without administrative access to the proxy itself. If you have found a solution for this specific issue, please share it.&lt;/p&gt;&lt;p&gt;For accessing environments via SSH, particularly on Windows, tools like MobaXterm can offer a more reliable experience compared to web interfaces, especially when dealing with network complexities.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Claude Skills: A Simpler Approach to Specialised AI Tasks</title>
      <link href="https://allarddewinter.net/blog/claude-skills-a-simpler-approach-to-specialised-ai-tasks/" />
      <updated>2025-10-20T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/claude-skills-a-simpler-approach-to-specialised-ai-tasks/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://simonwillison.net/2025/Oct/16/claude-skills/&quot; rel=&quot;noopener&quot;&gt;https://simonwillison.net/2025/Oct/16/claude-skills/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Claude Skills represent a refreshingly simple approach to extending AI capabilities—functioning like a library where the model acts as a librarian, accessing only relevant resources when needed. This contrasts with more complex protocols like MCP, offering a natural extension to how language models handle specialised tasks.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Skills are conceptually extremely simple: a skill is a Markdown file telling the model how to do something, optionally accompanied by extra documents and scripts that the model can run to help it accomplish the tasks described by the skill.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The core innovation lies in its minimalism:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Context-aware loading&lt;/strong&gt;: Skills only consume tokens when relevant to the current task&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Library-like organisation&lt;/strong&gt;: Each skill is a self-contained folder of instructions and resources&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Natural integration&lt;/strong&gt;: The model accesses skills as needed, like a librarian retrieving specific materials&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This approach addresses key limitations of previous systems:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Skills&lt;/th&gt;&lt;th&gt;MCP&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Complexity&lt;/td&gt;&lt;td&gt;Simple Markdown files&lt;/td&gt;&lt;td&gt;Full protocol specification&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Token efficiency&lt;/td&gt;&lt;td&gt;Only loads metadata initially&lt;/td&gt;&lt;td&gt;Consumes thousands of tokens upfront&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Implementation&lt;/td&gt;&lt;td&gt;Single files or small folders&lt;/td&gt;&lt;td&gt;Requires dedicated infrastructure&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adaptability&lt;/td&gt;&lt;td&gt;Easy to iterate and share&lt;/td&gt;&lt;td&gt;More rigid implementation&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The library analogy proves particularly apt—rather than forcing the model to carry all knowledge at once, Skills allow it to reference external resources only when necessary. This creates a more sustainable pattern for extending AI capabilities without overwhelming the model’s context window.&lt;/p&gt;&lt;p&gt;What makes Skills compelling is their accessibility. Unlike MCP’s comprehensive protocol, Skills require minimal setup:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A skill is essentially a well-structured Markdown file&lt;/li&gt;&lt;li&gt;Optional supporting scripts can be added as needed&lt;/li&gt;&lt;li&gt;The system only loads relevant skills during a session&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This simplicity enables rapid iteration and sharing. As Willison notes, “The core simplicity of the skills design is why I’m so excited about it.” The approach leverages what LLMs do best—interpreting text instructions—while outsourcing complex coordination to the underlying system.&lt;/p&gt;&lt;p&gt;The contrast with MCP is instructive. Where MCP required significant infrastructure investment, Skills work with existing coding environments, making them more practical for immediate implementation. This shift from protocol to pattern represents a maturation in how we extend AI capabilities.&lt;/p&gt;&lt;p&gt;From: &lt;a href=&quot;https://github.com/anthropics/skills&quot; rel=&quot;noopener&quot;&gt;https://github.com/anthropics/skills&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The official skills repository demonstrates this simplicity in practice. Each skill is self-contained in its own directory with a &lt;code&gt;SKILL.md&lt;/code&gt; file containing instructions and metadata. The repository includes both open-source examples and the proprietary document creation skills that power Claude’s native document capabilities. The basic structure requires only two fields in the YAML frontmatter: a unique name and a description of when to use the skill.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Agentic Engineering: Just Talk To It</title>
      <link href="https://allarddewinter.net/blog/agentic-engineering-just-talk-to-it/" />
      <updated>2025-10-16T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/agentic-engineering-just-talk-to-it/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://steipete.me/posts/just-talk-to-it#do-you-do-spec-driven-development&quot; rel=&quot;noopener&quot;&gt;https://steipete.me/posts/just-talk-to-it#do-you-do-spec-driven-development&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Peter Steinberger presents a streamlined approach to agentic engineering, advocating for direct, conversational interaction with AI models rather than relying on elaborate frameworks or subagents. His workflow, heavily centred on GPT-5-Codex, emphasises simplicity, rapid iteration, and developing an intuitive understanding of the model’s capabilities.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Don’t waste your time on stuff like RAG, subagents, Agents 2.0 or other things that are mostly just charade. Just talk to it. Play with it. Develop intuition.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;key-tenets-of-steinbergers-agentic-workflow&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/agentic-engineering-just-talk-to-it/#key-tenets-of-steinbergers-agentic-workflow&quot;&gt;Key Tenets of Steinberger’s Agentic Workflow&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Model of Choice:&lt;/strong&gt; GPT-5-Codex is preferred over Claude Code due to its superior context management, efficiency, speed, and less “silly” conversational style.&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Context &amp; Efficiency:&lt;/strong&gt; Codex offers ~230k usable context, which fills slower than Claude Code’s 156k.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Speed:&lt;/strong&gt; Rewritten in Rust, Codex is “incredibly fast” and lightweight, avoiding the freezes and memory issues observed with Claude Code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Language &amp; Interaction:&lt;/strong&gt; Codex is described as an “introverted engineer that chugs along and just gets stuff done,” requiring shorter prompts and being less prone to “silly” responses.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Harness &amp; Parallelisation:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;codex cli&lt;/code&gt;:&lt;/strong&gt; The primary daily driver, often run in 3-8 parallel instances within a terminal grid for concurrent tasks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Atomic Commits:&lt;/strong&gt; Agents are configured to perform atomic Git commits, ensuring a clean history.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;No Worktrees:&lt;/strong&gt; A single development server is used to facilitate testing multiple changes simultaneously, avoiding the overhead of multiple branches or servers.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;“Blast Radius” Thinking:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Before making changes, consider the potential impact (time and files touched).&lt;/li&gt;&lt;li&gt;Prefer “many small bombs” (small, isolated changes) over “Fat Man” (large, sweeping changes) to maintain control and ease of rollback.&lt;/li&gt;&lt;li&gt;Don’t hesitate to stop models mid-way to check status or redirect, as file changes are atomic.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Prompting Strategy:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Concise Prompts:&lt;/strong&gt; Codex requires significantly shorter prompts (often 1-2 sentences) due to its ability to read the codebase effectively.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Visual Context:&lt;/strong&gt; Screenshots are frequently used (up to 50% of prompts) to provide visual context, with the model adept at identifying relevant strings and locations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Conversational Approach:&lt;/strong&gt; Instead of rigid “plan mode” or structured documents, Steinberger “talks” to Codex, asking it to “discuss” or “give me options” and waiting for approval.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Refactoring &amp; Maintenance:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Approximately 20% of time is dedicated to refactoring, entirely performed by agents.&lt;/li&gt;&lt;li&gt;Refactoring tasks include code duplication checks (jscpd), dead code removal (knip), ESLint checks, API consolidation, documentation, dependency updates, and test writing.&lt;/li&gt;&lt;li&gt;This cyclical approach of rapid iteration followed by dedicated refactoring phases is considered more productive and enjoyable.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Spec-Driven Development (Evolved):&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;The “old way” of writing a large spec and letting the model build for hours is eschewed.&lt;/li&gt;&lt;li&gt;Current approach involves a collaborative discussion with Codex, feeding it websites and ideas, and fleshing out features together.&lt;/li&gt;&lt;li&gt;For tricky features, a spec might be drafted and reviewed by GPT-5-Pro (via &lt;a href=&quot;http://ChatGPT.com&quot; rel=&quot;noopener&quot;&gt;ChatGPT.com&lt;/a&gt;) for alternative ideas, then integrated back.&lt;/li&gt;&lt;li&gt;UI-based work often starts with under-specified requests, allowing the model to build and iterate in real-time, morphing the “chaos into the shape that feels right.”&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tooling &amp; “Charade”:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Avoids Over-Engineering:&lt;/strong&gt; Dismisses many agentic tools (e.g., Conductor, Terragon, Sculptor) as “thin wrappers” that work around inefficiencies and promote suboptimal workflows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CLI over MCPs:&lt;/strong&gt; Advocates for using command-line interface (CLI) tools over “Multi-Command Prompts” (MCPs) due to their zero context cost and existing model knowledge.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;code&gt;tmux&lt;/code&gt; for Background Tasks:&lt;/strong&gt; Instead of relying on model-specific background task features, &lt;code&gt;tmux&lt;/code&gt; is used for persistent CLI sessions.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Addressing Model Imperfections:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Acknowledges that Codex is not perfect (e.g., occasional reverts, forgetting bash commands, “losing” lines in the terminal).&lt;/li&gt;&lt;li&gt;These flaws are considered minor compared to its overall effectiveness, and human-like patience is sometimes required (“soothen it like a child”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lazy Workarounds:&lt;/strong&gt; For long-running tasks, queuing “continue” messages can keep the model engaged.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Test Generation:&lt;/strong&gt; Asking the model to write tests after each feature/fix improves test quality and uncovers bugs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Intent Preservation:&lt;/strong&gt; Prompting to “add code comments on tricky parts” helps both human and future model understanding.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Steinberger’s “Just Talk To It” philosophy underscores the importance of developing intuition and direct communication with AI agents, treating them as collaborative partners rather than complex systems requiring elaborate orchestration. The skills needed to manage agents, he notes, mirror those of senior software engineers.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Digital Twins: From Industry to Ecology</title>
      <link href="https://allarddewinter.net/blog/digital-twins-from-industry-to-ecology/" />
      <updated>2025-10-15T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/digital-twins-from-industry-to-ecology/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://www.nature.com/articles/d41586-025-03314-y&quot; rel=&quot;noopener&quot;&gt;https://www.nature.com/articles/d41586-025-03314-y&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Digital twin technology, traditionally an industrial tool, is now proving valuable in ecological research and wildlife management. This marks a positive shift for a technology that has previously faced scepticism regarding its practical delivery.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Digital twins can be particularly useful for studying systems that are changing outside historical norms… That includes how ecosystems react to anthropogenic climate change.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The &lt;em&gt;Nature&lt;/em&gt; article details how virtual representations are simulating animal behaviour, predicting environmental changes, and informing conservation efforts.&lt;/p&gt;&lt;h3 id=&quot;the-rise-of-digital-twins&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/digital-twins-from-industry-to-ecology/#the-rise-of-digital-twins&quot;&gt;The Rise of Digital Twins&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A digital twin is a virtual model that accurately reflects a physical entity, continuously updated with real-time data. This allows for simulations, monitoring, and analysis. Its accelerated adoption stems from:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Increased data availability.&lt;/li&gt;&lt;li&gt;Prevalence of Internet of Things (IoT) devices.&lt;/li&gt;&lt;li&gt;Advancements in artificial intelligence (AI) and cloud computing.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;ecological-applications&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/digital-twins-from-industry-to-ecology/#ecological-applications&quot;&gt;Ecological Applications&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ecologists are using digital twins to address complexities and data gaps in biodiversity research:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Crane Radar:&lt;/strong&gt; Developed by Wageningen University &amp; Research, this twin forecasts common crane migration across Western Europe. It integrates migration data, birdwatcher sightings, and environmental factors. Ecologist Koen de Koning noted its personal benefit: “This model really helped me, personally, to see them more often.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Doñana National Park:&lt;/strong&gt; A complex model is being built to simulate interactions between vegetation, rabbits, and the Iberian lynx, understanding how various factors affect the ecosystem.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;River Management:&lt;/strong&gt; Digital twins for rivers like the Stiffkey (England) and Mara (Kenya) aid in habitat improvement, flood prevention, and community alerts.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;challenges&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/digital-twins-from-industry-to-ecology/#challenges&quot;&gt;Challenges&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Despite their potential, ecological digital twins face hurdles:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Data Reliability:&lt;/strong&gt; High-quality, real-time data is crucial; inaccurate citizen observations can affect model accuracy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data Storage Costs:&lt;/strong&gt; The large data volumes required can lead to significant cloud storage expenses.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Funding &amp; Awareness:&lt;/strong&gt; As a new application in ecology, educating potential users and securing sustainable funding for long-term maintenance are essential.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;My experience with digital twins has primarily been in industrial contexts, where they often faced scepticism due to initial over-promising. It is encouraging to see this technology find positive and impactful application in ecology, moving beyond its previous reputation to deliver tangible benefits in wildlife management and environmental conservation. This shift demonstrates a maturing of the technology, where practical applications are now outweighing earlier hype. The Crane Radar, engaging the public as data providers, illustrates the potential for digital twins to foster a more connected approach to environmental stewardship.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Avoiding Negativity Echo Chambers in Your Career</title>
      <link href="https://allarddewinter.net/blog/avoiding-negativity-echo-chambers-in-your-career/" />
      <updated>2025-10-13T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/avoiding-negativity-echo-chambers-in-your-career/</id>
      <content type="html">
				&lt;p&gt;From: &lt;a href=&quot;https://brooker.co.za/blog/2025/06/20/career.html&quot; rel=&quot;noopener&quot;&gt;https://brooker.co.za/blog/2025/06/20/career.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Marc Brooker, an engineer at Amazon Web Services (AWS), shares a piece of career advice: actively avoid negativity echo chambers. He argues that while complaining can be an inviting and inclusive activity, such environments ultimately hinder career progression and negatively impact personal well-being.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“If I could offer you a single piece of career advice, it’s this: avoid negativity echo chambers.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Brooker highlights the pervasive nature of these “watering holes where the whiners hang out” within organisations and industries. He observes that these communities often make complaining their core identity, pushing out those who are positive, optimistic, or ambitious.&lt;/p&gt;&lt;p&gt;Key takeaways from Marc’s perspective include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The Detrimental Nature of Cynicism:&lt;/strong&gt; While occasional complaints are normal, consistently engaging with communities centred on negativity is harmful. Brooker suggests a personal limit, disengaging when approximately 20% of the content becomes negative.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Two Paths for Career Engagement:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Advance and Improve:&lt;/strong&gt; Focus on the positive aspects of your role and invest energy in making things better.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Maintain and Disengage:&lt;/strong&gt; If career advancement is not the goal, dedicate just enough energy to maintain your position, then redirect your focus to personal life and hobbies, rather than joining cynical groups.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Impact on Well-being:&lt;/strong&gt; Negativity echo chambers are not only detrimental to career prospects but also to mental and physical health. Brooker advises avoiding them, especially if their content “resonates” with existing frustrations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The “Yes, And” Approach:&lt;/strong&gt; Seek out communities that foster growth and collaboration. Spend time with individuals who are doing admirable work, living the life you aspire to, and from whom you can learn. These are not found in spaces focused on past grievances.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Driving Real Change:&lt;/strong&gt; True change is seldom driven by sadness and anger. While working with others to push for change is valuable, passive complaining does not achieve this.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Protecting Communities:&lt;/strong&gt; Negativity can erode the quality of a community. When cynicism becomes dominant, valuable members disengage, leading to a decline in the community’s overall health and vibrancy.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This perspective resonates with my own experiences. Being surrounded by negativity can indeed hinder progress and keep one stuck in undesirable situations. I find that actively choosing to “lean in” and focus on making the best of circumstances, rather than dwelling on complaints, is a far more constructive approach. It is about identifying what can be improved and contributing to that improvement, or, if that is not feasible, consciously disengaging to protect one’s own energy and focus on other fulfilling aspects of life.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The Critical Scrutiny of TOGAF: A Pragmatic Reflection</title>
      <link href="https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/" />
      <updated>2025-10-10T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/</id>
      <content type="html">
				&lt;p&gt;Following my recent post, “&lt;a href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/&quot; rel=&quot;noopener&quot;&gt;TOGAF: A Pragmatic Starter Kit for Engineers&lt;/a&gt;,” which explored a lean, iterative approach to leveraging TOGAF’s principles, it is equally important to critically examine the framework itself. This post aims to provide a balanced perspective on TOGAF’s utility and limitations, acknowledging its enduring presence while reflecting on its practical application.&lt;/p&gt;&lt;p&gt;Svyatoslav Kotusev, a dedicated researcher in the field of Enterprise Architecture, offers a comprehensive and critical analysis in his article, “&lt;a href=&quot;https://medium.com/@kotusev/the-critical-scrutiny-of-togaf-577acee2f4e8&quot; rel=&quot;noopener&quot;&gt;The Critical Scrutiny of TOGAF&lt;/a&gt;.” His work challenges the common perception of TOGAF as a definitive guide for EA practitioners, prompting a deeper reflection on its role.&lt;/p&gt;&lt;h2 id=&quot;togaf-methodology-or-toolkit&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/#togaf-methodology-or-toolkit&quot;&gt;TOGAF: Methodology or Toolkit?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A central point of discussion revolves around TOGAF’s identity: is it a consistent methodology or merely a toolkit?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Original Intent as Methodology:&lt;/strong&gt; Kotusev highlights that TOGAF’s original documentation explicitly positioned it as “a detailed method and a set of supporting tools.” The Architecture Development Method (ADM) was described as a “step-by-step approach,” and the Architecture Content Framework (ACF) as a “detailed model of the outputs to be created by the ADM.” This indicates an initial design as a comprehensive, consistent methodology.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Repositioning as Toolkit:&lt;/strong&gt; In practice, many architects find it challenging to follow the ADM’s prescribed steps or produce the extensive documentation recommended by the ACF. This practical disconnect has led to TOGAF being increasingly positioned by its community as a “useful toolkit” rather than a rigid methodology. Kotusev suggests this repositioning occurred because the “detailed method” proved impractical in real-world scenarios.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Evolution of “Framework”:&lt;/strong&gt; Even the term “Framework” in TOGAF’s title has seen a reinterpretation. Initially, an EA framework was defined as a “logical structure for classifying and organizing the descriptive representations of an Enterprise.” However, contemporary interpretations by TOGAF trainers often equate “Framework” with “a set of reusable components,” akin to software frameworks, a meaning that diverges from its original definition.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This shift from a prescriptive methodology to a more flexible toolkit, alongside the redefinition of core terminology, suggests an adaptation to practical realities where a rigid, original approach might have been unworkable.&lt;/p&gt;&lt;h2 id=&quot;best-practice-claim-versus-reality&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/#best-practice-claim-versus-reality&quot;&gt;Best Practice: Claim Versus Reality&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The Open Group asserts that TOGAF is based on “best practice” developed through the collaborative efforts of numerous leading companies. However, Kotusev’s research prompts us to question this claim:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lack of Real-World Adherence:&lt;/strong&gt; If practitioners do not consistently follow the ADM or create the recommended documents, whose “best practice” does TOGAF truly represent? Kotusev notes that he has “never seen any architects or organizations who might have said that the ADM, ACF or Enterprise Continuum represent their actual best practice.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Origins in TAFIM:&lt;/strong&gt; TOGAF’s foundation in the Technical Architecture Framework for Information Management (TAFIM) is also scrutinised. TAFIM was reportedly retired due to its impracticality and high costs, which raises valid questions about how a framework based on an unsuccessful predecessor can claim to embody best practice.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Marketing Motivation:&lt;/strong&gt; Kotusev suggests that the “best practice” claims are primarily marketing statements, driven by the significant revenue generated from TOGAF certifications, training, and related services.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Furthermore, Kotusev argues that actual best practices in EA are often &lt;em&gt;not&lt;/em&gt; fully captured within TOGAF. A prime example is the Business Capability Map (BCM), widely used in many organisations for strategic alignment and IT investment, yet “not even mentioned in TOGAF at all.” This highlights a potential gap between TOGAF’s content and the practical tools employed by successful EA practices.&lt;/p&gt;&lt;h2 id=&quot;the-illusion-of-flexibility&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/#the-illusion-of-flexibility&quot;&gt;The Illusion of Flexibility&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;TOGAF’s proponents often praise its flexibility, arguing it can be tailored to various organisational contexts. Kotusev, however, views this flexibility as a “logical trick” or “catch-22.”&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Removed Categorisation Model:&lt;/strong&gt; Earlier versions of TOGAF (e.g., Version 9) categorised its content into “core,” “mandated,” “recommended,” and “supporting” sections, implying that certain elements were essential for it to be “recognizably TOGAF.” The removal of this categorisation model in TOGAF Version 9.1 effectively allows any EA-related activity to be interpreted as “using adapted TOGAF,” regardless of its actual adherence to the framework’s recommendations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Unspecified Adaptation:&lt;/strong&gt; While TOGAF’s documentation mentions the need for adaptation, it provides little guidance on &lt;em&gt;how&lt;/em&gt; to adapt it effectively. This can leave practitioners to “adapt” TOGAF by essentially setting aside its impractical recommendations and devising their own solutions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;“Lossless Lottery” for The Open Group:&lt;/strong&gt; This “flexibility trick” places The Open Group in a beneficial position: failures can be attributed to improper adaptation by unqualified architects, while successes can be “appropriated” as TOGAF-based due to its broad adaptability.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In essence, Kotusev concludes that TOGAF’s admired flexibility “is nothing more than a simple trick helping (1) conceal impracticality of the actual TOGAF’s recommendations, (2) put the burden of responsibility for improper adaptation on EA practitioners, (3) avoid any potential criticism and (4) interpret successes and failures ‘properly’.”&lt;/p&gt;&lt;h2 id=&quot;togaf-10-addressing-criticisms-or-more-symbolic-than-ever&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/#togaf-10-addressing-criticisms-or-more-symbolic-than-ever&quot;&gt;TOGAF 10: Addressing Criticisms, or More Symbolic Than Ever?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kotusev’s analysis of the TOGAF Standard, 10th Edition, prompts us to consider whether the latest version genuinely addresses long-standing criticisms or merely reinforces its symbolic status.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Attempting to Address Criticisms:&lt;/strong&gt; The 10th edition attempts to address some long-standing criticisms, such as the perception of the ADM as a rigid waterfall model. The removal of arrowheads from the ADM aims to convey a more iterative and agile approach. However, Kotusev argues this is a “patently perfunctory, ‘quick and dirty’ fix” [Kotusev, “The TOGAF Standard, 10th Edition: What’s New?”].&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Restructuring, Not Substantive Change:&lt;/strong&gt; The 10th edition primarily involves restructuring and extending content, splitting the previous monolithic manual into “TOGAF Fundamental Content” and “TOGAF Series Guides.” While presented as an improvement for usability, Kotusev argues that “no substantial changes have actually been introduced to the framework.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Rhetorical Novelties:&lt;/strong&gt; New guides often address trendy topics like “digital” and “agile,” but offer little concrete advice beyond asserting TOGAF’s compatibility. The introduction of terms like “minimum viable architecture (MVA)” is seen as applying agile terminology to EA without substantive methodological changes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Contradictory Statements:&lt;/strong&gt; The removal of arrowheads from the ADM in the 10th edition, intended to counter the perception of a waterfall model, has led to contradictions within the text. While some sections still describe the ADM as a “tested and repeatable process” with a “recommended sequence,” others explicitly state that “The TOGAF ADM should not be understood as a processes model.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Increased Volume, Decreased Clarity:&lt;/strong&gt; Despite the modularisation, the total volume of TOGAF documentation has increased significantly, making it even more challenging to comprehend. Kotusev describes the text as “very poorly written, incoherent and hard to follow,” with repetitions and unintelligible fragments.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This analysis suggests that while TOGAF 10 makes an effort to adapt rhetorically to current industry buzzwords, it may inadvertently further obscure its already vague ideas, potentially reinforcing its symbolic status rather than enhancing its practical clarity.&lt;/p&gt;&lt;h2 id=&quot;what-is-togaf-then&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/#what-is-togaf-then&quot;&gt;What is TOGAF, Then?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kotusev ultimately characterises TOGAF as “a toolkit of random EA-related recommendations” that struggles to clearly define what EA practice is. Its value, from this perspective, can be haphazard, realised only if some of its recommendations “accidentally turn out useful.”&lt;/p&gt;&lt;p&gt;He also describes TOGAF as a “distractor of attention,” potentially shifting discourse away from real EA-related questions towards artificial ones about TOGAF’s application or advantages. This can lead to a “doublethink” phenomenon, where TOGAF’s existence implies extensive knowledge of EA practice, yet its perceived impracticality means no one can specify how it should be used.&lt;/p&gt;&lt;p&gt;Kotusev provocatively likens TOGAF to a “religious text” due to its disputable origins, perceived mythical wisdom, need for interpretation by “enlightened gurus,” and its vague, unchanging core text with evolving interpretations. While a strong metaphor, it underscores the challenge of objectively assessing a framework that often evokes strong opinions.&lt;/p&gt;&lt;h2 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-critical-scrutiny-of-togaf-a-pragmatic-reflection/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Kotusev’s critical scrutiny provides a valuable counterpoint to the conventional view of TOGAF. While my previous post explored how engineers might pragmatically extract value from TOGAF’s concepts, Kotusev’s analysis suggests that such an approach often involves “studying TOGAF and then doing something else instead.”&lt;/p&gt;&lt;p&gt;The framework’s popularity, he argues, stems from aggressive promotion, a perceived lack of serious alternatives, and the “inertness” of the EA research community. For many, TOGAF certification offers symbolic benefits for career progression rather than necessarily fostering genuine architectural competence.&lt;/p&gt;&lt;p&gt;Ultimately, I view TOGAF as a collection of ideas that can still be useful, provided one approaches it with a critical and reflective mindset. It is not a perfect, ready-to-use methodology, and its evolution, particularly in the 10th edition, shows an attempt to respond to criticisms, even if those responses are sometimes perceived as superficial. The key lies in understanding &lt;em&gt;how&lt;/em&gt; and &lt;em&gt;what&lt;/em&gt; to use from it, rather than adhering to it blindly. For those seeking a deeper, practical understanding of EA, it is crucial to complement TOGAF with evidence-based sources and real-world experience.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>TOGAF: A Pragmatic Starter Kit for Engineers</title>
      <link href="https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/" />
      <updated>2025-10-09T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/</id>
      <content type="html">
				&lt;p&gt;The Open Group Architecture Framework (TOGAF) has long been a foundational standard for Enterprise Architecture. The framework continues to evolve, offering a structured yet adaptable approach to managing the complexity inherent in modern enterprise systems. This post aims to distil the essence of TOGAF, particularly for software engineers, focusing on its practical application, the establishment of an architecture capability, and the sustained maintenance of architectural integrity. It addresses the common challenges faced in integrating architectural principles into dynamic development environments, providing a pragmatic pathway to leverage TOGAF’s benefits without succumbing to bureaucratic overhead.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Architecture is a moving target; TOGAF simply gives you a rifle and a compass—not a cage.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;1-why-implement-togaf&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#1-why-implement-togaf&quot;&gt;1. Why Implement TOGAF?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The strategic implementation of TOGAF offers distinct advantages over ad-hoc architectural practices, particularly in mitigating common organizational inefficiencies and risks.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pain without TOGAF&lt;/th&gt;&lt;th&gt;Pain with ad-hoc TOGAF&lt;/th&gt;&lt;th&gt;Gain with disciplined TOGAF&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Ambiguity regarding data ownership and system responsibilities across development teams.&lt;/td&gt;&lt;td&gt;Extensive, often unread, architectural documentation lacking practical application.&lt;/td&gt;&lt;td&gt;Concise Architecture Vision documents complemented by living data catalogues.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Repetitive integration efforts for disparate systems following organizational expansion.&lt;/td&gt;&lt;td&gt;Protracted architectural definition phases, leading to delayed project initiation.&lt;/td&gt;&lt;td&gt;Streamlined Architecture Development Method (ADM) cycles, fostering the creation of reusable building blocks.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Recurring audit findings due to inconsistent architectural adherence.&lt;/td&gt;&lt;td&gt;Superficial governance processes that fail to enforce architectural standards effectively.&lt;/td&gt;&lt;td&gt;Robust governance mechanisms, including Architecture Board reviews linked to verifiable compliance checks.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The enduring relevance of TOGAF lies not in its rigidity, but in its capacity to provide a structured approach to architectural development and governance. The framework has refined this, emphasizing adaptability and integration with contemporary development methodologies such as Agile and DevOps. The core Architecture Development Method (ADM) remains a robust foundation for guiding architectural efforts, irrespective of prevailing technological trends. For a deeper understanding of its application in solution architecture, refer to Anatolii Gabuza’s article: &lt;a href=&quot;https://medium.com/better-programming/what-should-every-engineer-know-about-togaf-solution-architecture-866e21f77edb&quot; rel=&quot;noopener&quot;&gt;“What Software Engineers Should Know About “TOGAF” Solution Architecture?”&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&quot;2-the-architecture-development-method-adm-a-conceptual-overview&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#2-the-architecture-development-method-adm-a-conceptual-overview&quot;&gt;2. The Architecture Development Method (ADM): A Conceptual Overview&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The ADM, central to TOGAF, can be conceptualized as an iterative, risk-driven process akin to an OODA (Observe, Orient, Decide, Act) loop, guiding the evolution of enterprise architecture.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Observe&lt;/strong&gt; – Encompasses the Preliminary Phase and Architecture Vision, focusing on establishing the architecture capability and defining the scope and high-level vision.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Orient&lt;/strong&gt; – Involves the detailed definition of Business, Information Systems (Data and Application), and Technology Architectures.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Decide&lt;/strong&gt; – Addresses Opportunities &amp; Solutions and Migration Planning, translating architectural definitions into actionable implementation strategies.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Act&lt;/strong&gt; – Pertains to Implementation Governance and Architecture Change Management, ensuring adherence during implementation and managing subsequent architectural evolution.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This iterative nature underscores that the ADM is not a linear, waterfall model. It is expected that insights gained during the “Act” phase, particularly from actual implementation, may necessitate revisiting earlier “Orient” phases to refine architectural decisions.&lt;/p&gt;&lt;h2 id=&quot;3-initiating-the-first-iteration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#3-initiating-the-first-iteration&quot;&gt;3. Initiating the First Iteration&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A pragmatic approach to adopting TOGAF involves a focused, iterative launch, prioritizing tangible outcomes over comprehensive documentation.&lt;/p&gt;&lt;h3 id=&quot;step-0-defining-the-scope&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#step-0-defining-the-scope&quot;&gt;Step 0 – Defining the Scope&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Effective scoping is paramount for a successful initial iteration. This involves:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Breadth:&lt;/strong&gt; Concentrating on a single, manageable value stream (e.g., “customer onboarding”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Depth:&lt;/strong&gt; Limiting the architectural detail to a “container” level. The C4 model, while not explicitly mentioned or endorsed by TOGAF, provides a hierarchical approach to modelling technical architecture, allowing for different levels of detail to be presented to various audiences. This aligns with the TOGAF principle of views and viewpoints, ensuring stakeholders receive tailored perspectives.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Domains:&lt;/strong&gt; Potentially deferring a deep dive into Business Architecture if the “why” of the initiative is already clearly articulated by product management.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;step-1-preliminary-phase&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#step-1-preliminary-phase&quot;&gt;Step 1 – Preliminary Phase&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This phase establishes the foundational elements for architectural work.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Role Assignment:&lt;/strong&gt; Designate an &lt;strong&gt;Architecture Owner&lt;/strong&gt; (typically a lead engineer) and a &lt;strong&gt;Business Sponsor&lt;/strong&gt; (e.g., a product director).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Principle Definition:&lt;/strong&gt; Draft a concise set of &lt;strong&gt;five core Architecture Principles&lt;/strong&gt; to guide decision-making. An example could be: “Services are reusable across divisions unless a legal exemption is formally granted by the Architecture Board.” These principles, as defined in TOGAF, are enduring rules that guide decision-making and support governance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tooling Selection:&lt;/strong&gt; Establish a centralized, version-controlled repository for architectural artefacts, such as a Confluence space or a Git repository. This aligns with the concept of the Architecture Repository as a central vault for architectural outputs.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;step-2-architecture-definition-sprint-phases-a→d&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#step-2-architecture-definition-sprint-phases-a%E2%86%92d&quot;&gt;Step 2 – Architecture Definition Sprint (Phases A→D)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This period focuses on developing the initial architectural definitions.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Architecture Vision:&lt;/strong&gt; Conduct a collaborative workshop to produce a high-level &lt;strong&gt;Architecture Vision&lt;/strong&gt; document. While TOGAF defines the Architecture Vision as a key deliverable, it does not specify its format or length. A concise, one-page summary can be an effective way to gain stakeholder approval.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Parallel Track Development:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Data Architecture:&lt;/strong&gt; Identify canonical data entities, their respective owners, and critical quality dimensions. This corresponds to the Data Architecture aspect of Phase C.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Application Architecture:&lt;/strong&gt; Map existing application capabilities, categorizing them for retirement, retention, or new development. This corresponds to the Application Architecture aspect of Phase C.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Technology Architecture:&lt;/strong&gt; Define the target technology stack, security zones, and non-functional requirements. This is the focus of Phase D.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Gap Analysis and Risk Identification:&lt;/strong&gt; Consolidate findings into a gap matrix and a comprehensive risk register. Gap analysis is a key technique to identify differences between baseline and target architectures.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Architecture Board Review:&lt;/strong&gt; Conduct a concise review with the Architecture Board to capture key decisions. While TOGAF supports documenting decisions, it does not use the specific term “Architecture Decision Records (ADRs)” or prescribe this format. However, the practice of formally recording architectural decisions is consistent with TOGAF’s emphasis on governance and accountability.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;step-3-planning-for-implementation-phases-e→f&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#step-3-planning-for-implementation-phases-e%E2%86%92f&quot;&gt;Step 3 – Planning for Implementation (Phases E→F)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This phase translates architectural definitions into an actionable implementation plan.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Work Package Definition:&lt;/strong&gt; Decompose identified gaps into manageable &lt;strong&gt;work packages&lt;/strong&gt;, ideally requiring limited effort.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Prioritization and Resource Allocation:&lt;/strong&gt; Prioritize work packages using methodologies like MoSCoW, assigning estimated costs, risks, and business value.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Migration Plan:&lt;/strong&gt; Document the &lt;strong&gt;Migration Plan&lt;/strong&gt; as a dynamic artefact. While TOGAF defines the Architecture Roadmap and Migration Plan, it does not specify tooling. Using dynamic boards like DevOps can be a practical approach to manage and visualize the plan.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;step-4-continuous-governance-phases-g→h&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#step-4-continuous-governance-phases-g%E2%86%92h&quot;&gt;Step 4 – Continuous Governance (Phases G→H)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sustained architectural integrity requires continuous oversight and adaptation.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Compliance Checks:&lt;/strong&gt; Implement regular compliance checks to ensure development activities adhere to established architectural decisions. While TOGAF supports early compliance and governance, it does not explicitly mention code-level enforcement mechanisms like pull request checks. However, such mechanisms can be effective in ensuring implementation projects conform to the Target Architecture, which is a core objective of Phase G, Implementation Governance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Change Management:&lt;/strong&gt; Establish a “change window” to review new requirements and funnel them into the Requirements Management log. Triggering mini-ADM cycles based on change thresholds is not formally defined in TOGAF, though Phase H (Architecture Change Management) supports iterative updates and managing changes to the new architecture. This pragmatic approach helps maintain the architecture’s relevance.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;4-essential-architectural-artefacts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#4-essential-architectural-artefacts&quot;&gt;4. Essential Architectural Artefacts&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;To maintain agility and avoid documentation overload, focus on a minimal set of high-impact artefacts, ensuring they are version-controlled and easily accessible.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Artefact&lt;/th&gt;&lt;th&gt;Storage Location&lt;/th&gt;&lt;th&gt;Update Trigger&lt;/th&gt;&lt;th&gt;Primary Audience&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Architecture Vision (1 page)&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/vision.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Introduction of a new strategic objective.&lt;/td&gt;&lt;td&gt;Executive leadership, stakeholders.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Architectural Decision Log&lt;/td&gt;&lt;td&gt;&lt;code&gt;docs/adr/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Each significant architectural decision.&lt;/td&gt;&lt;td&gt;Development teams, architects.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Data Catalogue (auto-generated)&lt;/td&gt;&lt;td&gt;GitHub Pages&lt;/td&gt;&lt;td&gt;Schema changes or new data entity definitions.&lt;/td&gt;&lt;td&gt;Data engineers, business analysts.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;C4 Diagrams (Levels 1-3)&lt;/td&gt;&lt;td&gt;Mermaid in repository&lt;/td&gt;&lt;td&gt;Introduction of new containers or significant system changes.&lt;/td&gt;&lt;td&gt;Development teams, architects.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Roadmap Board&lt;/td&gt;&lt;td&gt;Devops/Miro/Trello or similar platform&lt;/td&gt;&lt;td&gt;Conclusion of each Program Increment (PI).&lt;/td&gt;&lt;td&gt;Project Management Office (PMO), stakeholders.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;&lt;p&gt;If an architectural artefact is not maintained within a version control system, its practical utility and reliability are diminished.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;5-sustaining-architectural-momentum&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#5-sustaining-architectural-momentum&quot;&gt;5. Sustaining Architectural Momentum&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Maintaining a living architecture requires embedding architectural practices into routine organizational processes.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Integration with Development Rituals:&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Sprint Planning:&lt;/strong&gt; Incorporate a review of the architectural decision log to identify architectural implications for upcoming user stories.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Demonstrations:&lt;/strong&gt; Present architecture compliance dashboards, providing visual feedback on adherence to architectural standards.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Performance Measurement:&lt;/strong&gt; While TOGAF discusses KPIs and maturity models, it does not define specific metrics such as re-use ratio, escape rate, or time-to-integrate. However, organizations can define their own relevant metrics to gauge the effectiveness of their architectural practice.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Annual Principle Review:&lt;/strong&gt; Periodically (e.g., annually) review and refresh architectural principles. Any principle that cannot be linked to a measurable outcome or address a recurring issue should be re-evaluated or retired.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Leveraging the TOGAF Library:&lt;/strong&gt; Utilize the &lt;strong&gt;TOGAF Series Guides&lt;/strong&gt; selectively, focusing on those directly relevant to current organizational needs. Examples include:&lt;ul&gt;&lt;li&gt;For Agile development: &lt;em&gt;“ADM &amp; Agile”&lt;/em&gt;&lt;/li&gt;&lt;li&gt;For cloud migration initiatives: &lt;em&gt;“Cloud Architecture”&lt;/em&gt;&lt;/li&gt;&lt;li&gt;For security mandates: &lt;em&gt;“Security Architecture”&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;6-common-pitfalls-and-mitigation-strategies&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#6-common-pitfalls-and-mitigation-strategies&quot;&gt;6. Common Pitfalls and Mitigation Strategies&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Experience reveals recurring challenges in architectural practice. Awareness and proactive mitigation are key.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Trap&lt;/th&gt;&lt;th&gt;Symptom&lt;/th&gt;&lt;th&gt;Antidote&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Big-Bang Target Architecture&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Overly ambitious, multi-year architectural projects yielding no intermediate deliverables.&lt;/td&gt;&lt;td&gt;Adopt a capabilities-based roadmap with short-term horizons.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Template-Driven Documentation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Production of voluminous, generic documents filled with boilerplate content.&lt;/td&gt;&lt;td&gt;Prioritize concise, purpose-driven documentation. Each artefact should address a specific audience and concern.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Retrospective Governance&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Architecture Board reviews occurring only after significant implementation efforts are complete.&lt;/td&gt;&lt;td&gt;Implement “shift-left” governance, where architectural compliance is assessed at earlier stages, such as during code reviews or pull request approvals.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/togaf-a-pragmatic-starter-kit-for-engineers/#key-takeaways&quot;&gt;Key Takeaways&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;TOGAF is a &lt;strong&gt;lightweight risk-management loop&lt;/strong&gt;, not a document factory.&lt;/li&gt;&lt;li&gt;Run the first ADM cycle &lt;strong&gt;lean&lt;/strong&gt;: focused scope, limited principles.&lt;/li&gt;&lt;li&gt;Store architectural truth in &lt;strong&gt;Git&lt;/strong&gt;, not static documents.&lt;/li&gt;&lt;li&gt;Tie every governance gate to a &lt;strong&gt;working product increment&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;Iterate continuously—architecture requires ongoing adaptation.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;TOGAF, when applied judiciously, serves as a powerful tool for strategic alignment and risk management, ensuring that architectural efforts contribute directly to business value. By embracing its iterative nature and focusing on pragmatic application, engineers can effectively leverage TOGAF to navigate the complexities of enterprise-scale development.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Vibe Engineering: The Senior Developer&#39;s Approach to LLMs</title>
      <link href="https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/" />
      <updated>2025-10-08T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/</id>
      <content type="html">
				&lt;p&gt;Simon Willison has introduced the concept of “&lt;a href=&quot;https://simonwillison.net/2025/Oct/7/vibe-engineering/&quot; rel=&quot;noopener&quot;&gt;vibe engineering&lt;/a&gt;” to distinguish a rigorous, professional approach to working with Large Language Models (LLMs) from the more casual “vibe coding.” While “vibe coding” often involves fast, prompt-driven software development with less attention to underlying mechanics, “vibe engineering” focuses on integrating LLMs into established software engineering best practices, treating the LLM as a junior developer under the guidance of a senior engineer.&lt;/p&gt;&lt;p&gt;This concept also builds on Simon’s earlier work, which I have previously explored, regarding the effective and safe use of AI in development. Specifically, his insights on &lt;a href=&quot;https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/&quot; rel=&quot;noopener&quot;&gt;embracing parallel coding agents&lt;/a&gt; and &lt;a href=&quot;https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/&quot; rel=&quot;noopener&quot;&gt;designing safe and effective agentic loops&lt;/a&gt; provide crucial context for understanding the “vibe engineering” philosophy.&lt;/p&gt;&lt;h3 id=&quot;the-essence-of-vibe-engineering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#the-essence-of-vibe-engineering&quot;&gt;The Essence of Vibe Engineering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vibe engineering is about seasoned professionals accelerating their work with LLMs while maintaining accountability for the software they produce. It acknowledges that productive engagement with LLMs is complex, requiring a deep understanding of the tools and an awareness of potential pitfalls. The rise of coding agents—such as Claude Code, OpenAI’s Codex CLI, and Gemini CLI—has amplified the need for this structured approach, as these tools can iterate on code, test, and modify it to achieve specified goals.&lt;/p&gt;&lt;p&gt;Simon notes that he is increasingly hearing from experienced engineers who are running multiple agents simultaneously, tackling several problems in parallel. He himself has started &lt;a href=&quot;https://simonwillison.net/2025/Oct/5/parallel-coding-agents/&quot; rel=&quot;noopener&quot;&gt;running multiple agents&lt;/a&gt;, finding it surprisingly effective, albeit mentally demanding. This contrasts sharply with “vibe coding,” where simple, low-stakes tasks are outsourced to an LLM with less rigorous review.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Iterating with coding agents to produce production-quality code that I’m confident I can maintain in the future feels like a different process entirely.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;key-elements-of-vibe-engineering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#key-elements-of-vibe-engineering&quot;&gt;Key Elements of Vibe Engineering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vibe engineering actively rewards and amplifies existing top-tier software engineering practices. The following elements are crucial for effectively leveraging LLMs in a professional development context, categorised for clarity:&lt;/p&gt;&lt;h4 id=&quot;i-technical-foundations&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#i-technical-foundations&quot;&gt;&lt;strong&gt;I. Technical Foundations&lt;/strong&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Automated Testing:&lt;/strong&gt; Robust, comprehensive, and stable test suites allow agentic coding tools to operate efficiently. Without tests, agents might claim functionality without actual verification, and new changes could introduce regressions unnoticed. Test-first development is particularly effective with agents.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Comprehensive Documentation:&lt;/strong&gt; LLMs, like human programmers, have limited context windows. Providing relevant documentation enables them to use APIs from other areas without needing to read the entire codebase. Well-written documentation can even allow models to build implementations from input alone.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Good Version Control Habits:&lt;/strong&gt; The ability to undo mistakes and understand change history is paramount, especially when coding agents are making modifications. LLMs are proficient with Git, capable of navigating history and using tools like &lt;code&gt;git bisect&lt;/code&gt; to track down bug origins.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Effective Automation:&lt;/strong&gt; Continuous integration, automated formatting and linting, and continuous deployment to preview environments all benefit agentic coding tools. LLMs can also facilitate the creation of quick automation scripts for consistent task repetition.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;ii-strategic-and-managerial-skills&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#ii-strategic-and-managerial-skills&quot;&gt;&lt;strong&gt;II. Strategic &amp; Managerial Skills&lt;/strong&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Planning in Advance:&lt;/strong&gt; A high-level plan is essential before beginning development. With agents, this becomes even more critical; the plan can be refined first, then handed off to the agent for code generation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A Unique Form of Management:&lt;/strong&gt; Interacting with coding agents requires clear instructions, necessary context, and actionable feedback, akin to managing a human collaborator. While agents do not have emotions, existing management experience proves surprisingly useful in guiding their work.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Instinct for Outsourcing:&lt;/strong&gt; Developing an intuition for what tasks are best delegated to AI and what requires manual handling is an evolving skill.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Updated Sense of Estimation:&lt;/strong&gt; AI-assisted coding changes project timelines significantly. Estimating project duration, a core senior engineer skill, becomes more complex as tasks that were once time-consuming become much faster, introducing new variables for consideration.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;iii-quality-assurance-and-review&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#iii-quality-assurance-and-review&quot;&gt;&lt;strong&gt;III. Quality Assurance &amp; Review&lt;/strong&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Culture of Code Review:&lt;/strong&gt; A fast and productive code review process is vital when working with LLMs. This ensures quality and allows for human oversight of agent-generated code.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Strong Manual QA:&lt;/strong&gt; Beyond automated tests, proficiency in manual testing, including predicting and investigating edge cases, is crucial.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ability to Ship to a Preview Environment:&lt;/strong&gt; Safely previewing agent-built features before production deployment makes reviews more productive and reduces deployment risks.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;iv-problem-solving-and-research&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#iv-problem-solving-and-research&quot;&gt;&lt;strong&gt;IV. Problem Solving &amp; Research&lt;/strong&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Research Skills:&lt;/strong&gt; The ability to identify the best approaches and validate solutions remains important before engaging an agent to write code.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These characteristics are largely those already possessed by senior software engineers. AI tools, therefore, serve to amplify existing expertise; the more skills and experience a developer has, the better and faster the results they can achieve with LLMs and coding agents.&lt;/p&gt;&lt;h3 id=&quot;the-senior-developer-analogy&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/vibe-engineering-the-senior-developers-approach-to-llms/#the-senior-developer-analogy&quot;&gt;The “Senior Developer” Analogy&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The analogy of treating an LLM as a junior developer is fitting. A senior developer provides clear instructions, sets up a supportive environment (including robust testing and documentation), reviews the junior’s work, and guides them towards the desired outcome. This mirrors the “vibe engineering” approach, where the human engineer acts as the architect and manager, ensuring the LLM’s output aligns with project goals and quality standards.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“You’re not just responsible for writing the code—you’re researching approaches, deciding on high-level architecture, writing specifications, defining success criteria, designing agentic loops, planning QA, managing a growing army of weird digital interns who will absolutely cheat if you give them a chance, and spending so much time on code review.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This perspective highlights the shift in the senior engineer’s role: from solely writing code to orchestrating and validating the work of AI collaborators. It is a more sophisticated way of working with AI tools to build production-ready software, ensuring that the power of LLMs is harnessed responsibly and effectively.&lt;/p&gt;&lt;p&gt;I applaud Simon Willison for articulating this nuanced approach, which provides a valuable framework for navigating the evolving landscape of AI-assisted development. His work consistently offers practical and forward-thinking insights into this rapidly changing field.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Extracting Knowledge from PDFs: Advanced Techniques and Local Solutions</title>
      <link href="https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/" />
      <updated>2025-10-07T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/</id>
      <content type="html">
				&lt;p&gt;The challenge of extracting structured information from PDF documents for use with Large Language Models (LLMs) is a significant topic in AI. Andrew Ng, &lt;a href=&quot;https://info.deeplearning.ai/openais-trillion-dollar-bet-generating-viruses-modeling-planet-earth-paying-for-training-data-2&quot; rel=&quot;noopener&quot;&gt;through his newsletter&lt;/a&gt;, has shed light on both the complexities and emerging solutions in this area. This post examines the principles behind advanced document extraction, exemplified by concepts from LandingAI’s Agentic Document Extraction (ADE), and contrasts them with a local PDF-to-Markdown conversion tool I developed, inspired by Simon Willison’s work.&lt;/p&gt;&lt;h3 id=&quot;the-challenge-of-pdf-data-extraction&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#the-challenge-of-pdf-data-extraction&quot;&gt;The Challenge of PDF Data Extraction&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;PDFs frequently contain what is termed “dark data”—information that exists but remains largely inaccessible for automated analysis. Historically, the static and visually oriented nature of PDFs made it difficult for software to interpret their content beyond basic text recognition. With the advent of LLMs, the potential to derive meaning from vast archives of PDF documents has grown, yet accurate extraction remains a hurdle.&lt;/p&gt;&lt;p&gt;Andrew Ng highlights a critical aspect of this challenge:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Some of the most disconcerting mistakes I’ve seen a computer make have been when a system incorrectly extracted figures from a large table of numbers or complex form and output a confident-sounding but incorrect financial figure. Because our intuition tells us that computers are good at numbers (after all, computers are supposed to be good at computing!), I’ve seen users find silent failures in the form of incorrect numerical outputs particularly hard to catch.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This observation underscores that simple text extraction is often insufficient; a deeper understanding of document structure and context is required to prevent subtle, yet impactful, errors.&lt;/p&gt;&lt;h3 id=&quot;principles-of-advanced-document-extraction-eg-agentic-approaches&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#principles-of-advanced-document-extraction-eg-agentic-approaches&quot;&gt;Principles of Advanced Document Extraction (e.g., Agentic Approaches)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Advanced document extraction systems, such as those employing “agentic” principles, aim to overcome the limitations of traditional OCR by mimicking human-like understanding. The core idea is to process documents not as flat images or simple text streams, but as structured entities with visual and semantic relationships.&lt;/p&gt;&lt;p&gt;Key principles often include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Intelligent Document Understanding:&lt;/strong&gt; Moving beyond basic Optical Character Recognition (OCR) to interpret visual cues, such as the layout of form fields, tables, and checkboxes. This involves understanding the &lt;em&gt;purpose&lt;/em&gt; of elements based on their visual presentation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Complex Layout Extraction:&lt;/strong&gt; Decomposing documents into semantic units rather than just text blocks. This allows for parsing diverse formats (e.g., PDFs, scanned images, complex tables) without extensive pre-training for each specific layout. The goal is to identify intricate relationships between elements.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Accurate Extraction of Structured Data:&lt;/strong&gt; Systems are designed to precisely extract data from tables, charts, and other complex visual layouts. This minimises errors that arise from text-only analysis, ensuring comprehensive data capture.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Visual Grounding:&lt;/strong&gt; The ability to pinpoint the exact location of visual elements and text within a document. This feature is crucial for verifying extracted information by linking it back to its source, thereby building trust in AI-generated insights.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Field-Specific Extraction:&lt;/strong&gt; The capability to extract only specific, relevant fields from documents (e.g., invoice numbers, medical record entries). This automates large-scale data capture, reduces manual errors, and ensures consistency.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The “agentic workflow” concept suggests that, much like a human, an AI system can iteratively examine different parts of a document to gather information piece by piece. This might involve using specialised models, such as a Document Pre-trained Transformer (DPT), to break down complex documents into smaller, more manageable sub-problems, leading to more accurate results.&lt;/p&gt;&lt;h3 id=&quot;my-local-pdf-to-markdown-tool-the-sacred-scroll-transcriber&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#my-local-pdf-to-markdown-tool-the-sacred-scroll-transcriber&quot;&gt;My Local PDF-to-Markdown Tool: The Sacred Scroll Transcriber&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In contrast to comprehensive, cloud-based solutions, I developed “The Sacred Scroll Transcriber” as a local, privacy-focused tool for converting PDFs to Markdown. Inspired by Simon Willison’s work on client-side OCR, this static site operates entirely within the user’s browser.&lt;/p&gt;&lt;h4 id=&quot;core-capabilities&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#core-capabilities&quot;&gt;Core Capabilities:&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Local Processing:&lt;/strong&gt; All operations, from PDF rendering to OCR, are performed client-side, ensuring no data leaves the user’s device.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;OCR-Based Extraction:&lt;/strong&gt; It leverages Tesseract.js for optical character recognition. Each PDF page is first rendered as an image, and then OCR is applied to extract text.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Markdown Output:&lt;/strong&gt; The tool converts the extracted text into Markdown format, aiming to preserve the document’s structure where possible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Image Handling:&lt;/strong&gt; It can extract and display images embedded within the PDF.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;User-Centric Design:&lt;/strong&gt; The tool is designed for straightforward use, allowing users to upload a PDF and download the transcribed content.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;technical-approach-inspired-by-simon-willison&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#technical-approach-inspired-by-simon-willison&quot;&gt;Technical Approach (Inspired by Simon Willison):&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;PDF Page Rendering:&lt;/strong&gt; PDF.js is used to render each page of the PDF to a high-resolution canvas.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Image Conversion:&lt;/strong&gt; The content of the canvas is then converted into a JPEG image format.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tesseract OCR:&lt;/strong&gt; Tesseract.js processes these rendered images to perform text recognition.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Structured Output:&lt;/strong&gt; The recognised text is organised by page and formatted into Markdown.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;While my tool offers a practical, privacy-conscious solution for converting PDFs to a structured text format, it primarily relies on image-based OCR. Advanced systems, by contrast, integrate a deeper understanding of visual context and semantic relationships, making them suitable for highly complex documents where precise data extraction and verification are paramount for applications like financial analysis or medical record processing.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This approach is directly inspired by &lt;a href=&quot;https://github.com/simonw/tools/blob/main/ocr.html&quot; rel=&quot;noopener&quot;&gt;Simon Willison’s OCR tool&lt;/a&gt;. &lt;a href=&quot;https://allarddewinter.net/blog/extracting-knowledge-from-pdfs-advanced-techniques-and-local-solutions/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Embracing the Parallel Coding Agent Lifestyle</title>
      <link href="https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/" />
      <updated>2025-10-06T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/</id>
      <content type="html">
				&lt;p&gt;Simon Willison’s recent post, “&lt;a href=&quot;https://simonwillison.net/2025/Oct/5/parallel-coding-agents/&quot; rel=&quot;noopener&quot;&gt;Embracing the parallel coding agent lifestyle&lt;/a&gt;”, details his evolving approach to using multiple AI coding agents concurrently. Initially sceptical, Simon has found specific scenarios where parallel agents significantly boost efficiency without overwhelming the human reviewer.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“I can only focus on reviewing and landing one significant change at a time, but I’m finding an increasing number of tasks that can still be fired off in parallel without adding too much cognitive overhead to my primary work.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;effective-patterns-for-parallel-agents&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/#effective-patterns-for-parallel-agents&quot;&gt;Effective Patterns for Parallel Agents&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Simon outlines several patterns where running multiple agents proves beneficial:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Research for Proof of Concepts:&lt;/strong&gt; Agents can quickly build proof-of-concept implementations for new libraries or technologies, even if they are too new to be in the training data. This helps answer fundamental questions about feasibility and integration.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Understanding Existing Systems:&lt;/strong&gt; For complex codebases, agents can provide detailed explanations of how specific parts of the system function. They can trace code paths, identify dependencies, and summarise functionality, which can then be used as context for future prompts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Small Maintenance Tasks:&lt;/strong&gt; Low-stakes tasks, such as fixing deprecation warnings or minor irritations, can be delegated to agents. This allows the developer to remain focused on primary work while the agent resolves peripheral issues.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Carefully Specified and Directed Work:&lt;/strong&gt; When the developer provides a precise specification, agents can generate code that requires less effort to review. This “authoritarian approach” to prompting reduces the cognitive load of validation.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Simon currently uses a mix of Claude Code (on Sonnet 4.5), Codex CLI (on GPT-5-Codex), and Codex Cloud for asynchronous tasks. He often runs multiple terminal windows with different agents, sometimes in “YOLO mode” for tasks where the risk of malicious instructions is low.&lt;/p&gt;&lt;h3 id=&quot;jesse-vincents-parallel-agent-workflow&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/#jesse-vincents-parallel-agent-workflow&quot;&gt;Jesse Vincent’s Parallel Agent Workflow&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Jesse Vincent’s article, “&lt;a href=&quot;https://blog.fsck.com/2025/10/05/how-im-using-coding-agents-in-september-2025/&quot; rel=&quot;noopener&quot;&gt;How I’m using coding agents in September, 2025&lt;/a&gt;”, provides a detailed workflow for parallel agents, primarily using Claude Code. Jesse employs a “brainstorming” prompt to refine ideas into a design and specification, followed by a “planning” prompt to generate a comprehensive implementation plan.&lt;/p&gt;&lt;p&gt;A key aspect of Jesse’s method involves using two separate Claude Code instances: an “architect” and an “implementer”.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Architect Agent:&lt;/strong&gt; This agent focuses on design, planning, and reviewing the work of the implementer. It helps clarify and update the planning document.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Implementer Agent:&lt;/strong&gt; This agent executes the tasks outlined in the plan. It works in small chunks, and its output is reviewed by the architect.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Jesse also uses &lt;code&gt;git worktree&lt;/code&gt; to isolate tasks, allowing multiple agents to work on different features within the same codebase concurrently. For code review, he integrates CodeRabbit, but adds a layer of role-play to his prompts, asking the agent to evaluate the reviewer’s suggestions critically rather than blindly applying them.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“A reviewer did some analysis of this PR. They’re external, so reading the codebase cold. This is their analysis of the changes and I’d like you to evaluate the analysis and the reviewer carefully.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;personal-commentary&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/#personal-commentary&quot;&gt;Personal Commentary&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The concept of running parallel coding agents, as described by Simon and Jesse, offers a compelling vision for enhanced development productivity. The ability to offload research, minor fixes, or even carefully specified implementation tasks to AI agents while maintaining focus on a primary task is particularly appealing.&lt;/p&gt;&lt;p&gt;I believe this approach can be highly effective, especially for projects where the review bottleneck is managed. I am keen to explore this further, potentially by setting up a local environment using tools like &lt;code&gt;y-router&lt;/code&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; to connect Claude Code CLI with OpenRouter. This would allow me to experiment with various LLMs and host my own local LLM safely accessible via Tailscale. The inherent latency in receiving responses from LLMs suggests that spinning up multiple agents in parallel could be a natural way to maximise throughput, as one might as well initiate another task while waiting for a current one to complete.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;code&gt;y-router&lt;/code&gt; is a Cloudflare Worker that translates between Anthropic’s Claude API and OpenAI-compatible APIs, enabling the use of Claude Code with OpenRouter and other OpenAI-compatible providers. &lt;a href=&quot;https://allarddewinter.net/blog/embracing-the-parallel-coding-agent-lifestyle/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>The Leader&#39;s Duty to Train and the Culture of Discipline</title>
      <link href="https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/" />
      <updated>2025-10-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/</id>
      <content type="html">
				&lt;p&gt;The importance of rigorous, realistic training is crucial for any team facing high-stakes situations. This principle, discussed in a very informative and valuable podcast episode (&lt;a href=&quot;https://youtu.be/ynFufsry22s?si=HxyNu1hnrhy8EK1K&quot; rel=&quot;noopener&quot;&gt;Jocko Podcast #419&lt;/a&gt;) featuring Jocko Willink and Leif Babin, is well worth the time to listen to and extends beyond military applications to any organisation where performance under pressure is critical.&lt;/p&gt;&lt;p&gt;A leader’s fundamental duty is to ensure their people are prepared for the worst-case scenario. This preparation is not merely about ticking boxes; it is about instilling automatic, effective responses through disciplined practice.&lt;/p&gt;&lt;h3 id=&quot;the-necessity-of-hard-training&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/#the-necessity-of-hard-training&quot;&gt;The Necessity of Hard Training&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The discussion highlights a memorable story about PFC Willie Lump Lump, a fictional character used as a training aid. While Willie Lump Lump is not a real person, the story serves as a powerful example. It illustrates the severe cost of training that is weakened by external pressures or misplaced concerns.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“The only way to prepare men for combat is to train them in conditions as close to the real thing as possible.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This means accepting the inherent risk in realistic training to ensure readiness when the stakes are highest. Visualising this negative outcome helps drive home the core message: training saves lives.&lt;/p&gt;&lt;h3 id=&quot;formal-vs-informal-training-ojt&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/#formal-vs-informal-training-ojt&quot;&gt;Formal vs. Informal Training (OJT)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While formal training provides a necessary foundation, the most critical learning occurs through &lt;strong&gt;On-the-Job Training (OJT)&lt;/strong&gt;.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Training Type&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Value Proposition&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Formal&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Structured courses, classroom instruction, theoretical foundation.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Provides baseline knowledge and fundamental concepts.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Informal (OJT)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Learning through direct application, mentorship, and real-time problem-solving.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Develops practical skills, adaptability, and decision-making under pressure.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;The Leader’s Role in OJT:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Instead of providing a complete solution (e.g., a pre-made project timeline), the leader should present the problem and require the subordinate to develop the solution.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Present the Problem:&lt;/strong&gt; “Here is the project. Come up with a timeline.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Review and Coach:&lt;/strong&gt; Review the proposed solution, identifying gaps and providing context (e.g., procurement lead times, logistical constraints).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Iterate:&lt;/strong&gt; Repeat the process on the next project, allowing the subordinate to apply learned lessons.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This approach forces critical thinking, connects theory to practice, and accelerates the subordinate’s development, eventually enabling them to perform better than the leader in that specific domain.&lt;/p&gt;&lt;h3 id=&quot;connecting-the-classroom-to-chaos&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/#connecting-the-classroom-to-chaos&quot;&gt;Connecting the Classroom to Chaos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A key challenge in training is bridging the gap between theoretical instruction and the chaos of real-world application. The use of visual aids, such as a magnet board to simulate tactical scenarios, proved highly effective.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Detached Perspective:&lt;/strong&gt; By viewing the problem from an elevated, detached perspective (like a chessboard), leaders and subordinates can understand the overall flow and consequences of their actions, which is impossible when immersed in the immediate chaos.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Simplification:&lt;/strong&gt; Complex procedures (like Immediate Action Drills) must be simplified to core principles (e.g., “If you move, someone must cover you”). This allows for flexible application rather than rigid memorisation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; Leaders must understand the parameters within which they can manoeuvre. While support roles may have tighter constraints, the leader must be able to move where necessary to influence the situation.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;building-a-culture-of-discipline&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/#building-a-culture-of-discipline&quot;&gt;Building a Culture of Discipline&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Training and leadership development must be woven into the fabric of the organisation’s culture. Culture is defined not by what is preached, but by what is tolerated and exemplified.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Element&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Impact on Culture&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Setting the Example&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The leader’s actions are constantly observed and judged. If the leader cuts corners or avoids difficult tasks, the team will emulate that behaviour.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Establishes the true standard of effort and commitment.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Propagating History&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Sharing the organisation’s history, successes, and failures. This can be done through stories, documentation, or physical displays (like banners or plaques).&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Provides context, fosters pride, and reinforces core values.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Rewards and Mitigation&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Publicly rewarding behaviour that supports the culture and mitigating (or penalising) behaviour that undermines it.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Clearly defines acceptable and unacceptable standards of conduct.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Material Items&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Patches, uniforms, or insignia that must be &lt;strong&gt;earned&lt;/strong&gt;. These items serve as tangible symbols of achievement and shared identity.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Creates a sense of belonging and pride, provided the value is earned, not given.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Language&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The use of specific slogans, mantras, or common phrases (e.g., “No Slack,” “Prioritise and Execute”).&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Unifies the team’s mindset, creates a shared understanding, and reinforces cultural attitudes towards challenges.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;taking-care-of-your-people&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-leaders-duty-to-train-and-the-culture-of-discipline/#taking-care-of-your-people&quot;&gt;Taking Care of Your People&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Taking care of people is often misunderstood as coddling or avoiding discomfort. True care involves &lt;strong&gt;discipline&lt;/strong&gt;—setting high standards and pushing individuals to achieve their long-term potential.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Long-Term Success:&lt;/strong&gt; A leader’s focus must be on the long-term success of their team members, which often requires demanding performance and holding the line on standards.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Truth:&lt;/strong&gt; Leaders must always tell the truth, even when it is difficult. This builds trust and ensures the team has an accurate assessment of the situation, even if the truth reveals the leader’s own shortcomings (e.g., failing to build a necessary relationship with a superior).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Shared Hardship:&lt;/strong&gt; Hard training and shared suffering strengthen bonds and make the culture stronger. Teams that endure difficult challenges together develop a tougher, more unified identity.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Stop Avoiding Politics</title>
      <link href="https://allarddewinter.net/blog/stop-avoiding-politics/" />
      <updated>2025-10-02T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/stop-avoiding-politics/</id>
      <content type="html">
				&lt;p&gt;The post &lt;a href=&quot;https://terriblesoftware.org/2025/10/01/stop-avoiding-politics/&quot; rel=&quot;noopener&quot;&gt;Stop Avoiding Politics&lt;/a&gt; from Terrible Software tackles a common aversion among engineers: workplace politics. The author argues that dismissing politics as a “dirty game” is a strategic mistake. The core problem isn’t politics itself, but &lt;em&gt;bad&lt;/em&gt; politics. By refusing to participate, well-intentioned engineers cede influence, allowing poor decisions to be made without their input.&lt;/p&gt;&lt;p&gt;Perspective like this and other on influencing link to the realities of power explored in Niccolò Machiavelli’s &lt;em&gt;The Prince&lt;/em&gt;. Written as a guide for acquiring and maintaining political power, its lessons are surprisingly applicable to modern organisational dynamics.&lt;/p&gt;&lt;p&gt;Politics, in this context, is simply the mechanism of human coordination within groups—the network of relationships, influence, and informal power present in every organisation.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Good politics is just being strategic about relationships and influence in the service of good outcomes.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The author contrasts two mindsets: the engineer who avoids politics and complains about bad decisions, and the engineer who understands that “ideas don’t speak. People do.” The latter engages in what is often reframed as “stakeholder management” or “building alignment,” which are essentially political skills used for positive ends.&lt;/p&gt;&lt;h2 id=&quot;machiavellian-principles-for-modern-influence&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/stop-avoiding-politics/#machiavellian-principles-for-modern-influence&quot;&gt;Machiavellian Principles for Modern Influence&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Machiavelli’s work provides a foundational theory for understanding why engaging with politics is necessary. His central argument is that a leader must be pragmatic, understanding the world as it is, not as we wish it to be.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Machiavellian Concept&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Application in Modern Organisations&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Virtù vs. Fortuna&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Relying on skill and ability (&lt;code&gt;virtù&lt;/code&gt;) to navigate chance and circumstance (&lt;code&gt;fortuna&lt;/code&gt;), rather than hoping merit alone will suffice.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;The Importance of Appearances&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Managing perception and being visible, ensuring good work is recognised.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;It is Better to be Feared than Loved&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Translated to a corporate context: being respected for your competence and reliability is more durable than being liked.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;The Lion and the Fox&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Combining the strength of the lion (technical competence) with the cunning of the fox (political acumen) to be effective.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;good-politics-in-practice&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/stop-avoiding-politics/#good-politics-in-practice&quot;&gt;Good Politics in Practice&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The article provides concrete examples of what constructive political engagement looks like, which align with these principles:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Building relationships before you need them:&lt;/strong&gt; A casual coffee with a colleague from another team can turn them into a valuable ally months later. This is an exercise in building a base of support, a key Machiavellian strategy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Understanding real incentives:&lt;/strong&gt; Framing technical proposals in terms of what decision-makers actually care about (e.g., shipping speed, not microservices architecture). This is pragmatism—understanding what truly motivates people.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Managing up effectively:&lt;/strong&gt; Keeping managers informed and presenting solutions, not just problems, to build trust. This strengthens your position and influence (&lt;code&gt;virtù&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Creating win-win situations:&lt;/strong&gt; Finding ways to collaborate that benefit multiple parties instead of engaging in zero-sum fights for resources. This secures alliances and stabilises your position.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Being visible:&lt;/strong&gt; Ensuring that good work is seen and recognised through presentations, documentation, and communication. This is the modern equivalent of managing your reputation and appearances.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The alternative to good politics isn’t no politics. It’s bad politics winning by default. The choice mirrors the dilemma Machiavelli presents: to engage with the messy reality of power or to be governed by it. Leading and influencing from where you stand, without formal authority, is the essence of practical leadership. Giving it our all means mastering the art of influence to champion good ideas and protect our teams, embracing the pragmatism that has been necessary for effective action for centuries.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Designing Safe and Effective Agentic Loops</title>
      <link href="https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/" />
      <updated>2025-10-01T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/</id>
      <content type="html">
				&lt;p&gt;AI coding agents that can write, execute, and correct their own code represent a significant step forward. However, their power comes with inherent risks. In his post on &lt;a href=&quot;https://simonwillison.net/2025/Sep/30/designing-agentic-loops/&quot; rel=&quot;noopener&quot;&gt;designing agentic loops&lt;/a&gt;, Simon Willison provides a clear case for what is needed to work with these agents effectively and safely.&lt;/p&gt;&lt;p&gt;An agentic loop, as Simon defines it, is an LLM running tools in a loop to achieve a goal. The skill lies in carefully designing that loop and the tools within it.&lt;/p&gt;&lt;h3 id=&quot;the-risk-of-yolo-mode&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/#the-risk-of-yolo-mode&quot;&gt;The Risk of “YOLO Mode”&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To get the most out of these agents, they need to run unattended in what Simon calls “YOLO mode,” where they can execute commands without constant human approval. This is also where the danger lies. As Solomon Hykes memorably put it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;An AI agent is an LLM wrecking its environment in a loop.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The primary risks of an unattended agent include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Executing destructive shell commands that delete or corrupt files.&lt;/li&gt;&lt;li&gt;Exfiltrating sensitive data like source code or API keys.&lt;/li&gt;&lt;li&gt;Using your machine as a proxy for malicious attacks on other systems.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-practical-approach-to-safety&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/#a-practical-approach-to-safety&quot;&gt;A Practical Approach to Safety&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Simon outlines three ways to manage these risks, with a clear preference for one. While you can take the risk on your local machine or trust the tool’s built-in sandboxing, the most robust approach is to use a secure, isolated environment.&lt;/p&gt;&lt;p&gt;His preferred method is to use “someone else’s computer.” This is a practical idea; by running the agent in a disposable, cloud-based environment like a GitHub Codespace, you contain the potential damage. If the agent goes rogue, it does so on a temporary virtual machine, not your primary workstation. This prevents breaches of your local data and contains any harm to the isolated environment.&lt;/p&gt;&lt;h3 id=&quot;designing-an-effective-loop&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/#designing-an-effective-loop&quot;&gt;Designing an Effective Loop&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Once a safe environment is established, the focus shifts to designing the loop itself.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Provide the Right Tools:&lt;/strong&gt; Agents are proficient with shell commands. Instead of complex abstractions, you can create a simple &lt;code&gt;AGENTS.md&lt;/code&gt; file with examples of the commands you want it to use. This gives the agent a clear, discoverable set of capabilities.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Issue Scoped Credentials:&lt;/strong&gt; If the agent needs access to services, provide it with tightly scoped credentials. For example, use API keys for a staging environment or set low budget limits on accounts that can incur costs.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;when-to-use-agentic-loops&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/designing-safe-and-effective-agentic-loops/#when-to-use-agentic-loops&quot;&gt;When to Use Agentic Loops&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This pattern is not a universal solution. It is most effective for problems that have clear success criteria and are likely to require significant trial and error. Good use cases include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Debugging:&lt;/strong&gt; Investigating why a test is failing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Performance Optimisation:&lt;/strong&gt; Experimenting with database indexes to improve query speed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dependency Upgrades:&lt;/strong&gt; Updating packages and fixing minor breaking changes, provided you have a solid test suite.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The key takeaway is that the power of AI agents is unlocked not just by the model itself, but by the secure and well-designed environment you create for them. Using disposable sandboxes like GitHub Codespaces is an effective strategy for mitigating risk while still allowing the agent the freedom it needs to solve complex problems.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The AI Coding Trap</title>
      <link href="https://allarddewinter.net/blog/the-ai-coding-trap/" />
      <updated>2025-09-29T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-ai-coding-trap/</id>
      <content type="html">
				&lt;p&gt;Chris Loy’s article &lt;a href=&quot;https://chrisloy.dev/post/2025/09/28/the-ai-coding-trap&quot; rel=&quot;noopener&quot;&gt;The AI coding trap&lt;/a&gt; provides a structured framework for AI-assisted development. His core insight is that we should treat AI coding agents as exceptionally fast but limited junior engineers, applying traditional software engineering practices to avoid technical debt.&lt;/p&gt;&lt;h2 id=&quot;the-fundamental-shift&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-ai-coding-trap/#the-fundamental-shift&quot;&gt;The fundamental shift&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Traditional development involves extensive problem-solving before implementation. With AI, this reverses - we generate code immediately but then face the harder task of understanding what was produced. Loy calls this “the AI coding trap.”&lt;/p&gt;&lt;h2 id=&quot;ai-as-junior-engineers&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-ai-coding-trap/#ai-as-junior-engineers&quot;&gt;AI as junior engineers&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This perspective helps explain why productivity gains are often modest rather than revolutionary:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspect&lt;/th&gt;&lt;th&gt;Junior Engineer&lt;/th&gt;&lt;th&gt;AI Coding Agent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Velocity&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Improves with experience&lt;/td&gt;&lt;td&gt;Consistently high&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Learning&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Grows through experience&lt;/td&gt;&lt;td&gt;Limited to context engineering&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Domain Knowledge&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Develops over time&lt;/td&gt;&lt;td&gt;None without explicit context&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2 id=&quot;applying-structured-practices&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-ai-coding-trap/#applying-structured-practices&quot;&gt;Applying structured practices&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What I find valuable about Loy’s approach is how it systematises AI collaboration using proven software development practices:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Specification first&lt;/strong&gt;: Use AI to explore requirements before implementation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Documentation focus&lt;/strong&gt;: Generate and review documentation upfront&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Modular design&lt;/strong&gt;: Scaffold architectures to control context scope&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Test-driven development&lt;/strong&gt;: Create tests before writing code&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Coding standards&lt;/strong&gt;: Apply house styles through careful prompting&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This structured approach transforms AI from a code generator into a collaborative tool. The practices that work with human teams—clear specifications, documentation, and standards—prove equally essential when working with AI.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“By understanding that delivering software is so much more than just writing code, we can avoid the AI coding trap and instead hugely amplify our ability to deliver working, scalable software.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The framework acknowledges that while AI handles implementation at unprecedented speed, human oversight remains essential for design, architecture, and maintaining system coherence.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Questions to Ask Before Finishing a Side Project</title>
      <link href="https://allarddewinter.net/blog/questions-to-ask-before-finishing-a-side-project/" />
      <updated>2025-09-28T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/questions-to-ask-before-finishing-a-side-project/</id>
      <content type="html">
				&lt;p&gt;As someone balancing screen-based work with hands-on hobbies like woodworking and family life with three children, I often face the dilemma of when to continue with a side project versus when to let it go. Cassidy Williams, a software engineer based in Chicago, offers a concise framework for navigating this common challenge in her article &lt;a href=&quot;https://cassidoo.co/post/questions-when-i-need-to-finish-something/&quot; rel=&quot;noopener&quot;&gt;Questions to ask when you think need to finish something&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Williams identifies six key questions for conducting a “mental audit” of ongoing projects. These help distinguish between genuine commitment and obligation-driven persistence:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Does this still align with my current goals?&lt;/strong&gt;&lt;br&gt;Reassess whether the project serves your present priorities, not past aspirations.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Would I start this again without prior investment?&lt;/strong&gt;&lt;br&gt;Imagine beginning fresh—would you choose this project today?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do I want this, or am I proving I can finish it?&lt;/strong&gt;&lt;br&gt;Separate intrinsic motivation from completion pressure.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;What happens if I let this go?&lt;/strong&gt;&lt;br&gt;Acknowledge potential consequences without emotional bias.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Am I meeting my expectations or others’?&lt;/strong&gt;&lt;br&gt;Identify whether external validation drives your effort.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;What would I pursue instead?&lt;/strong&gt;&lt;br&gt;Clarify opportunities created by releasing the project.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&lt;p&gt;Doing a little “mental audit” around projects have helped me ship better when I realize some projects I pursue aren’t actually worth it to me.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This approach resonates with my experience of alternating between laptop work and tangible activities like woodworking. The physical immediacy of sawing wood or sanding surfaces provides a stark contrast to digital work, making me more intentional about where I invest limited time. Similarly, parenting three children teaches me to prioritise what truly matters—often revealing that “finishing” isn’t the goal, but rather aligning effort with life’s context.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Stanford&#39;s CS146S: The Modern Software Developer</title>
      <link href="https://allarddewinter.net/blog/stanfords-cs146s-the-modern-software-developer/" />
      <updated>2025-09-26T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/stanfords-cs146s-the-modern-software-developer/</id>
      <content type="html">
				&lt;p&gt;I came across the Stanford’s CS146S course, &lt;a href=&quot;https://themodernsoftware.dev/&quot; rel=&quot;noopener&quot;&gt;&lt;em&gt;The Modern Software Developer&lt;/em&gt;&lt;/a&gt;, which started this week. Taught by Mihail Eric, the course aims to equip students with the skills to master modern AI development tools and workflows. The curriculum is designed to explore how AI-assisted coding, automated testing, and emerging trends can significantly boost developer productivity: very interesting perspective for a software engineering course!&lt;/p&gt;&lt;p&gt;The introductory email from the course instructor outlined several key takeaways that frame the entire course. These principles move beyond simply using AI tools and focus on the evolving role of the developer.&lt;/p&gt;&lt;h2 id=&quot;core-principles-of-modern-development&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/stanfords-cs146s-the-modern-software-developer/#core-principles-of-modern-development&quot;&gt;Core Principles of Modern Development&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The course emphasises a shift in mindset and practice for software engineers.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Human-agent engineering, not vibe coding.&lt;/strong&gt; Pure vibe coding is still not a viable way to build production software. Instead, every developer must learn to become a manager of an eager set of AI agent interns.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is a spot on reframing. The developer’s role transitions from a sole coder to a manager who provides high-level direction, system architecture, and crucial business context to AI agents.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;LLMs are only as good as you are.&lt;/strong&gt; If a developer says AI “doesn’t work on their codebase”, it typically means even a human entering their codebase for the first time would be confused. The key is to set your agents up for success with clear context and well-structured code.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This principle places the responsibility for effective AI collaboration squarely on the developer’s shoulders. It suggests that the quality of the output is directly correlated with the clarity of the input and the health of the underlying system.&lt;/p&gt;&lt;h2 id=&quot;course-structure&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/stanfords-cs146s-the-modern-software-developer/#course-structure&quot;&gt;Course Structure&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The course schedule provides a comprehensive look at the topics that are essential for the modern developer. The ten-week curriculum covers:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Week&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Focus Area&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Key Topics&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;1-2&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;AI Fundamentals&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;LLM mechanics, prompt engineering, agent architecture (MCP)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;3-5&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Development Environment&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;AI IDEs, terminal automation, context management&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;6-7&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Quality &amp; Security&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;AI testing, vulnerability detection, debugging, code review&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;8-9&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Deployment &amp; Operations&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Automated UI building, monitoring, incident response&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;10&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Future Outlook&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The evolving role of the software engineer&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The inclusion of guest speakers from companies like Cognition (Russell Kaplan), Warp (Zach Lloyd), and a16z (Martin Casado) indicates a strong connection to current industry practices and future trends.&lt;/p&gt;&lt;p&gt;This course appears to be a valuable resource for understanding the practical application of AI in software development. I plan to follow the released materials to see how these principles are put into practice.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>On Leading a Room Full of Experts</title>
      <link href="https://allarddewinter.net/blog/on-leading-a-room-full-of-experts/" />
      <updated>2025-09-25T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/on-leading-a-room-full-of-experts/</id>
      <content type="html">
				&lt;p&gt;In technical environments, leadership is often misinterpret as being the most senior expert in the room. In his article, &lt;a href=&quot;https://idiallo.com/blog/how-to-lead-in-a-room-full-of-experts&quot; rel=&quot;noopener&quot;&gt;How to Lead in a Room Full of Experts&lt;/a&gt;, Ibrahim Diallo argues that a leader’s value in a team of specialists is not in having the deepest knowledge, but in providing connection and context.&lt;/p&gt;&lt;p&gt;Diallo reframes the role of a technical leader around a few core responsibilities.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Leadership in technical environments isn’t about being the smartest person in the room. It’s about being the most effective translator.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-leader-as-translator&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-leading-a-room-full-of-experts/#the-leader-as-translator&quot;&gt;The Leader as Translator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A leader’s primary function is to bridge communication gaps between different groups of experts and stakeholders. This involves translating the same technical decision into different “languages” for different audiences:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;For Developers:&lt;/strong&gt; Explaining the technical dependencies and risks (e.g., “cascading failures”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;For Product Teams:&lt;/strong&gt; Framing the issue in terms of user impact and timeline (e.g., “prevent potential outages”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;For Executives:&lt;/strong&gt; Highlighting the strategic trade-off (e.g., “prioritizing system reliability over feature velocity”).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By acting as a translator, the leader ensures that each group understands the implications of a decision from their own perspective, without needing to become experts in other domains.&lt;/p&gt;&lt;h3 id=&quot;the-leader-as-goal-keeper&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-leading-a-room-full-of-experts/#the-leader-as-goal-keeper&quot;&gt;The Leader as Goal-Keeper&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When a room is full of experts, discussions can easily dive deep into technical specifics that, while interesting, may not serve the primary objective. The leader’s job is to constantly steer the conversation back to the actual problem to be solved.&lt;/p&gt;&lt;p&gt;Diallo notes that he has sat through many meetings where engineers debated technical minutiae while the core problem remained poorly defined. A leader’s role is to ask clarifying questions that connect the discussion back to the goal, ensuring the team is solving the right problem, not just an interesting one.&lt;/p&gt;&lt;h3 id=&quot;the-leader-as-facilitator&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-leading-a-room-full-of-experts/#the-leader-as-facilitator&quot;&gt;The Leader as Facilitator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In an expert-driven environment, pretending to have all the answers erodes trust. Diallo argues that saying “I don’t know, but let’s figure it out” is a powerful tool. It creates psychological safety, encourages intellectual humility, and empowers specialists to contribute their unique knowledge.&lt;/p&gt;&lt;p&gt;The leader’s role is not to have the best answer, but to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Frame decisions in terms of trade-offs, timelines, and user impact.&lt;/li&gt;&lt;li&gt;Create space for the right experts to contribute at the right time.&lt;/li&gt;&lt;li&gt;Clearly articulate the “why” behind a decision to maintain alignment and trust.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Your role isn’t to have all the answers. It’s to make sure the right questions get asked, the right people get heard, and the right decisions get made for the right reasons.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;personal-takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-leading-a-room-full-of-experts/#personal-takeaways&quot;&gt;Personal Takeaways&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This model of leadership applies to both people and technical leadership. Two points in particular stand out.&lt;/p&gt;&lt;p&gt;First, the idea of “remembering the goal” is a daily challenge. Many discussions become sidetracked by competing priorities, a desire to impress, or the introduction of a novel idea that is unrelated to the objective. A leader who can consistently help a group maintain focus on the actual goal provides a significant service to the team and the organisation.&lt;/p&gt;&lt;p&gt;Second, the emphasis on defining the problem clearly connects to the challenge of understanding the underlying needs of stakeholders. Being able to effectively listen, identify the core problem beneath the symptoms, and then codify it for the team is a critical and difficult skill. It is the foundation for ensuring that the experts’ work is directed at a valuable outcome.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Scaling Python Data Science: Lessons from Coiled</title>
      <link href="https://allarddewinter.net/blog/scaling-python-data-science-lessons-from-coiled/" />
      <updated>2025-09-24T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/scaling-python-data-science-lessons-from-coiled/</id>
      <content type="html">
				&lt;p&gt;Moving data science projects from a local laptop to a scalable production environment is a persistent challenge. The path is often filled with friction between the need for rapid experimentation and the demand for robust, reproducible systems.&lt;/p&gt;&lt;p&gt;The Talk Python podcast recently featured Matthew Rocklin and Nat Tabris from &lt;a href=&quot;https://coiled.io&quot; rel=&quot;noopener&quot;&gt;Coiled&lt;/a&gt; to discuss this problem. They share lessons learned from building their platform, which is designed to help Python data scientists scale their work in the cloud with minimal DevOps overhead.&lt;/p&gt;&lt;lite-youtube videoid=&quot;omBibVGLzyo&quot; style=&quot;background-image: url(&#39;https://i.ytimg.com/vi/omBibVGLzyo/hqdefault.jpg&#39;);&quot;&gt;&lt;a href=&quot;https://youtube.com/watch?v=omBibVGLzyo&quot; class=&quot;lyt-playbtn&quot; title=&quot;Play Video&quot;&gt;&lt;span class=&quot;lyt-visually-hidden&quot;&gt;Play Video: Talk Python: Data Science Cloud Lessons at Scale&lt;/span&gt;&lt;/a&gt;&lt;/lite-youtube&gt;&lt;h3 id=&quot;the-core-philosophy-making-cloud-scale-feel-like-play&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/scaling-python-data-science-lessons-from-coiled/#the-core-philosophy-making-cloud-scale-feel-like-play&quot;&gt;The Core Philosophy: Making Cloud Scale Feel Like Play&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The central argument presented by Matthew and Nat is that using the cloud for data science should be an empowering experience, not a chore. Their goal is to abstract away the complexities of cloud infrastructure so that scaling a workload feels as simple as importing a library.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The cloud is a really fun tool to use once you get past all the pain… Suddenly the cloud is like play.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To achieve this, Coiled allows users to provision large, temporary clusters of virtual machines directly from a familiar environment like a Jupyter notebook. This approach is optimised for the bursty, short-lived nature of many data science tasks, such as model training or large-scale data processing, where a cluster might be needed for an hour and then shut down.&lt;/p&gt;&lt;h3 id=&quot;the-debate-runtime-replication-vs-docker&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/scaling-python-data-science-lessons-from-coiled/#the-debate-runtime-replication-vs-docker&quot;&gt;The Debate: Runtime Replication vs. Docker&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;One of the most interesting points of the discussion is their stance on environment replication. For many, Docker is the default tool for creating consistent, portable environments. However, the Coiled team argues that it introduces significant friction into the data science development loop.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you put in a Docker build, Docker push cycle into the data science work cycle, it just gums everything up.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The argument is that the time spent building and pushing a Docker image for every small code change stifles rapid iteration. Instead, Coiled uses a runtime replication approach. It scans the developer’s local Python environment and automatically synchronises packages and files to the cloud machines. This method is designed to reduce setup time from several minutes to under a minute, keeping the developer in a state of flow.&lt;/p&gt;&lt;h3 id=&quot;my-perspective-on-standardisation-and-speed&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/scaling-python-data-science-lessons-from-coiled/#my-perspective-on-standardisation-and-speed&quot;&gt;My Perspective on Standardisation and Speed&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The podcast’s position on Docker is valid for workflows that demand high-speed iteration. However, the ideal approach depends heavily on the nature and cadence of the work.&lt;/p&gt;&lt;p&gt;In our company, we do not typically deploy new software versions multiple times per day. A release cycle of once every one or two weeks is more common. In this context, the few extra minutes required for a Docker build is not a critical bottleneck. The benefits we gain from standardisation often outweigh this minor delay.&lt;/p&gt;&lt;p&gt;We value and benefit from using templates for our code and deployment pipelines. Using Docker as a foundation for these templates helps us maintain consistency and develop faster across projects. The formal structure it provides is an asset for long-term maintainability.&lt;/p&gt;&lt;p&gt;Ultimately, it is a trade-off. The Coiled approach optimises for the speed of individual experimentation, while a Docker-based workflow prioritises the formal standardisation of the production environment.&lt;/p&gt;&lt;h3 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/scaling-python-data-science-lessons-from-coiled/#key-takeaways&quot;&gt;Key Takeaways&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Optimise for Your Workflow:&lt;/strong&gt; The tension between rapid iteration and stability in production is central to MLOps. Tools like Coiled are optimised for the former, making them suitable for exploratory, bursty workloads.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Cost of Iteration:&lt;/strong&gt; The overhead of your development cycle matters. For frequent, small changes, a 5-10 minute Docker build can be a significant drag on productivity.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Standardisation Has Value:&lt;/strong&gt; For teams with a more structured and less frequent release cadence, the consistency and reproducibility of a Docker-based workflow can provide more long-term value than pure speed of iteration.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Context is King:&lt;/strong&gt; The right tool depends entirely on your team’s specific needs, deployment frequency, and tolerance for process overhead.&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Timeless Leadership Principles from Jocko Podcast 251</title>
      <link href="https://allarddewinter.net/blog/timeless-leadership-principles-from-jocko-podcast-251/" />
      <updated>2025-09-23T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/timeless-leadership-principles-from-jocko-podcast-251/</id>
      <content type="html">
				&lt;p&gt;I frequently listen to the Jocko Podcast. While I have no military background, I recognise that military history offers a rich source of knowledge on leadership and effectiveness. The concepts discussed can be applied not just in conflict, but also in business—a principle the hosts, Jocko Willink and Leif Babin, have built their company on.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/timeless-leadership-principles-from-jocko-podcast-251/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; They are effective at explaining these ideas, using real examples from their combat experience to ground abstract principles in reality.&lt;/p&gt;&lt;p&gt;A clear example of this is &lt;a href=&quot;https://www.youtube.com/watch?v=zrlpv1HkKjM&quot; rel=&quot;noopener&quot;&gt;Jocko Podcast episode 251&lt;/a&gt;. In it, Jocko and Leif discuss a rare book that heavily influenced their philosophy: &lt;em&gt;Guidelines for the Leader and Commander&lt;/em&gt; by General Bruce C. Clarke. This book was also a key source for Colonel David Hackworth, an important influence on Jocko’s thinking. The episode traces the lineage of their core ideas back to this foundational text.&lt;/p&gt;&lt;h3 id=&quot;key-principles-from-guidelines-for-the-leader-and-commander&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/timeless-leadership-principles-from-jocko-podcast-251/#key-principles-from-guidelines-for-the-leader-and-commander&quot;&gt;Key Principles from ‘Guidelines for the Leader and Commander’&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The podcast discussion centres on the timeless nature of the book’s advice. The principles, written decades ago, are the same ones Jocko and Leif now teach.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The Burden of Command:&lt;/strong&gt; Leadership requires immense personal sacrifice and a willingness to devote yourself entirely to your team and mission. It means accepting total responsibility for the failures of your subordinates, a core tenet of Extreme Ownership.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;What a Team Expects from a Leader:&lt;/strong&gt; General Clarke outlines several non-negotiable expectations. A leader must be honest, just, and fair. They must be loyal to both superiors and subordinates. They must lead by example, share information by explaining the “why,” and show genuine interest in their people’s well-being.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Setting and Enforcing Standards:&lt;/strong&gt; The leader is directly responsible for the standards of the organisation. This is captured in two of the book’s most important axioms, which Jocko had sought for years. The first connects preparation to performance, and the second highlights the necessity of inspection.&lt;blockquote&gt;&lt;p&gt;An organisation does well only those things the boss checks.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Morale is Built on Competence:&lt;/strong&gt; High morale is not achieved through coddling. It is the direct result of confidence built through hard training, competence, and effective management. A team that is well-trained and well-led develops pride and resilience.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Constant Vigilance:&lt;/strong&gt; A core theme is that a unit must be ready for anything, 24/7. General Clarke warns against the complacency that led to surprise attacks in the past. This principle of constant readiness is a cornerstone of the Jocko and Leif mindset.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-normal-face-principle-emotional-regulation-in-leadership&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/timeless-leadership-principles-from-jocko-podcast-251/#the-normal-face-principle-emotional-regulation-in-leadership&quot;&gt;The ‘Normal Face’ Principle: Emotional Regulation in Leadership&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A powerful, practical tool discussed in the episode is what Jocko and Leif call “Normal Face.” It is the practiced ability to control your external emotional response to project calmness and focus, especially when faced with bad news or chaos. It is not about being emotionless, but about emotional discipline.&lt;/p&gt;&lt;p&gt;When a subordinate reports a significant mistake, a leader’s calm, measured response is often more effective than an angry outburst. It keeps the focus on solving the problem rather than assigning blame. As Leif explains, Jocko’s composed reaction to a serious error provided a sense of comfort and made the situation feel manageable.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Jocko:&lt;/strong&gt; “…if I can’t control my emotions because you lost a piece of gear… like how am I going to react in the future?.. The punishment for me is knowing like it’s constructive because I know like I gotta get this fixed we can’t let this happen again this is a massive issue… as opposed to me just saddling you with unbearable guilt for letting me down.”&lt;br&gt;&lt;strong&gt;Leif:&lt;/strong&gt; “It’s actually the worst because if you were like ‘dude are you kidding me?’… I would be looking… it would be desirable when Jocko was like ‘Roger’ and just looks back at you… doesn’t give you… a big sense of comfort like okay at least this is manageable?”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;By controlling your reaction, you own the environment and prevent panic from spreading. This principle of emotional regulation is not just for high-stakes environments. The hosts suggest that everyday frustrations, such as managing family life, can be training opportunities. Treating each moment as a chance to practice a measured response is a practical way to develop this skill for constant growth.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Jocko Willink and Leif Babin are retired U.S. Navy SEAL officers who served together in the Battle of Ramadi. They are the co-authors of ‘Extreme Ownership’ and ‘The Dichotomy of Leadership’ and co-founders of the leadership consultancy Echelon Front. &lt;a href=&quot;https://allarddewinter.net/blog/timeless-leadership-principles-from-jocko-podcast-251/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Understanding the Five Doors of Influence</title>
      <link href="https://allarddewinter.net/blog/understanding-the-five-doors-of-influence/" />
      <updated>2025-09-22T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/understanding-the-five-doors-of-influence/</id>
      <content type="html">
				&lt;p&gt;The more senior you become in an organisation, the more your success depends on your ability to influence others. Your ability to advance good work and build effective relationships hinges on this skill. There is a delicate balance between influencing and dictating. While seniority may grant formal authority, true progress comes from fostering intrinsic motivation in your team. Forcing people to act is far less effective than inviting them to contribute to a shared goal.&lt;/p&gt;&lt;p&gt;Of course, a balance is necessary. Some tasks are non-negotiable. When direct influence is not enough, you must rely on structural mechanisms. For example architectural governance boards, contracts and complience in the TOGAF framework. This allowed enterprise architecture to align teams with the company’s strategic goals, providing a formal channel for influence where informal methods might fail.&lt;/p&gt;&lt;p&gt;In his article, “&lt;a href=&quot;https://andiroberts.com/leadership-questions/how-to-influence-others-without-manipulating&quot; rel=&quot;noopener&quot;&gt;How can I influence others without manipulating them?&lt;/a&gt;”, executive coach Andi Roberts provides a useful model for thinking about interpersonal influence. He frames it not as manipulation, but as an invitation.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Influence can be understood as an invitation. It is the art of meeting people where they are, of entering their world with respect, and of opening a door that they might choose to walk through with us.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Andi proposes five “doors” of influence, which are different styles of persuasion. Most of us have a default style, which can become a blind spot. We mistake a different communication preference for resistance. The key is to recognise which door the other person is standing at and adapt our approach accordingly.&lt;/p&gt;&lt;p&gt;Here is a summary of the five doors:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Door&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Best For&lt;/th&gt;&lt;th&gt;Risk of Overuse&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Rationalising&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Persuading with facts, evidence, and logical analysis.&lt;/td&gt;&lt;td&gt;Appealing to people who value data, structure, and clarity.&lt;/td&gt;&lt;td&gt;Becoming cold, detached, and overly complex.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Asserting&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Persuading with confidence, conviction, and direct statements.&lt;/td&gt;&lt;td&gt;Engaging with people who value decisiveness and a clear position.&lt;/td&gt;&lt;td&gt;Appearing domineering and silencing dialogue.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Negotiating&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Persuading by finding common ground and seeking mutual benefit.&lt;/td&gt;&lt;td&gt;Working with people who are pragmatic and prefer collaboration.&lt;/td&gt;&lt;td&gt;Seeming weak or making unnecessary concessions.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Inspiring&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Persuading with stories, vision, and appeals to purpose.&lt;/td&gt;&lt;td&gt;Motivating people who respond to meaning and possibility.&lt;/td&gt;&lt;td&gt;Feeling idealistic and disconnected from reality.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Bridging&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Persuading through relationships, social proof, and third-party validation.&lt;/td&gt;&lt;td&gt;Influencing people who value trust, rapport, and peer endorsement.&lt;/td&gt;&lt;td&gt;Becoming dependent on others for validation.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;The central challenge is that any of these styles, when used exclusively or inappropriately, ceases to be a tool for connection and becomes a barrier.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The paradox is that any of them, when overused, becomes a wall. Logic turns cold. Conviction turns harsh. Compromise turns weak. Vision turns empty. Relationship turns dependent.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This framework is a practical guide for senior leaders. It reminds us to be conscious of our own default style and to listen for the preferences of others. By choosing the right door, or variating between doors, we can make our invitations to collaborate more effective. And when that is not enough, we can turn to structured governance to ensure alignment.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>From Code Generation to AI-Native: Insights from the Front Lines</title>
      <link href="https://allarddewinter.net/blog/from-code-generation-to-ai-native-insights-from-the-front-lines/" />
      <updated>2025-09-19T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/from-code-generation-to-ai-native-insights-from-the-front-lines/</id>
      <content type="html">
				&lt;p&gt;Just yesterday, I analysed the AWS guide on “vibe coding,” noting how it formalises AI-assisted development for the enterprise. It represents a shift from individual craft to scalable, process-driven systems. A recent &lt;a href=&quot;https://www.youtube.com/watch?v=9VxB8ewCHN0&quot; rel=&quot;noopener&quot;&gt;panel discussion with experts from Anthropic, Trae, and Replit&lt;/a&gt; provides a complementary view, offering a look at the best practices emerging from the very frontier of this technology.&lt;/p&gt;&lt;p&gt;This discussion moves the conversation from AI-assisted coding to what can be called “AI-native” development. It reinforces the idea that the developer’s role is fundamentally changing, and it provides practical strategies that bridge the gap between solo experimentation and enterprise-grade systems.&lt;/p&gt;&lt;h3 id=&quot;the-core-shift-ai-as-a-collaborator&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-code-generation-to-ai-native-insights-from-the-front-lines/#the-core-shift-ai-as-a-collaborator&quot;&gt;The Core Shift: AI as a Collaborator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The panellists—Paxton Maeder-York from Anthropic, Chao Peng from Trae, and Michele Catasta from Replit—unanimously framed AI not as a tool, but as a collaborative partner. This is more than a semantic distinction; it underpins a new development paradigm.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Paxton Maeder-York (Anthropic):&lt;/strong&gt; “I typically say I collaborated with Claude… Claude and I are best friends and we do a lot of work together. We’re very much encouraged at Anthropic to try to automate our entire job away with Claude.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This perspective aligns with the principles I have explored previously: the human acts as the architect, directing a powerful collaborator. The panel’s insights show how this collaboration works in practice.&lt;/p&gt;&lt;h3 id=&quot;battle-tested-best-practices&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-code-generation-to-ai-native-insights-from-the-front-lines/#battle-tested-best-practices&quot;&gt;Battle-Tested Best Practices&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The discussion yielded several concrete strategies that are being used right now.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strategic Context Management:&lt;/strong&gt; Even with large context windows, managing what the AI knows is critical. Paxton shared a practical tip: strategically “compacting” a conversation’s history into a summary file (like &lt;code&gt;claude.md&lt;/code&gt;) to maintain essential context. This is a more dynamic, developer-led version of the formal requirement documents proposed in the AWS guide. He also offered a simple but effective prompt suffix: “&lt;em&gt;don’t break anything and don’t change anything else&lt;/em&gt;.”&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-Agent Orchestration:&lt;/strong&gt; The concept of using specialised sub-agents, which I have noted from developers like Zach Wills, is now a key strategy inside Anthropic. Paxton confirmed that their internal experts run multiple AI agents in parallel, each working on a different part of the codebase. This is the practical application of turning the developer into an orchestrator of an AI team.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Resurgence of Test-Driven Development (TDD):&lt;/strong&gt; The panel offered a powerful solution to the problem of AI-generated code quality. Both the AWS guide and my own experience suggest that AI assistants are poor at designing meaningful tests. Chao Peng argued for a TDD revival: the human defines the tests, and the AI’s job is to write code that passes them. This creates a clear feedback loop and makes debugging far more efficient for both the human and the AI.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;the-final-20percent-enterprise-readiness&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-code-generation-to-ai-native-insights-from-the-front-lines/#the-final-20percent-enterprise-readiness&quot;&gt;The Final 20%: Enterprise Readiness&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The panel was realistic about the challenges of deploying AI-built applications. Michele Catasta pointed out the “foot guns” that coding agents expose and the complexities beyond pure code generation.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Michele Catasta (Replit):&lt;/strong&gt; “There are many other things that are important: how do you deploy? Data governance, security and so forth?”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This directly explains &lt;em&gt;why&lt;/em&gt; the enterprise-focused approach seen in the AWS guide is so process-heavy. The formalisms and security guardrails are not bureaucracy; they are the necessary systems to manage the final, difficult 20% of getting a product into production reliably and securely.&lt;/p&gt;&lt;h3 id=&quot;the-engineers-evolving-role-from-coder-to-specifier&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-code-generation-to-ai-native-insights-from-the-front-lines/#the-engineers-evolving-role-from-coder-to-specifier&quot;&gt;The Engineer’s Evolving Role: From Coder to Specifier&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Ultimately, the panel confirmed a conclusion I have been moving toward: the core work of a senior engineer is shifting from implementation to specification.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Michele Catasta (Replit):&lt;/strong&gt; “I think it’s already the case. Like the more you grow as an engineer in your career, the more you write specs rather than code. That’s where the important insights are.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is the end-game of the “human as architect” model. Our primary value is no longer in writing lines of code, but in defining the problem with such precision that an AI collaborator can execute the solution. The innovator’s agile mindset and the enterprise’s formal processes are both methods for achieving this clarity of specification. The most effective developers will be those who master this skill of architectural definition, regardless of the tools they use.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Revisiting Vibe Coding: An Analysis of AWS&#39;s Practical Guide</title>
      <link href="https://allarddewinter.net/blog/revisiting-vibe-coding-an-analysis-of-awss-practical-guide/" />
      <updated>2025-09-18T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/revisiting-vibe-coding-an-analysis-of-awss-practical-guide/</id>
      <content type="html">
				&lt;p&gt;The practice of using large language models for software development is moving from individual experimentation to a more formalised discipline. I have previously written about structuring this process, distinguishing between chaotic “vibe coding” and effective, human-led agentic workflows. Now, Amazon Web Services (AWS) has published its own guide, &lt;a href=&quot;https://github.com/awslabs/mcp/blob/main/VIBE_CODING_TIPS_TRICKS.md&quot; rel=&quot;noopener&quot;&gt;Vibe Coding Tips and Tricks&lt;/a&gt;, offering a corporate, tool-centric perspective on the same challenge.&lt;/p&gt;&lt;p&gt;This new information provides a valuable opportunity to see how these developer-led strategies are being adapted for enterprise environments. The AWS guide reinforces core principles but also introduces new considerations that show the practice is maturing.&lt;/p&gt;&lt;h3 id=&quot;the-aws-framework-for-vibe-coding&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/revisiting-vibe-coding-an-analysis-of-awss-practical-guide/#the-aws-framework-for-vibe-coding&quot;&gt;The AWS Framework for Vibe Coding&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The AWS guide frames “vibe coding” as a structured process heavily reliant on a specific ecosystem of tools, primarily clients and Model Context Protocol (MCP) servers. While it acknowledges the developer’s central role, its focus is less on the philosophy of interaction and more on the operational mechanics.&lt;/p&gt;&lt;p&gt;Key principles from the guide include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Human Responsibility is Non-Negotiable:&lt;/strong&gt; The guide is explicit that the developer owns the architecture, vision, and quality. The AI is a tool, not a replacement for critical thinking.&lt;blockquote&gt;&lt;p&gt;Never blindly trust code generated by AI assistants. Always:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Thoroughly review and understand the generated code&lt;/li&gt;&lt;li&gt;Verify all dependencies&lt;/li&gt;&lt;li&gt;Perform necessary security checks&lt;/li&gt;&lt;li&gt;Test the code in a controlled environment&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A Tool-Centric Workflow:&lt;/strong&gt; Significant emphasis is placed on selecting the right AI client (e.g., Amazon Q, Cline) based on compliance and security, and leveraging specific features like “Plan mode” before generating code. It advocates for a multi-client strategy, using different tools for different tasks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Process Before Prompting:&lt;/strong&gt; The guide formalises the preparation phase. It mandates defining requirements, design guidelines, and constraints in markdown files &lt;em&gt;before&lt;/em&gt; coding begins, ensuring the AI has clear context.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Explicit Rules and Configuration:&lt;/strong&gt; It suggests creating documented rules for the AI, such as file length limits or documentation standards, to enforce consistency.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;evolving-the-practice-from-solo-craft-to-enterprise-systems&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/revisiting-vibe-coding-an-analysis-of-awss-practical-guide/#evolving-the-practice-from-solo-craft-to-enterprise-systems&quot;&gt;Evolving the Practice: From Solo Craft to Enterprise Systems&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Compared to my earlier post “&lt;a href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/&quot;&gt;A Practical Guide to Coding with LLMs&lt;/a&gt;”, the AWS guide shows how these concepts evolve when applied at an enterprise scale. It bridges the gap between an individual’s cognitive workflow and a team’s need for a shared, scalable system.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;From Mindset to System:&lt;/strong&gt; My previous analysis focused on the &lt;em&gt;mindset&lt;/em&gt; of the developer acting as an architect. This is ideal for the solo innovator. The AWS guide provides the &lt;em&gt;engineering system&lt;/em&gt; to support that mindset across a team, emphasising approved tools and security compliance. It is the natural next step for integrating this practice into a collaborative environment.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;From Agile Prep to Formal Process:&lt;/strong&gt; The “first swing” of architecture I advocated for is an agile method well-suited for an individual. AWS formalises this into creating explicit requirement documents. For an enterprise, this is not bureaucracy; it is a necessary mechanism for team alignment, creating a persistent source of truth that enables asynchronous work and maintains quality at scale.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;From Prompting Limits to Engineering Challenges:&lt;/strong&gt; The limitations—such as performance degradation from long conversations or the superficiality of AI-generated tests—are signs of maturity. We are moving beyond simple prompt engineering and are now facing the next frontier of engineering problems: how to make AI-assisted development reliable, scalable, and maintainable. These are the challenges we expect to see when a practice becomes more mature.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;practical-implications-and-learnings&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/revisiting-vibe-coding-an-analysis-of-awss-practical-guide/#practical-implications-and-learnings&quot;&gt;Practical Implications and Learnings&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The AWS guide provides a blueprint for how AI-assisted development can be integrated into a corporate environment.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Standardisation is Coming:&lt;/strong&gt; The emphasis on approved clients, security policies, and documented processes suggests that organisations are moving to standardise these workflows, moving them out of the realm of personal productivity hacks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Testing Remains a Human Domain:&lt;/strong&gt; The guide’s explicit warning about the poor quality of AI-generated tests is a critical takeaway. It confirms that while AIs can write functional code, they lack the deep understanding of business logic and edge cases required for creating meaningful validation. The responsibility for test case design remains firmly with the developer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Context Management is an Engineering Problem:&lt;/strong&gt; The performance degradation mentioned in the guide is a practical manifestation of context window limitations. This implies that managing conversation history and tool configuration is not just a prompting issue but an engineering challenge that requires deliberate process management.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-path-forward-a-combined-playbook&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/revisiting-vibe-coding-an-analysis-of-awss-practical-guide/#the-path-forward-a-combined-playbook&quot;&gt;The Path Forward: A Combined Playbook&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The individual developer, as explored in my earlier posts, pioneers the creative techniques and architectural mindset. The enterprise then codifies these techniques into robust, scalable, and secure processes.&lt;/p&gt;&lt;p&gt;The path forward for every developer is to build a hybrid approach: maintain the architectural mindset of a solo innovator while adopting the discipline of structured processes and tooling where appropriate. We are collectively writing the playbook for this new phase of software development, learning from both experimentation and enterprise-level implementation. The goal is a future where human creativity directs AI execution with clarity and purpose.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>You Should Delete Tests</title>
      <link href="https://allarddewinter.net/blog/you-should-delete-tests/" />
      <updated>2025-09-16T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/you-should-delete-tests/</id>
      <content type="html">
				&lt;p&gt;I use automated tests extensively when working on Python code. I have often found it a challenge to strike the right balance: creating tests with enough detail to confirm functionality without making them so brittle that a minor code change requires rewriting the entire suite. This tension is why I found the perspective in André Arko’s article, &lt;a href=&quot;https://andre.arko.net/2025/06/30/you-should-delete-tests/&quot; rel=&quot;noopener&quot;&gt;You should delete tests&lt;/a&gt;, to be a practical reminder about the purpose of a test suite.&lt;/p&gt;&lt;p&gt;André argues that the fundamental reason for writing automated tests is to increase human confidence that a change will succeed. We run tests to be confident when we open a pull request, merge to main, and deploy to production.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The core purpose of a test suite is to increase confidence. Therefore, a test should be removed any time it begins to decrease that confidence.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If we accept this premise, then the decision to delete a test becomes clear. André identifies several scenarios where tests actively harm confidence and should be removed.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flaky Tests:&lt;/strong&gt; These are tests that fail intermittently and without a clear reason, like after fixing a typo. They train developers to ignore failures, which is a dangerous habit. As André puts it: &lt;code&gt;&quot;Oh, it’s failing because of that flaky test, it’s actually fine” is something I have heard more times than I can count, even when the code is broken and the tests are really failing.&lt;/code&gt; A test that encourages this behaviour is worse than no test at all.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-Maintenance Tests:&lt;/strong&gt; When a one-line code change requires updating 150 tests, the test suite is creating friction instead of confidence. This often indicates that the tests are too tightly coupled to the implementation details rather than the behaviour. Such a high volume of failures for a small change does not make a developer more confident; it just creates unnecessary work.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unrun Tests:&lt;/strong&gt; Sometimes, to speed up a slow test suite, teams start skipping tests that “always pass”. A test that is never run provides a false sense of security, which is another form of flakiness. It harms confidence by creating a mismatch between perceived and actual test coverage.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Irrelevant Tests:&lt;/strong&gt; When business requirements change, the tests for the old behaviour become obsolete. Spending time updating these tests to align with new logic is wasted effort. The correct action is to delete the old tests and write new ones that directly validate the new behaviour.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The main takeaway is that a test suite is a living tool, not a sacred artifact. Maintaining it requires not just addition but also subtraction. Unproductive overhead is a significant cost, and curating a test suite by deleting tests that no longer build confidence is a necessary and healthy part of software development.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A Practical Guide to Coding with LLMs: Dos and Don&#39;ts</title>
      <link href="https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/" />
      <updated>2025-09-15T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/</id>
      <content type="html">
				&lt;p&gt;The way we build software is changing. Instead of writing code line-by-line, developers are increasingly orchestrating AI assistants to generate, refactor, and even debug entire features. As I have explored in previous posts, this shift requires a deliberate and structured approach to be effective.&lt;/p&gt;&lt;p&gt;Drawing from the experiences of developers like Matt Webb, Zach Wills, and Taylor, we can identify a set of principles for working with tools like Claude Code. These principles distinguish between productive, structured collaboration and chaotic, unproductive “vibe coding”.&lt;/p&gt;&lt;h3 id=&quot;the-two-faces-of-vibe-coding&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#the-two-faces-of-vibe-coding&quot;&gt;The Two Faces of “Vibe Coding”&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;According to Matt Webb’s reflections in &lt;a href=&quot;https://interconnected.org/home/2025/09/12/claude&quot; rel=&quot;noopener&quot;&gt;What I think about when I think about Claude Code&lt;/a&gt;, working with an AI agent introduces a new, slower rhythm to development. It involves a loop of composing a thoughtful prompt and then waiting. This contemplative pace has an unexpected benefit: it helps avoid what Linda Stone called “email apnea,” a tendency to hold one’s breath and induce stress during focused screen work.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;With Claude Code, I don’t have that metronome shortening my breath. I do not subject myself to “code apnea.” So it becomes calm, contemplative.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This calm state, however, is only possible when the interaction is structured correctly. If problems are too large or vague, you fall into the trap of “vibe coding”—a process that produces code which may function but is often tangled and impossible for humans to edit.&lt;/p&gt;&lt;p&gt;However, as I discussed in “&lt;a href=&quot;https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/&quot;&gt;The last hurrah of human coding&lt;/a&gt;”, this term has another meaning. For senior engineers, “vibe coding” can be a superpower, but only when it happens within a highly structured environment. The key is to give the agent “large, but not too large, extremely well defined problems.” As I noted previously, the path to successfully using these tools is through structure, not chaos.&lt;/p&gt;&lt;h3 id=&quot;a-framework-for-effective-ai-collaboration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#a-framework-for-effective-ai-collaboration&quot;&gt;A Framework for Effective AI Collaboration&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To move &lt;a href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/&quot;&gt;beyond the vibe and toward structured development&lt;/a&gt;, we need a systematic approach. The central principle, articulated in a detailed case study by Taylor on building a tool called &lt;a href=&quot;https://taylor.town/diggit-000&quot; rel=&quot;noopener&quot;&gt;&lt;em&gt;diggit.dev&lt;/em&gt;&lt;/a&gt;, is that &lt;strong&gt;the human must be the architect.&lt;/strong&gt; LLMs are excellent at executing well-defined tasks, but they are not designers.&lt;/p&gt;&lt;p&gt;Taylor proposes a phased, human-led workflow:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Viability:&lt;/strong&gt; Get the most basic version of the application running, even if it is broken.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Observability:&lt;/strong&gt; Make the application “loud” by adding comprehensive error handling and progress reporting. This is critical for debugging what the LLM produces.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Features:&lt;/strong&gt; Add core functionality through a series of small, focused tasks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Styling:&lt;/strong&gt; Refine the user interface.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This process relies on giving the LLM atomic prompts for single, clear goals. Before writing any prompts, the human does the heavy lifting of creating plaintext mockups, defining the data model, and preparing copious notes. This “first swing” puts the LLM in a position to succeed.&lt;/p&gt;&lt;h3 id=&quot;scaling-up-with-an-agentic-workflow&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#scaling-up-with-an-agentic-workflow&quot;&gt;Scaling Up with an Agentic Workflow&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For more complex projects, you can extend this structured approach by using multiple, specialist AI agents. In his post on &lt;a href=&quot;https://zachwills.net/how-to-use-claude-code-subagents-to-parallelize-development/&quot; rel=&quot;noopener&quot;&gt;using sub-agents to parallelize development&lt;/a&gt;, Zach Wills outlines a sophisticated workflow built on three principles:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Parallel Execution:&lt;/strong&gt; Assign independent tasks (e.g., backend API, frontend component, QA tests) to different specialist agents to run concurrently.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Sequential Handoffs:&lt;/strong&gt; Create an automated assembly line where the output of one agent (e.g., a product-manager agent defining a feature) becomes the input for the next (e.g., an engineer agent implementing it).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Context Isolation:&lt;/strong&gt; Give each specialist agent its own dedicated context window. This prevents quality degradation, as each agent can focus entirely on its task without losing crucial details.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This method transforms the developer’s role into that of an orchestrator, managing a team of AI agents to build software at a much faster pace. However, this powerful approach is not without its practical trade-offs, particularly regarding cost. As usage is typically priced per token—for both the input you provide and the output you receive—these advanced workflows can become expensive. Chaining multiple agents, especially in iterative loops, will increase your token usage significantly. This creates a direct trade-off: you gain development velocity and higher output at the expense of higher operational costs. Managing these “token economics” becomes a crucial part of orchestrating AI workflows at scale.&lt;/p&gt;&lt;h3 id=&quot;summary-of-dos-and-donts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#summary-of-dos-and-donts&quot;&gt;Summary of Dos and Don’ts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To make these concepts practical, here is a summary of best practices for coding with LLMs.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Do&lt;/th&gt;&lt;th&gt;Don’t&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Be the architect.&lt;/strong&gt; Spend time on high-level design, data models, and planning before prompting.&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Outsource architectural decisions.&lt;/strong&gt; Do not expect the LLM to design a coherent system from a vague idea.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Use atomic, well-defined prompts.&lt;/strong&gt; Give the agent one clear, focused task at a time.&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Engage in chaotic “vibe coding.”&lt;/strong&gt; Avoid giving prompts that are too large or ill-defined, as this leads to write-only code.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Codify conventions in a “rulebook”.&lt;/strong&gt; Use files like &lt;code&gt;.cursor/rules&lt;/code&gt; to provide persistent context and constraints.&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Let the AI touch “sacred boundaries.”&lt;/strong&gt; Forbid the AI from modifying tests, database migrations, or security-critical code.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Make it observable early.&lt;/strong&gt; Add logging and error handling so you can see what the agent is doing.&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Run the agent without supervision.&lt;/strong&gt; Avoid using modes like &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;. Your role is approval and course correction.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Choose LLM-friendly tools.&lt;/strong&gt; Select languages and frameworks with clear syntax and descriptive errors (e.g., Elm).&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Ignore the agent’s limitations and costs.&lt;/strong&gt; Be aware of context windows, non-determinism, and the financial cost of token usage (both input and output).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Effectively using AI in development is less about mastering a specific tool and more about adopting a new mindset. The developer’s primary skill is shifting from direct implementation to system design and process orchestration. As I concluded in a previous post, this changes the very nature of senior engineering.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Your role as a senior engineer has fundamentally shifted. You’re no longer just writing code—you’re curating knowledge, setting boundaries, and teaching both humans and AI systems how to work effectively.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;By providing structure, clarity, and thoughtful direction, you can transform an LLM from a simple autocomplete tool into a powerful collaborator.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;As described by Matt Webb, Linda Stone observed that 80% of people experienced compromised breathing while working on email, a phenomenon she termed “email apnea.” This shallow breathing or breath-holding contributes to stress. &lt;a href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-coding-with-llms-dos-and-donts/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Is AI the Next Microprocessor or the Next Shipping Container?</title>
      <link href="https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/" />
      <updated>2025-09-14T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/</id>
      <content type="html">
				&lt;p&gt;For anyone investing in or betting on the next big thing, the central question is where generative AI sits in the history of technological revolutions. Will it create a new wave of wealth for startups and their backers, or will its value be captured elsewhere? In his article, “&lt;a href=&quot;https://joincolossus.com/article/ai-will-not-make-you-rich/&quot; rel=&quot;noopener&quot;&gt;AI Will Not Make You Rich&lt;/a&gt;,” Jerry Neumann presents a compelling framework for this analysis, arguing that AI more closely resembles the economic impact of shipping containerisation than the microprocessor.&lt;/p&gt;&lt;p&gt;This framework, based on the work of economist Carlota Perez, helps analyse how technological revolutions create and distribute value. It suggests that where we are in a broader technological cycle is the primary determinant of who wins.&lt;/p&gt;&lt;h3 id=&quot;the-four-phases-of-a-technological-wave&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/#the-four-phases-of-a-technological-wave&quot;&gt;The Four Phases of a Technological Wave&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Carlota identifies four phases in every major technological revolution. These cycles describe a predictable human and financial response to new technology.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Irruption:&lt;/strong&gt; The initial period of experimentation and uncertainty, where a new technology emerges. Investment is risky and driven by true believers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Frenzy:&lt;/strong&gt; A period of speculative mania where capital floods into the new paradigm, leading to a bubble as hype outpaces reality.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Synergy:&lt;/strong&gt; After the bubble pops, a “golden age” begins. The technology is mature enough for practical application, and companies focus on building real businesses.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Maturity:&lt;/strong&gt; The technology becomes fully integrated. Growth slows, markets consolidate, and innovation becomes incremental, focused on extending the current paradigm.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;two-models-of-innovation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/#two-models-of-innovation&quot;&gt;Two Models of Innovation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Jerry contrasts two historical innovations to illustrate how these phases play out. The key difference is the element of surprise.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It’s the element of surprise that should strike us most forcefully when we compare the early days of the computer revolution to today. No one took note of personal computers in the 1970s. In 2025, AI is all we seem to talk about.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This lack of surprise shapes the entire competitive landscape.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Feature&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;The Microprocessor (Irruption Phase)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Shipping Containerisation (Maturity Phase)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Initial Perception&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A niche solution; its potential was a surprise.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The benefits were obvious to everyone from the start.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Competition&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Incumbents were slow to react, creating a moat for startups.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Incumbents and competitors reacted immediately, leading to intense competition.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Innovation Style&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Permissionless and distributed tinkering by enthusiasts.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Centralised and capital-intensive; required huge investment.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Value Capture&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A new class of entrepreneurs and investors became wealthy.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Value flowed to customers and a few early pioneers.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Containerisation arrived late in its technological wave. Its benefits were so clear that it sparked an immediate competitive free-for-all, squeezing profits. The real winners were downstream businesses that used cheap, reliable logistics to reinvent their own industries.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The business ended up being dominated primarily by the previous incumbents, and the margins went to the companies shipping goods, not the ones they shipped through.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;my-analysis-ai-is-not-a-monolith&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/#my-analysis-ai-is-not-a-monolith&quot;&gt;My Analysis: AI Is Not a Monolith&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Jerry’s argument that AI is a maturity-phase innovation of the ICT wave is convincing. It is an extension of a 60-year quest for machine intelligence, built on existing infrastructure. Every major company has an AI strategy.&lt;/p&gt;&lt;p&gt;To understand where value might accrue, we must break down the AI stack:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Foundation Models:&lt;/strong&gt; These are the “container ships” of our era. They are enormously expensive to build and operate, requiring vast capital for chips and data centres. This part of the market fits the containerisation analogy perfectly. Competition is fierce among the large, well-funded incumbents behind models like OpenAI’s GPT series, Google’s Gemini, and Anthropic’s Claude.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Commoditisation Engine:&lt;/strong&gt; The containerisation analogy is strengthened by the rise of highly efficient, semi-open-source models, particularly from Chinese companies like Alibaba (Qwen) and others. These models are often cheaper to run and focus on software optimisation, triggering price wars and accelerating the commoditisation of model performance. This directly mirrors the rate wars in container shipping that squeezed profits and suggests high margins will be difficult to sustain at the model layer.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-Native Applications:&lt;/strong&gt; These are companies building products directly on top of foundation models. As Jerry argues, they risk being squeezed by the model providers through pricing or vertical integration. If an application becomes successful, the underlying model provider has every incentive to capture that value by raising prices or launching a competing feature.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-Enabled Businesses (Downstream):&lt;/strong&gt; This is where the “IKEA and Walmart” opportunities lie. These are not tech companies, but businesses in sectors like law, finance, and healthcare that use AI to fundamentally reduce costs and improve services. The value is not in building the AI but in using it to create a new business model. A firm that uses AI to offer legal services at a fraction of the traditional cost is a modern equivalent of IKEA using containerisation to sell flat-pack furniture globally.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The lesson from Jerry’s analysis is clear: the most durable fortunes will likely be made not by building the next model, but by being the first to figure out how to use it to transform an old industry.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The main wildcard in this analysis is the open-source movement. If cheap, powerful, and truly open models become widely available, they could enable the kind of permissionless tinkering that characterised the microprocessor era. This could potentially trigger a new “Irruption” phase, but for now, the market is dominated by the capital-intensive, centralised approach. &lt;a href=&quot;https://allarddewinter.net/blog/is-ai-the-next-microprocessor-or-the-next-shipping-container/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Working with AI Wizards and the Need for Explainability</title>
      <link href="https://allarddewinter.net/blog/working-with-ai-wizards-and-the-need-for-explainability/" />
      <updated>2025-09-13T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/working-with-ai-wizards-and-the-need-for-explainability/</id>
      <content type="html">
				&lt;p&gt;In a recent post, &lt;a href=&quot;https://www.oneusefulthing.org/p/on-working-with-wizards&quot; rel=&quot;noopener&quot;&gt;Ethan Mollick describes a fundamental shift in how we interact with AI&lt;/a&gt;. He argues we are moving away from a “co-intelligence” model, where we act as collaborators guiding an AI intern, towards working with a “wizard.” In this new model, we provide a vague request and receive a sophisticated, often impressive, output with little to no insight into the process.&lt;/p&gt;&lt;p&gt;Ethan illustrates this with several powerful examples:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;NotebookLM:&lt;/strong&gt; Generated a coherent video summary of his book and articles, but offered no explanation for how it selected its key points or structured the narrative.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;GPT-5 Pro:&lt;/strong&gt; Analysed his academic paper, ran its own code to verify results, and found a subtle error that had gone unnoticed for years. The output was remarkable, but the method was a complete black box.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Claude 4.1 Opus:&lt;/strong&gt; Transformed a multi-tab Excel spreadsheet for a new business case, preserving the original lesson’s goal. It reported its steps, but these were summaries, not a verifiable log of its actions.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This leads to what Ethan calls the “wizard problem.” The results are good, sometimes exceptionally so, but we become a passive audience, unable to verify the work without significant effort.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The paradox of working with AI wizards is that competence and opacity rise together. We need these tools most for the tasks where we’re least able to verify them.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This observation is accurate. Interacting with these advanced models can feel like outsourcing our thinking, which might make us lazy. But the more important question is whether this opacity is an acceptable trade-off. For casual tasks, perhaps. For professional and scientific work, it is a significant barrier.&lt;/p&gt;&lt;p&gt;In scientific research, the process is as important as the result. If an AI wizard finds a novel insight in a dataset, its discovery is of limited value if it cannot explain the steps it took to get there. We need to understand the intermediate steps to trust the conclusion.&lt;/p&gt;&lt;p&gt;This is not a new problem. I have seen the same requirement in business settings for machine learning models. Stakeholders are rightly hesitant to trust a model’s prediction—whether for credit risk, sales forecasting, or customer churn—unless they can understand the factors and logic driving its conclusion. The same will be true for generative AI.&lt;/p&gt;&lt;p&gt;The way forward is to build explainability into the core of these models.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/working-with-ai-wizards-and-the-need-for-explainability/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; The ability for an AI to provide a step-by-step, verifiable account of its process will be critical for adoption in high-stakes fields. There is a clear business opportunity for companies that can move beyond the black box and deliver transparent, trustworthy AI systems.&lt;/p&gt;&lt;p&gt;Ethan concludes that we must develop a new literacy for working with wizards: learn when to use them, become better judges of their output, and embrace a “provisional trust.” While this is practical advice for today, the real goal should be to demand more from our tools. We need wizards that are willing to show us their spellbooks.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I have a feeling that some open-source models are already making progress in this area, though I have not verified this completely. Their architecture seems to lend itself better to exposing the internal state and reasoning process. &lt;a href=&quot;https://allarddewinter.net/blog/working-with-ai-wizards-and-the-need-for-explainability/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Contrasting Memory Philosophies: Claude&#39;s Explicit Tools vs. ChatGPT&#39;s Automatic Profiles</title>
      <link href="https://allarddewinter.net/blog/contrasting-memory-philosophies-claudes-explicit-tools-vs-chatgpts-automatic-profiles/" />
      <updated>2025-09-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/contrasting-memory-philosophies-claudes-explicit-tools-vs-chatgpts-automatic-profiles/</id>
      <content type="html">
				&lt;p&gt;Recent posts by &lt;a href=&quot;https://www.shloked.com/writing/claude-memory&quot; rel=&quot;noopener&quot;&gt;Shlok Khemani&lt;/a&gt; and &lt;a href=&quot;https://simonwillison.net/2025/Sep/12/claude-memory/&quot; rel=&quot;noopener&quot;&gt;Simon Willison&lt;/a&gt; highlight a fundamental difference in how leading AI assistants handle memory. Their analyses reveal two distinct product philosophies, with each company building a system that reflects its target audience.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;ChatGPT’s memory is automatic and profile-based, designed for seamless consumer use. Claude’s is explicit and tool-based, offering transparency and control for technical users.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Shlok Khemani’s investigation shows that Claude starts every conversation with a blank slate. Memory is only activated when explicitly invoked, at which point it uses visible tools (&lt;code&gt;conversation_search&lt;/code&gt; and &lt;code&gt;recent_chats&lt;/code&gt;) to search through raw conversation history. In contrast, ChatGPT automatically loads an AI-generated summary of past interactions and user preferences into every new chat, aiming for a “magical” and personalised experience.&lt;/p&gt;&lt;p&gt;This table summarises the core differences in their personal-tier offerings:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;ChatGPT (Implicit Memory)&lt;/th&gt;&lt;th&gt;Claude (Explicit Memory)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Activation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automatic, always-on&lt;/td&gt;&lt;td&gt;Explicit, invoked by user or model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Data Source&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;AI-generated summaries &amp; user profiles&lt;/td&gt;&lt;td&gt;Raw conversation history&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Transparency&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Opaque; context is pre-loaded&lt;/td&gt;&lt;td&gt;High; memory access is a visible tool call&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;User Control&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Limited; memory is managed by the system&lt;/td&gt;&lt;td&gt;High; user decides when to invoke memory&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Target User&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;General consumer&lt;/td&gt;&lt;td&gt;Technical professionals, developers&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Simon Willison praises Claude’s approach for its transparency. He notes, “I like to understand as much as possible about what’s going into my context so I can better anticipate how it is likely to affect the model.” The visible tool calls in Claude provide exactly this clarity.&lt;/p&gt;&lt;p&gt;However, Simon also points out a reassuring detail from Shlok’s research on ChatGPT: its memory system only surfaces the user’s messages, not the assistant’s responses. This mitigates the risk of carrying over flawed logic from a previous session into a new chat.&lt;/p&gt;&lt;p&gt;I find Claude’s explicit, tool-based system more aligned with my own workflow. The control it provides over when and how memory is used feels more intuitive. It allows for a “clean slate” by default, which is valuable for focused work, while still making it straightforward to pull in relevant history when needed. This transparency is a significant advantage for managing context and aligns with a preference for privacy.&lt;/p&gt;&lt;p&gt;It is worth noting that this distinction is becoming less rigid. As both authors point out, Anthropic has introduced a new, ChatGPT-like memory feature for its Team and Enterprise accounts. This version creates an editable summary of interactions, offering a hybrid approach that combines automatic context with user oversight.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A Structured Methodology for Disciplined AI Software Development</title>
      <link href="https://allarddewinter.net/blog/a-structured-methodology-for-disciplined-ai-software-development/" />
      <updated>2025-09-11T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-structured-methodology-for-disciplined-ai-software-development/</id>
      <content type="html">
				&lt;p&gt;Collaborating with Large Language Models (LLMs) on software development can be highly effective, but it often introduces problems like architectural drift and context dilution. The &lt;a href=&quot;https://github.com/Varietyz/Disciplined-AI-Software-Development&quot; rel=&quot;noopener&quot;&gt;Disciplined AI Software Development methodology&lt;/a&gt; by Jay Baleine offers a structured approach to mitigate these issues by imposing systematic constraints on the AI-human interaction.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The methodology addresses common issues like code bloat, architectural drift, and context dilution through systematic constraints and validation checkpoints.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The core problem it identifies is that AI systems operate on a simple “Question → Answer” pattern. When given broad, multi-faceted requests, they tend to produce code that lacks structure, contains repetition, and drifts from the intended architecture over time.&lt;/p&gt;&lt;h3 id=&quot;the-four-stages-of-the-methodology&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-structured-methodology-for-disciplined-ai-software-development/#the-four-stages-of-the-methodology&quot;&gt;The Four Stages of the Methodology&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The approach is broken down into four distinct stages, designed to build upon each other with clear validation points.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;AI Configuration:&lt;/strong&gt; The process begins by providing the AI with custom instructions (e.g., &lt;code&gt;AI-PREFERENCES.XML&lt;/code&gt;) that establish behavioural constraints. This includes instructing the AI to flag any uncertainty, ensuring it does not “hallucinate” solutions when it lacks sufficient information.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Collaborative Planning:&lt;/strong&gt; The developer and AI work together to define the project’s scope, components, dependencies, and phases. This structured planning session results in a development plan with clear modular boundaries and measurable checkpoints.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Systematic Implementation:&lt;/strong&gt; Development proceeds phase by phase, with each request focused on a single, specific component. A key constraint is a strict file size limit (e.g., ≤150 lines) to maintain small context windows, enforce focused implementation, and simplify debugging.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data-Driven Iteration:&lt;/strong&gt; A benchmarking suite is built first (Phase 0). Performance data from this suite is fed back to the AI, ensuring that optimisation decisions are based on empirical measurements rather than assumptions.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;architectural-guardrails-for-ai-collaboration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-structured-methodology-for-disciplined-ai-software-development/#architectural-guardrails-for-ai-collaboration&quot;&gt;Architectural Guardrails for AI Collaboration&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The principles outlined in this methodology can be viewed as tactical architectural guardrails, similar in spirit to the high-level principles found in frameworks like TOGAF.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/a-structured-methodology-for-disciplined-ai-software-development/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;Where TOGAF provides a strategic framework for enterprise architecture, these rules provide a micro-framework for AI code generation. Constraints like the 150-line file limit and single-component implementation are not arbitrary; they enforce modularity and prevent the AI from making sprawling, unmanaged changes. This approach transforms the AI from an unpredictable partner into a disciplined builder that adheres to a pre-defined architectural vision.&lt;/p&gt;&lt;p&gt;The repository includes practical tools to support this workflow, such as example configuration files and a Python script (&lt;code&gt;project_extract.py&lt;/code&gt;) for generating structured snapshots of the codebase to share with the AI.&lt;/p&gt;&lt;p&gt;By enforcing a systematic process, the developer’s role shifts from constantly debugging inconsistent output to strategically planning the work and validating the results. It is a practical framework for turning an AI into a more reliable and predictable development partner.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The Open Group Architecture Framework (TOGAF) is a framework for enterprise architecture that provides an approach for designing, planning, implementing, and governing an enterprise information technology architecture. &lt;a href=&quot;https://allarddewinter.net/blog/a-structured-methodology-for-disciplined-ai-software-development/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>The Tension Between Legibility and Efficiency in Software Companies</title>
      <link href="https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/" />
      <updated>2025-09-10T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/</id>
      <content type="html">
				&lt;p&gt;In his article “&lt;a href=&quot;https://www.seangoedecke.com/seeing-like-a-software-company&quot; rel=&quot;noopener&quot;&gt;Seeing like a software company&lt;/a&gt;”, Sean Goedecke applies the ideas of James C. Scott’s book &lt;em&gt;Seeing Like a State&lt;/em&gt; to the world of large technology companies. The core concept is “legibility”—the drive by a central authority to make a complex system understandable, measurable, and controllable.&lt;/p&gt;&lt;p&gt;This often creates a fundamental tension. While legibility provides significant benefits for planning and coordination, it frequently comes at the cost of on-the-ground efficiency and resilience. This model helps explain many seemingly counter-productive behaviours I have observed in large organisations.&lt;/p&gt;&lt;h3 id=&quot;the-core-idea-legibility-vs-illegibility&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/#the-core-idea-legibility-vs-illegibility&quot;&gt;The Core Idea: Legibility vs. Illegibility&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Goedecke summarises Scott’s idea with a simple analogy: 19th-century German scientific forestry. To maximise timber yields, state foresters replaced complex, diverse forests with neat rows of a single, fast-growing tree species.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The Goal (Legibility):&lt;/strong&gt; The new forest was “legible”. An inspector could easily count the trees and predict the yield. This enabled long-term planning, large trade deals, and reduced graft.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Reality (Reduced Efficiency):&lt;/strong&gt; This legible forest was a biological failure. It was vulnerable to a single pest and ultimately produced less wood than the old, “illegible” forest, which had a complex, self-regulating ecosystem.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Even when it became clear that legibility reduced overall productivity, states continued to pursue it because the benefits of control and planning were considered more valuable.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Increasing legibility thus often actually lowers efficiency - but the other benefits are high enough that organizations are typically willing to do so regardless.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In software companies, this translates to a distinction between two types of work:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Legible Work:&lt;/strong&gt; Predictable, estimated, and tracked through systems like Jira and OKRs. It has a clear paper trail and is designed for management oversight.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Illegible Work:&lt;/strong&gt; The informal, untracked work that is often essential. This includes asking for favours, using unwritten tacit knowledge, and leveraging interpersonal relationships to get things done quickly.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Small companies thrive on illegibility and can be highly efficient. Large companies, however, optimise for legibility to manage complexity and secure large enterprise deals, which require long-term commitments and predictable roadmaps.&lt;/p&gt;&lt;h3 id=&quot;the-paradox-of-process-and-the-role-of-togaf&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/#the-paradox-of-process-and-the-role-of-togaf&quot;&gt;The Paradox of Process and the Role of TOGAF&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Large organisations make simplifying, legible assumptions that are practically false but useful for planning: that engineers are interchangeable, that productivity is tied to headcount, and that project estimates are reliable.&lt;/p&gt;&lt;p&gt;Frameworks like The Open Group Architecture Framework (TOGAF) are powerful tools for achieving this legibility. For “business as usual” activities, TOGAF provides a comprehensive structure and acts as a checklist to ensure nothing is forgotten. It helps an organisation arrange itself in a predictable, repeatable manner. This is the positive side of legibility: it creates order and a common language for complex operations.&lt;/p&gt;&lt;p&gt;The downside emerges when such frameworks are applied too rigidly. Their exhaustive processes can stifle the very illegible work—quick favours, rapid pivots, creative problem-solving—that is essential for genuine efficiency. This is how managers can be dismissed for failing to prioritise critical tasks, even when all their processes were well-defined. They become so focused on the legible game of process compliance that they fail to navigate the illegible world where urgent problems are actually solved.&lt;/p&gt;&lt;p&gt;However, a framework like TOGAF is not inherently negative. With some creativity, its principles can be adapted for more ad-hoc work. One could use a “TOGAF-lite” approach within an engineering team, borrowing its structural thinking without adopting the full bureaucratic weight. This represents a mature approach: using tools of legibility selectively, rather than being controlled by them.&lt;/p&gt;&lt;h3 id=&quot;sanctioned-zones-of-illegibility&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/#sanctioned-zones-of-illegibility&quot;&gt;Sanctioned Zones of Illegibility&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When a crisis hits—like an imminent database failure—the formal, multi-step approval process is too slow. Goedecke notes that companies create a clever compromise: “temporary sanctioned zones of illegibility”.&lt;/p&gt;&lt;p&gt;These are often called “tiger teams” or “strike teams” and operate under a different set of rules:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;A team of trusted, hand-picked engineers is assembled.&lt;/li&gt;&lt;li&gt;They are given a loose mandate (e.g., “Fix the urgent problem”).&lt;/li&gt;&lt;li&gt;They are empowered to do whatever is necessary, bypassing normal processes.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This allows the organisation to benefit from high-efficiency, illegible work in a controlled way without abandoning the legible structure it needs for day-to-day operations. It is a formal acknowledgement that the official process is not always fit for purpose.&lt;/p&gt;&lt;p&gt;Even these zones are not immune to the pull of legibility. In my experience, even when a tiger team is formed, managers often want to see a budget approved and funds transferred internally before work can begin.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; The instinct to measure and control remains powerful.&lt;/p&gt;&lt;p&gt;Ultimately, an organisation’s success depends on its ability to balance both worlds. It needs the legible systems for stability and scale, but it must also allow space for the unsanctioned, illegible work that provides resilience and true operational effectiveness.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This adds a layer of formal process back onto an activity designed to escape it, showing the deep-seated organisational preference for legibility. &lt;a href=&quot;https://allarddewinter.net/blog/the-tension-between-legibility-and-efficiency-in-software-companies/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Frameworks as Mental Handrails for Navigating Complexity</title>
      <link href="https://allarddewinter.net/blog/frameworks-as-mental-handrails-for-navigating-complexity/" />
      <updated>2025-09-09T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/frameworks-as-mental-handrails-for-navigating-complexity/</id>
      <content type="html">
				&lt;p&gt;In his article “Frameworks,” published on &lt;a href=&quot;https://open.substack.com/pub/mikefisher/p/frameworks-23e&quot; rel=&quot;noopener&quot;&gt;open.substack.com&lt;/a&gt;, Mike Fisher presents a compelling metaphor: frameworks are “handrails for thinking.” They provide the scaffolding needed to navigate uncertainty and complexity, transforming overwhelming problems into manageable tasks.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The core idea is that frameworks simplify complexity by providing structure, much like a recipe guides a cook or an algebraic simplification clarifies an equation.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This structure is not just for convenience; it is rooted in cognitive science. Fisher explains that frameworks help by:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Reducing Cognitive Load:&lt;/strong&gt; By organising information into clear patterns, frameworks free up our limited working memory. This allows us to allocate mental energy to higher-order tasks like creativity and problem-solving, rather than managing basic complexity.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Guiding Through Uncertainty:&lt;/strong&gt; Like a handrail on a dark staircase, a framework offers stability and a clear path forward when the environment is ambiguous. It reduces the fear of missteps and builds confidence.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Mitigating Cognitive Biases:&lt;/strong&gt; Structured methods like SWOT or the Eisenhower Matrix force a deliberate evaluation of multiple perspectives, acting as a check against common biases like confirmation bias or overconfidence.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;However, Fisher wisely cautions against rigidity. Over-reliance on a framework can stifle creativity and lead to oversimplification. The key is to use them as a starting point—to adapt, question, and even build your own.&lt;/p&gt;&lt;h3 id=&quot;reflection-from-a-systems-perspective&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/frameworks-as-mental-handrails-for-navigating-complexity/#reflection-from-a-systems-perspective&quot;&gt;Reflection from a Systems Perspective&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;As a practitioner of TOGAF and Systems Engineering, this perspective is foundational. These disciplines are, at their core, the application of structured frameworks to manage immense complexity.&lt;/p&gt;&lt;p&gt;TOGAF’s &lt;a href=&quot;https://togaf.visual-paradigm.com/2023/10/10/what-is-architecture-artifacts-in-togaf-adm/&quot; rel=&quot;noopener&quot;&gt;Architecture Development Method (ADM)&lt;/a&gt; is a perfect example of a “handrail.” It breaks down the monumental task of designing an enterprise architecture into distinct, manageable phases. This reduces the cognitive load on architects and provides a common language for stakeholders, ensuring a project moves forward with clarity. Similarly, the &lt;a href=&quot;https://reqi.io/articles/the-power-of-the-system-engineering-v-model&quot; rel=&quot;noopener&quot;&gt;V-model&lt;/a&gt; in Systems Engineering provides a clear framework for development and validation, ensuring that what is built aligns with what was required.&lt;/p&gt;&lt;p&gt;Beyond their direct application in problem-solving, frameworks are invaluable communication tools. They help in finding the right level of detail for a specific audience, ensuring that complex information is conveyed effectively. When frameworks are used well, they empower stakeholders to ask more structured and relevant questions, leading to more focused discussions and better-informed decisions. This steering of the discussion towards productive outcomes is a critical, often overlooked, benefit of employing robust frameworks.&lt;/p&gt;&lt;p&gt;These frameworks are not rigid rulebooks. The most effective architects and engineers know how to tailor them. They adapt the ADM to their organisation’s specific needs or modify the V-model for a unique project context. This aligns with Fisher’s final point: the goal is not blind adherence but thoughtful engagement. Frameworks are the mental infrastructure that enables us to build complex systems, but their real usefulness is realised when we adapt them to the terrain.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Where&#39;s the Shovelware? The AI Coding Claims Conundrum</title>
      <link href="https://allarddewinter.net/blog/wheres-the-shovelware-the-ai-coding-claims-conundrum/" />
      <updated>2025-09-08T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/wheres-the-shovelware-the-ai-coding-claims-conundrum/</id>
      <content type="html">
				&lt;p&gt;In recent years, AI coding tools like GitHub Copilot, Claude Code, and Cursor have promised extraordinary productivity gains for developers. These tools claim to make coding faster, easier, and more efficient, with taglines like “Built to make you extraordinarily productive” and “Build Better Software Faster.” However, despite these bold claims and widespread adoption, there is a noticeable lack of evidence that these tools are actually leading to a significant increase in software output.&lt;/p&gt;&lt;p&gt;In his article &lt;a href=&quot;https://substack.com/home/post/p-172538377&quot; rel=&quot;noopener&quot;&gt;“Where’s the Shovelware? Why AI Coding Claims Don’t Add Up”&lt;/a&gt;, Mike Judge argues that the AI coding revolution is more hype than substance. He points out that if these tools were truly making developers as productive as claimed, we should be seeing a flood of new software—apps, games, websites, and more. Yet, the data shows no such surge. Charts tracking new software releases across various sectors remain flat, with no indication of the exponential growth one would expect if AI coding tools were living up to their promises.&lt;/p&gt;&lt;p&gt;Judge’s argument is compelling. If AI coding tools were genuinely making developers 10x more productive, as some claim, the world would be drowning in shovelware. The fact that this isn’t happening suggests that these tools may not be as transformative as advertised. This disconnect between claims and reality has serious implications for the tech industry, as companies are making decisions based on the assumption that AI coding tools are dramatically increasing productivity.&lt;/p&gt;&lt;h3 id=&quot;key-takeaways-from-mike-judges-analysis&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/wheres-the-shovelware-the-ai-coding-claims-conundrum/#key-takeaways-from-mike-judges-analysis&quot;&gt;Key Takeaways from Mike Judge’s Analysis&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Productivity Claims vs. Reality:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;AI coding tools claim to make developers significantly more productive, with some developers even claiming a 10x increase in output.&lt;/li&gt;&lt;li&gt;However, studies like the METR study show that developers often overestimate their productivity gains from AI tools. In some cases, AI tools may actually slow developers down.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lack of Shovelware:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If AI coding tools were as effective as claimed, there would be a noticeable increase in the number of new software releases.&lt;/li&gt;&lt;li&gt;Data from sources like Statista, Verisign, and SteamDB show no significant increase in new software releases post-2022/2023, despite widespread AI tool adoption.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Impact on Developers:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The pressure to adopt AI coding tools is leading to job insecurity, with developers feeling compelled to use these tools even if they don’t find them helpful.&lt;/li&gt;&lt;li&gt;The focus on AI tools may be distracting from other important aspects of software development, such as code quality and continuous improvement.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;personal-reflections-on-ai-coding-tools&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/wheres-the-shovelware-the-ai-coding-claims-conundrum/#personal-reflections-on-ai-coding-tools&quot;&gt;Personal Reflections on AI Coding Tools&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While AI coding tools haven’t turned me into a 10x developer, they have given me the confidence to take on more complex coding tasks. As Simon Willison notes, only a small portion of a programmer’s time is spent on hands-on coding, which may explain why we’re not seeing a flood of new software. AI tools can speed up the coding process, but they don’t address the other aspects of software development, like planning, testing, and maintenance.&lt;/p&gt;&lt;p&gt;That said, the lack of a noticeable increase in software output is concerning. It suggests that the benefits of AI coding tools may be overstated, and that the industry’s focus on these tools could be misplaced. As Judge argues, developers should trust their gut and stick with what works for them, rather than feeling pressured to adopt tools that may not actually improve their productivity.&lt;/p&gt;&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/wheres-the-shovelware-the-ai-coding-claims-conundrum/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The AI coding revolution may not be living up to its promises, but that doesn’t mean these tools are useless. They can still be valuable for certain tasks and for certain developers. However, the industry should approach these tools with a healthy dose of skepticism and focus on objective measures of productivity, rather than hype and bold claims.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Building Reliable AI Agents: Notes on Evaluation and Contracts</title>
      <link href="https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/" />
      <updated>2025-09-06T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/</id>
      <content type="html">
				&lt;p&gt;As AI agents are integrated into business operations, ensuring their reliability is essential. A new book, &lt;em&gt;Agentic Design Patterns&lt;/em&gt; by Antonio Gulli, offers a practical guide for building robust agentic systems. You can find it on &lt;a href=&quot;https://www.amazon.com/Agentic-Design-Patterns-Hands-Intelligent/dp/3032014018/&quot; rel=&quot;noopener&quot;&gt;Amazon&lt;/a&gt; or read the &lt;a href=&quot;https://docs.google.com/document/d/1rsaK53T3Lg5KoGwvf8ukOUvbELRtH-V0LnOIFDxBryE&quot; rel=&quot;noopener&quot;&gt;pre-print version on Google Docs&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The foreword by Marco Argenti, CIO of Goldman Sachs, clearly states the problem:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The hard truth is that you cannot simply overlay these powerful new tools onto messy, inconsistent systems and expect good results. Messy systems plus agents are a recipe for disaster.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;So, how do we build and monitor agents to be dependable? The book’s chapter on “Evaluation and Monitoring” provides a clear framework.&lt;/p&gt;&lt;h3 id=&quot;how-to-evaluate-agents&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/#how-to-evaluate-agents&quot;&gt;How to Evaluate Agents&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Traditional software testing is not enough for probabilistic systems like AI agents. We need continuous evaluation. Key techniques include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Response Assessment:&lt;/strong&gt; Check if the agent’s output is correct using methods that understand meaning, not just exact text matches.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Performance Monitoring:&lt;/strong&gt; Track metrics like response speed and resource consumption to ensure the agent runs efficiently.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Qualitative Assessment:&lt;/strong&gt; Use another AI as a “judge” (LLM-as-a-Judge) to evaluate subjective qualities like helpfulness based on a clear rubric.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Trajectory Analysis:&lt;/strong&gt; Review the sequence of steps an agent took to understand its reasoning process and spot inefficiencies.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-contractor-model-for-reliability&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/#the-contractor-model-for-reliability&quot;&gt;The ‘Contractor’ Model for Reliability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To achieve the reliability needed for business-critical tasks, the book proposes evolving from simple agents to “contractors.”&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This contractor framework reimagines AI interaction by embedding principles of formal specification, negotiation, and verifiable execution directly into the agent’s core logic.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This model is built on four pillars:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;The Formalised Contract:&lt;/strong&gt; Define the task with a detailed specification, not a vague prompt. This makes the outcome objectively verifiable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dynamic Negotiation:&lt;/strong&gt; The agent can analyse the contract and clarify ambiguities &lt;em&gt;before&lt;/em&gt; starting work, preventing errors from misunderstandings.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Quality-Focused Execution:&lt;/strong&gt; The agent prioritises correctness, operating in a loop of generating, self-validating, and correcting its work until quality standards are met.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Hierarchical Decomposition:&lt;/strong&gt; A primary contractor can break a large task into smaller sub-tasks, creating formal “subcontracts” for other specialised agents.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;conclusion&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/#conclusion&quot;&gt;Conclusion&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Building trust in AI agents requires a shift in approach. By implementing robust evaluation frameworks and adopting the “contractor” model—which relies on formal agreements and verification—we can move from unpredictable tools to reliable systems fit for critical business applications.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The LLM-as-a-Judge approach is powerful but has limitations. Its effectiveness is constrained by the capabilities of the judge model, and it may overlook errors in intermediate reasoning steps if only the final output is assessed. &lt;a href=&quot;https://allarddewinter.net/blog/building-reliable-ai-agents-notes-on-evaluation-and-contracts/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>How Optimising for Short-Term Metrics Causes Long-Term Harm</title>
      <link href="https://allarddewinter.net/blog/how-optimising-for-short-term-metrics-causes-long-term-harm/" />
      <updated>2025-09-05T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/how-optimising-for-short-term-metrics-causes-long-term-harm/</id>
      <content type="html">
				&lt;p&gt;Lucas Pierce’s post, &lt;a href=&quot;https://www.bonnycode.com/posts/short-term-metrics-long-term-harm/&quot; rel=&quot;noopener&quot;&gt;Short-term metrics, long-term harm&lt;/a&gt;, analyses how optimising for short-term metrics leads to negative long-term consequences, even when builders have no malicious intent.&lt;/p&gt;&lt;h3 id=&quot;the-optimisation-engine&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-optimising-for-short-term-metrics-causes-long-term-harm/#the-optimisation-engine&quot;&gt;The Optimisation Engine&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The engine for this is the A/B test, which allows companies to measure a change’s impact on a target metric like ‘time spent’. Instead of debating a feature’s merit, teams can simply test it. As Pierce notes, “It no longer matters why it works, just that you can prove it does work.”&lt;/p&gt;&lt;p&gt;The relentless pursuit of engagement has led to features that exploit human psychology, such as variable reward schedules, social validation, and infinite scroll.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The process requires no more intent than natural selection does. It’s just thousands of little experiments, with the most compulsive features surviving because they satisfy a simple fitness function: does time spent go up?&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Pierce warns that this pattern is repeating with Large Language Models (LLMs). When optimised for engagement, chatbots learn to tell users what they want to hear, not what is accurate. This encourages sycophantic behaviour and creates personalised echo chambers.&lt;/p&gt;&lt;p&gt;This creates a direct trade-off between easily measured metrics and harder-to-quantify user well-being.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Short-Term Metric&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Potential Long-Term Harm&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Increased Time Spent&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Fosters addiction; reduces well-being.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;More Likes &amp; Comments&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Exploits need for social validation; can harm mental health.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Higher Post Frequency&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Encourages performative behaviour over genuine connection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Engaged Chatbot Sessions&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Reinforces biases and echo chambers; promotes sycophantic responses over accuracy.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;systemic-problems-require-systemic-solutions&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-optimising-for-short-term-metrics-causes-long-term-harm/#systemic-problems-require-systemic-solutions&quot;&gt;Systemic Problems Require Systemic Solutions&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These outcomes are not the result of “evil” people but are the consequence of a system that rewards short-term growth. Pierce argues for fixing the system, not blaming individuals, using root-cause analysis like the 5 Whys.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/how-optimising-for-short-term-metrics-causes-long-term-harm/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;The article concludes with a call for professional responsibility. Builders must actively investigate and mitigate the harms of their products, rather than deferring to “consumer choice.”&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you build a product, you are responsible for understanding its long-term impact on users… the burden should be on the builder of the product proving their product isn’t harmful, and mitigating what harm they do discover.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This challenges the industry to implement mechanisms that prevent known patterns of harm from repeating.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The 5 Whys is an interrogative technique used to explore the cause-and-effect relationships underlying a problem. By repeatedly asking “Why?”, teams can move past surface-level symptoms to identify a systemic root cause. You can read more about it at &lt;a href=&quot;https://www.interaction-design.org/literature/topics/5-whys&quot; rel=&quot;noopener&quot;&gt;interaction-design.org&lt;/a&gt;. &lt;a href=&quot;https://allarddewinter.net/blog/how-optimising-for-short-term-metrics-causes-long-term-harm/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Quantifying the Environmental Impact of Large Language Models</title>
      <link href="https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/" />
      <updated>2025-09-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/</id>
      <content type="html">
				&lt;p&gt;As artificial intelligence systems become more integrated into our digital infrastructure, understanding their environmental impact is a growing concern. While discussions often focus on carbon emissions, the full picture includes water consumption and material resource depletion.&lt;/p&gt;&lt;p&gt;In a move towards greater transparency, the French company Mistral AI published &lt;a href=&quot;https://mistral.ai/news/our-contribution-to-a-global-environmental-standard-for-ai&quot; rel=&quot;noopener&quot;&gt;a comprehensive lifecycle analysis (LCA)&lt;/a&gt; of its models. The study, conducted with leading environmental consultancies, is one of the first of its kind and aims to establish a standard for evaluating the environmental footprint of AI.&lt;/p&gt;&lt;h3 id=&quot;key-findings-from-the-mistral-report&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/#key-findings-from-the-mistral-report&quot;&gt;Key Findings from the Mistral Report&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The analysis tracked the environmental impact of Mistral Large 2 (a 123-billion-parameter model) over 18 months, covering everything from data centre construction to model training and inference.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Training Impacts:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Greenhouse Gases:&lt;/strong&gt; 20,400 metric tons of CO₂e.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Water Consumption:&lt;/strong&gt; 281,000 cubic metres.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resource Depletion:&lt;/strong&gt; 660 kg Sb eq.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To put these numbers in context, the training emissions are roughly equal to the annual emissions of 4,400 petrol-powered cars. The water consumed is equivalent to what an average U.S. family of four would use in 500 years, according to an analysis in &lt;a href=&quot;https://info.deeplearning.ai/ai-powered-phones-get-proactive-robot-antelope-joins-herd-llm-environmental-impacts-get-measured-1&quot; rel=&quot;noopener&quot;&gt;Andrew Ng’s The Batch newsletter&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Inference Impacts (per 400-token response):&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Greenhouse Gases:&lt;/strong&gt; 1.14 gCO₂e (similar to watching a 10-second YouTube clip in the U.S.).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Water Consumption:&lt;/strong&gt; 45 millilitres (about 3 tablespoons).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resource Depletion:&lt;/strong&gt; 0.16 mg Sb eq.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The report also breaks down where these impacts originate.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Impact Source&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Greenhouse Gas Emissions&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Water Consumption&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Materials Consumption&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Training &amp; Inference&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;85.5%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;91%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;29%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Server Lifecycle&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;11%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;5%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;61%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Network Traffic&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&amp;lt; 1%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&amp;lt; 1%&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&amp;lt; 1%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;This data shows that while the operational phase (training and inference) dominates emissions and water use, the manufacturing and transport of hardware are the primary drivers of material resource depletion.&lt;/p&gt;&lt;h3 id=&quot;why-this-matters&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/#why-this-matters&quot;&gt;Why This Matters&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Andrew Ng’s newsletter, &lt;em&gt;The Batch&lt;/em&gt;, summarises the core issue well, explaining why such analysis is critical for the future of the technology.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;AI consumes enormous amounts of energy and water, and finding efficient ways to train and run models is critical to ensure that the technology can benefit large numbers of people. Mistral’s approach provides a standardized approach to assessing the environmental impacts.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;a-proposed-standard-and-takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/#a-proposed-standard-and-takeaways&quot;&gt;A Proposed Standard and Takeaways&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The initiative by Mistral AI is a crucial step towards establishing industry-wide transparency. By publishing a methodology and its results, Mistral provides a framework that other companies can adopt, which could enable more direct and objective comparisons between models.&lt;/p&gt;&lt;p&gt;This push for transparency coincides with a trend towards greater model efficiency. Newer models and architectures are often more resource-efficient. While commercial incentives to reduce operational costs are a likely driver for this, the resulting progress in sustainability is a positive outcome.&lt;/p&gt;&lt;p&gt;Mistral’s report proposes that a useful standard should include:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The absolute environmental impacts of training a model.&lt;/li&gt;&lt;li&gt;The marginal impacts of inference.&lt;/li&gt;&lt;li&gt;The ratio of total inference impacts to total lifecycle impacts.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Having a clear, standardised picture of AI’s consumption of resources is essential for managing them effectively as demand continues to rise. This report provides a valuable baseline for the industry to build upon.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Abiotic Resource Depletion (ADP) quantifies the depletion of non-renewable resources like metals and minerals. Values are standardised relative to Antimony (Sb), a scarce resource, providing a uniform unit of &lt;code&gt;kg Sb eq&lt;/code&gt;. &lt;a href=&quot;https://allarddewinter.net/blog/quantifying-the-environmental-impact-of-large-language-models/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>On &#39;Communication is The Job&#39; by Andrew Bosworth</title>
      <link href="https://allarddewinter.net/blog/on-communication-is-the-job-by-andrew-bosworth/" />
      <updated>2025-09-02T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/on-communication-is-the-job-by-andrew-bosworth/</id>
      <content type="html">
				&lt;p&gt;Effective communication is a fundamental skill, and one I am always working to improve. In his post, “&lt;a href=&quot;https://boz.com/articles/communication-is-the-job&quot; rel=&quot;noopener&quot;&gt;Communication is The Job&lt;/a&gt;”, Andrew ‘Boz’ Bosworth&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/on-communication-is-the-job-by-andrew-bosworth/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; provides a clear, actionable framework that supports this goal of continuous development. He argues that communication is not an auxiliary function but the central task for anyone connecting people with information.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Given that we cannot prevent communication, we must embrace it. While perfect communication is impossible, my goal is to get most people most of the information most of the time.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Boz outlines eight practical strategies to improve communication.&lt;/p&gt;&lt;h3 id=&quot;eight-strategies-for-effective-communication&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-communication-is-the-job-by-andrew-bosworth/#eight-strategies-for-effective-communication&quot;&gt;Eight Strategies for Effective Communication&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Layer Your Message:&lt;/strong&gt; Structure your communication so the audience can engage at their desired level of detail. Start with the core theme, then key points, then the full details.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Consider the Second Order Audience:&lt;/strong&gt; Your message will be repeated by others. Frame it in a way that is memorable and can be shared with high fidelity.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Communicate Defensively:&lt;/strong&gt; Before sharing, consider the most cynical interpretation of your message and refine it to minimise the chance of misinterpretation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Repetition is Key:&lt;/strong&gt; Repeat the critical message multiple times within a single communication and across different communications to aid retention.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use Multiple Channels:&lt;/strong&gt; People absorb information differently. Use a mix of channels—meetings, posts, one-on-ones—to reach everyone.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Maintain Channels:&lt;/strong&gt; Regularly use your communication channels with high-quality content so that the audience trusts them and stays engaged.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Communicate Early and Often:&lt;/strong&gt; Do not wait for perfect information. It is better to share the current state of understanding and revise it later than to let a vacuum be filled by rumours.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Debug Miscommunication:&lt;/strong&gt; If your message is not landing, it is your fault, not the audience’s. Take full responsibility, ask questions to understand the gap, and correct the message for everyone.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The principle of taking ownership for miscommunication provides a clear path for improvement. Rather than getting frustrated, the task becomes to diagnose the failure and correct it.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When I’m doing a poor job of communicating it can feel like I’m pushing with a rope… It can be a frustrating experience and it is tempting to blame the audience for not understanding. But make no mistake, when this happens, it is your fault.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This perspective transforms communication from a vague talent into a concrete skill that can be systematically debugged and improved—a powerful mindset for growth.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Andrew “Boz” Bosworth is the CTO of Meta and a long-time executive at the company. &lt;a href=&quot;https://allarddewinter.net/blog/on-communication-is-the-job-by-andrew-bosworth/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>A reading list on developer productivity metrics</title>
      <link href="https://allarddewinter.net/blog/a-reading-list-on-developer-productivity-metrics/" />
      <updated>2025-09-01T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-reading-list-on-developer-productivity-metrics/</id>
      <content type="html">
				&lt;p&gt;Measuring the productivity of software developers is a complex and often contentious topic. Simplistic metrics like story points or lines of code are widely criticised for creating the wrong incentives and failing to capture the true nature of engineering work. The focus is shifting towards measuring project outcomes and team health rather than individual output.&lt;/p&gt;&lt;p&gt;Laura Tacho has curated a comprehensive reading list that provides an excellent overview of the modern landscape of developer productivity metrics. It serves as a valuable resource for anyone looking to move beyond flawed traditional measures.&lt;/p&gt;&lt;p&gt;The list is organised into several key sections, providing a structured path through the subject.&lt;/p&gt;&lt;h3 id=&quot;frameworks-overview&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-reading-list-on-developer-productivity-metrics/#frameworks-overview&quot;&gt;Frameworks overview&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This section covers the foundational frameworks used to think about and measure productivity and developer experience today. It includes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The AI Measurement Framework&lt;/strong&gt;: For tracking AI adoption and impact.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DX Core 4&lt;/strong&gt;: A unified framework combining DORA, SPACE, and DevEx.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SPACE Framework&lt;/strong&gt;: The original paper outlining Satisfaction, Performance, Activity, Communication, and Efficiency.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DORA Metrics&lt;/strong&gt;: The four key metrics for software delivery performance.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;DevEx Framework&lt;/strong&gt;: Focuses on feedback loops, flow state, and cognitive load.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;measuring-the-impact-of-ai&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-reading-list-on-developer-productivity-metrics/#measuring-the-impact-of-ai&quot;&gt;Measuring the impact of AI&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;With the rise of generative AI, measuring its actual effect on productivity is crucial. This part of the list offers guides on how to measure GenAI adoption and its impact on developer experience and throughput, cautioning that its use is not a guaranteed productivity boost.&lt;/p&gt;&lt;h3 id=&quot;key-articles-and-perspectives&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-reading-list-on-developer-productivity-metrics/#key-articles-and-perspectives&quot;&gt;Key articles and perspectives&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The collection includes several important articles that provide context and critical perspectives. It references the debate around the McKinsey article on productivity, offering a counterpoint from The Pragmatic Engineer. It also highlights foundational pieces from Martin Fowler and Bryan Finster on effectiveness and the potential misuse of DORA metrics.&lt;/p&gt;&lt;p&gt;Laura includes her own strong perspective on the human element of measurement:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;One thing I won’t shut up about is that developers are adults, and if they tell you something is preventing them from working efficiently, you should believe them.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This list is a valuable addition, providing extra detail to my earlier posts on the various &lt;a href=&quot;https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/&quot; rel=&quot;noopener&quot;&gt;frameworks for measuring developer productivity&lt;/a&gt; and a &lt;a href=&quot;https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/&quot; rel=&quot;noopener&quot;&gt;deeper look at AI’s impact through the SPACE framework&lt;/a&gt;. It is a nice, comprehensive overview that brings together many of the current standards and debates in one place.&lt;/p&gt;&lt;p&gt;The full, detailed reading list is available here:&lt;br&gt;&lt;a href=&quot;https://docs.google.com/document/d/17-sTuw81JWLIvfvN_wHpxMC4j5A09y17CWwUle2gJSE/mobilebasic&quot; rel=&quot;noopener&quot;&gt;Developer Productivity Metrics - Reading List (Google Docs)&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Do the simplest thing that could possibly work</title>
      <link href="https://allarddewinter.net/blog/do-the-simplest-thing-that-could-possibly-work/" />
      <updated>2025-08-31T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/do-the-simplest-thing-that-could-possibly-work/</id>
      <content type="html">
				&lt;p&gt;In a recent article, &lt;a href=&quot;https://www.seangoedecke.com/the-simplest-thing-that-could-possibly-work/&quot; rel=&quot;noopener&quot;&gt;Sean Goedecke argues for a powerful principle in software design: “Do the simplest thing that could possibly work”&lt;/a&gt;. It is a philosophy that pushes back against the common tendency to over-engineer solutions for problems that do not yet exist.&lt;/p&gt;&lt;h3 id=&quot;a-summary-of-seans-argument&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/do-the-simplest-thing-that-could-possibly-work/#a-summary-of-seans-argument&quot;&gt;A summary of Sean’s argument&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Sean observes that many engineers design for an imagined “ideal” system—one that is perfectly factored, infinitely scalable, and elegantly distributed. He suggests this is the wrong approach. Instead, the focus should be on deeply understanding the current system and implementing the most straightforward solution possible.&lt;/p&gt;&lt;p&gt;He notes that truly effective design can often seem underwhelming.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Great software design looks underwhelming. It doesn’t look like anything much is happening at all. You can tell you’re in the presence of great software design because you start having thoughts like “oh, I didn’t realise the problem was that easy” or “oh nice, you don’t actually have to do anything difficult”.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Sean anticipates and addresses three common objections to this philosophy:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Creating a “Big Ball of Mud”&lt;/strong&gt;: The concern that this approach encourages quick hacks, leading to a messy system. Sean counters that true hacks are inherently complex; the simplest solution often requires more engineering thought to discover and is fundamentally cleaner.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Ambiguity of “Simplicity”&lt;/strong&gt;: The argument that “simplest” is too subjective. He offers a practical definition: simple systems have fewer moving parts, are less internally connected, and are more stable, requiring less ongoing work.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ignoring Scalability&lt;/strong&gt;: The objection that this method is irresponsible because it does not prepare for future growth. Sean argues that trying to predict future scale often fails and leads to inflexible systems.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On the topic of scale, he is particularly direct:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;In my view, the cardinal sin of big tech SaaS engineering is an obsession with scale. I’ve seen so much unavoidable pain caused by over-engineering systems to prepare for several orders of magnitude more than the current scale.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The core message is to design for the requirements you have right now. This approach, originally credited to Ward Cunningham and Kent Beck, results in more flexible and manageable systems.&lt;/p&gt;&lt;h3 id=&quot;applying-simplicity-beyond-code&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/do-the-simplest-thing-that-could-possibly-work/#applying-simplicity-beyond-code&quot;&gt;Applying simplicity beyond code&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I find this principle is applicable in almost any field. In my own work, for example, when writing architecture documents or creating diagrams, I actively try to make them as simple as possible. A straightforward diagram is much easier for stakeholders to understand and work with. It reduces the effort needed to convey the core message.&lt;/p&gt;&lt;p&gt;This line of thinking is crucial when designing the systems themselves. Consider the initial architecture for a new machine learning model. The temptation is to design a system with separate microservices for data ingestion, a dedicated feature store, and a complex orchestration tool like Kubeflow, all before the first model has proven its value.&lt;/p&gt;&lt;p&gt;Applying Sean’s principle, the simplest thing that could possibly work looks very different:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;A single, version-controlled script that pulls data, trains the model, and saves the model file and performance metrics.&lt;/li&gt;&lt;li&gt;A simple &lt;code&gt;cron&lt;/code&gt; job to run this script on a schedule for retraining, leaning on existing system primitives.&lt;/li&gt;&lt;li&gt;If real-time predictions are a hard requirement, a basic API using Flask can serve the model. If not, the simplest solution is even more direct: a batch script that runs predictions and saves the results to a database or file.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This minimal setup delivers value immediately. You only add complexity—like a dedicated feature store or a more advanced orchestrator—when you have a proven need, such as multiple models reusing the same features or training dependencies that a &lt;code&gt;cron&lt;/code&gt; job can no longer manage. By applying the KISS principle and leaving out anything that is not essential, the architecture becomes more approachable and we can focus on delivering value first.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Measuring AI Impact on Developers: No Holy Grail, But Practical Paths Forward</title>
      <link href="https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/" />
      <updated>2025-08-30T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/</id>
      <content type="html">
				&lt;p&gt;In my earlier post, &lt;a href=&quot;https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/&quot;&gt;“A deeper look at AI’s impact through the SPACE framework”&lt;/a&gt;, I explored how AI affects developers across multiple dimensions; not just output, but satisfaction and collaboration. But how do organisations &lt;em&gt;measure&lt;/em&gt; that impact at scale?&lt;/p&gt;&lt;p&gt;As Laura Tacho, CTO at DX, details in her deepdive for &lt;em&gt;The Pragmatic Engineer&lt;/em&gt;, &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/how-tech-companies-measure-the-impact-of-ai&quot; rel=&quot;noopener&quot;&gt;“How tech companies measure the impact of AI on software development”&lt;/a&gt;, there is no single metric that tells you whether AI is working. In fact, 60% of engineering leaders cite a lack of clear metrics as their biggest AI challenge.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“We agreed a long time ago that LOC is a bad measure of developer productivity, but it’s easy to measure LOC, and in the absence of a clear alternative, easy to latch on to.” — Laura Tacho&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;From her article, here’s what actually works and what doesn’t.&lt;/p&gt;&lt;hr&gt;&lt;h3 id=&quot;what-to-measure-the-core-ai-blend&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#what-to-measure-the-core-ai-blend&quot;&gt;What to Measure: The Core + AI Blend&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;You don’t need new metrics. Start with what already matters and add AI-specific signals on top.&lt;/p&gt;&lt;h4 id=&quot;core-engineering-metrics-what-always-mattered&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#core-engineering-metrics-what-always-mattered&quot;&gt;Core Engineering Metrics (What Always Mattered)&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Change Failure Rate (CFR)&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;: % of deployments that cause incidents or rollbacks. Measures reliability.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PR Throughput&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;: Number of pull requests merged per engineer or team per week. Measures delivery speed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PR Cycle Time&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;: Time from first commit to PR merge. Measures workflow efficiency.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Developer Experience (DevEx)&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn4&quot; id=&quot;fnref4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;: How much friction developers feel across planning, coding, testing, and production. Often measured via surveys.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;ai-specific-signals-whats-new&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#ai-specific-signals-whats-new&quot;&gt;AI-Specific Signals (What’s New)&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;DAU/WAU&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn5&quot; id=&quot;fnref5&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt;: Daily or weekly active users of AI tools. Shows adoption depth.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CSAT&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn6&quot; id=&quot;fnref6&quot;&gt;[6]&lt;/a&gt;&lt;/sup&gt;: Satisfaction score for AI tools, e.g.; “On a scale of 1–5, how satisfied are you with Copilot?”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Self-reported time saved&lt;/strong&gt;: Estimated hours per week saved using AI tools.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cost per engineer&lt;/strong&gt;: AI tool spend divided by active users. Helps track ROI.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Dropbox, for example, tracks both and found that AI users merge 20% more PRs &lt;em&gt;while reducing&lt;/em&gt; CFR. This dual tracking prevents over-indexing on speed.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“You don’t need totally new metrics to measure AI impact. Instead, focus on what’s always mattered. Is AI helping your organization get better at those things?” — Laura Tacho&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;&lt;h3 id=&quot;what-not-to-measure-or-at-least-not-alone&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#what-not-to-measure-or-at-least-not-alone&quot;&gt;What &lt;em&gt;Not&lt;/em&gt; to Measure (Or At Least, Not Alone)&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These metrics are misleading if used in isolation:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lines of Code (LOC)&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn7&quot; id=&quot;fnref7&quot;&gt;[7]&lt;/a&gt;&lt;/sup&gt;: Easy to count, meaningless as a productivity signal. Doesn’t reflect quality, maintainability, or business value.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Acceptance Rate&lt;/strong&gt; (alone): Measures how often developers accept AI suggestions, but says nothing about whether the code is good, maintainable, or bug-free.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Token Spend&lt;/strong&gt; (without context): Cost matters, but not if it’s divorced from value delivered. Some companies (like Shopify) celebrate high spend as a sign of experimentation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;“AI-Generated Code %”&lt;/strong&gt;: A headline-friendly number, but tells you nothing about quality, reliability, or developer experience.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As Monzo’s Suhail Patel puts it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“If we have to spend an equal amount of time fixing up AI-generated code as we spent handwriting the code, then we’ve made no progress!”&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;&lt;h3 id=&quot;break-down-data-dont-aggregate-blindly&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#break-down-data-dont-aggregate-blindly&quot;&gt;Break Down Data, Don’t Aggregate Blindly&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Don’t treat “AI impact” as a monolith. Slice and dice your data:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;AI users vs. non-AI users&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn8&quot; id=&quot;fnref8&quot;&gt;[8]&lt;/a&gt;&lt;/sup&gt;: An “AI user” is typically someone who uses an AI tool at least weekly. Compare their metrics (e.g., PR throughput, CFR) against non-users.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cohort analysis&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn9&quot; id=&quot;fnref9&quot;&gt;[9]&lt;/a&gt;&lt;/sup&gt;: Follow the same group of developers before and after they adopt AI tools. Measures individual impact.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Segment by role, tenure, or language&lt;/strong&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fn10&quot; id=&quot;fnref10&quot;&gt;[10]&lt;/a&gt;&lt;/sup&gt;: E.g., junior devs may open more PRs; seniors may slow down due to review load. Reveals where enablement is needed.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Webflow found AI saved the most time for devs with 3+ years experience. Monzo saw juniors open more PRs, seniors slow down likely reviewing AI output. These aren’t flaws, they’re signals for targeted enablement.&lt;/p&gt;&lt;hr&gt;&lt;h3 id=&quot;balance-speed-with-quality-and-maintainability&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#balance-speed-with-quality-and-maintainability&quot;&gt;Balance Speed with Quality and Maintainability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Track metrics that keep each other in check:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;PR Throughput + Change Failure Rate&lt;/strong&gt;: Speed without stability is a trap.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;System data + Self-reported data&lt;/strong&gt;: You can’t measure “maintainability” or “change confidence” from logs alone.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“Developer experience tells us the story behind the numbers. While output metrics like PR throughput show us what is happening, developer satisfaction reveals whether it’s sustainable.” — Shelly Stuart, CircleCI&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;&lt;h3 id=&quot;how-to-start-even-without-big-tech-resources&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#how-to-start-even-without-big-tech-resources&quot;&gt;How to Start (Even Without Big Tech Resources)&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Establish baselines&lt;/strong&gt; for core metrics (CFR, cycle time, throughput).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Layer in AI signals&lt;/strong&gt; via surveys (CSAT, time saved) and system data (DAU, spend).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use experience sampling&lt;/strong&gt; ask quick questions during workflows (e.g., “Did you use AI here?”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Adopt an experimental mindset&lt;/strong&gt; test hypotheses, not just collect data.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As Tacho notes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Taking these measurements once won’t give you much insight into AI impact; tracking them over time is what reveals trends and patterns.”&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;&lt;h3 id=&quot;what-this-means-for-your-team&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#what-this-means-for-your-team&quot;&gt;What This Means for Your Team&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;No single metric is enough&lt;/strong&gt;. Speed, quality, maintainability, and experience are interdependent — measure them together.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Context is king&lt;/strong&gt;. A 20% PR increase means nothing if bugs spike. Always ask: “At what cost?”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Culture matters more than tools&lt;/strong&gt;. Teams with high AI adoption report greater personal and team benefits — because they share best practices and support each other.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Start small, iterate often&lt;/strong&gt;. You don’t need perfect data — you need enough to make better decisions. Pick one core metric and one AI signal to track next quarter.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The goal isn’t to “measure AI”, it’s to measure whether AI is helping your team deliver better software, faster, without burning out or accumulating tech debt. That’s a challenge worth tackling; one metric, one cohort, one survey at a time.&lt;/p&gt;&lt;hr class=&quot;footnotes-sep&quot;&gt;&lt;section class=&quot;footnotes&quot;&gt;&lt;ol class=&quot;footnotes-list&quot;&gt;&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;Change Failure Rate (CFR)&lt;/strong&gt;: % of deployments that cause incidents or rollbacks. Measures reliability. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;PR Throughput&lt;/strong&gt;: Number of pull requests merged per engineer or team per week. Measures delivery speed. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;PR Cycle Time&lt;/strong&gt;: Time from first commit to PR merge. Measures workflow efficiency. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;Developer Experience (DevEx)&lt;/strong&gt;: How much friction developers feel across planning, coding, testing, and production. Often measured via surveys. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn5&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;DAU/WAU&lt;/strong&gt;: Daily or weekly active users of AI tools. Shows adoption depth. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn6&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;CSAT&lt;/strong&gt;: Satisfaction score for AI tools — e.g., “On a scale of 1–5, how satisfied are you with Copilot?” &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref6&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn7&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;Lines of Code (LOC)&lt;/strong&gt;: Total lines of code written or generated. A poor proxy for productivity or value. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref7&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn8&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;AI users vs. non-AI users&lt;/strong&gt;: An “AI user” is typically someone who uses an AI tool at least weekly. Compare their metrics against non-users. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref8&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn9&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;Cohort analysis&lt;/strong&gt;: Follow the same group of developers before and after they adopt AI tools. Measures individual impact. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref9&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li id=&quot;fn10&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;&lt;strong&gt;Segment by role, tenure, or language&lt;/strong&gt;: E.g., junior devs may open more PRs; seniors may slow down due to review load. Reveals where enablement is needed. &lt;a href=&quot;https://allarddewinter.net/blog/measuring-ai-impact-on-developers-no-holy-grail-but-practical-paths-forward/#fnref10&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
 			</content>
    </entry><entry>
      <title>Documents: The architect&#39;s programming language</title>
      <link href="https://allarddewinter.net/blog/documents-the-architects-programming-language/" />
      <updated>2025-08-30T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/documents-the-architects-programming-language/</id>
      <content type="html">
				&lt;p&gt;In a post on the Stack Overflow blog, Isaac Lyman presents a interesting argument that for a software architect, documents are the equivalent of a programming language. They are the primary tool for deploying ideas into a system of people, a powerful way to think about a skill that is often seen as a secondary task. &lt;a href=&quot;https://stackoverflow.blog/2025/08/20/documents-the-architect-s-programming-language/&quot; rel=&quot;noopener&quot;&gt;stackoverflow.blog&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;the-core-idea-deploying-ideas-to-systems-of-people&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-core-idea-deploying-ideas-to-systems-of-people&quot;&gt;The core idea: Deploying ideas to systems of people&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The central premise of the article is captured in this distinction:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Senior developers know how to deploy code to systems of code.&lt;br&gt;Architects know how to deploy ideas to systems of people.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;An architect’s main challenge is not just technical implementation, but achieving alignment, consensus, and shared understanding across teams and stakeholders. The most significant bottlenecks are often people-related: communication, persuasion, and decision-making. Isaac argues that well-crafted documents are the most effective and repeatable way to navigate these challenges.&lt;/p&gt;&lt;h3 id=&quot;principles-for-effective-documentation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#principles-for-effective-documentation&quot;&gt;Principles for effective documentation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To make documentation effective, Lyman suggests a few key principles and techniques:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Prioritise action over perfection:&lt;/strong&gt; It is better to jot things down than to worry about the perfect structure initially. An existing, imperfect document is more valuable than a perfect one that was never written.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use bullet points and headers:&lt;/strong&gt; These tools are an architect’s best friend. They force a focus on structure and completeness over style, and they make documents easy for busy people to skim and digest. The goal is to avoid a “wall of text”.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Embrace point-in-time documents:&lt;/strong&gt; Most documents serve a purpose and then become obsolete. They are more like one-off scripts than applications that need constant maintenance.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-chronological-approach-to-organisation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#a-chronological-approach-to-organisation&quot;&gt;A chronological approach to organisation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;One practical idea in the article is the approach to organising documents. Instead of grouping them by topic—which Isaac argues is subjective and wastes time—he proposes a chronological structure. A few high-level, continuously maintained documents like an &lt;code&gt;Overview&lt;/code&gt; and &lt;code&gt;Architecture&lt;/code&gt; can live at the top level. Everything else is organised by time.&lt;/p&gt;&lt;p&gt;This structure might look like this:&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;📄 Overview
📄 Architecture
📁 2025
    📁 Jan 1 Sprint
        📄 Proposal: Connect edge compute 
        📄 ADR-132 Machine Learning on the edge
    📁 Jan 15 Sprint
        📄 ADR-135 Messaging edge &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This approach makes the timeline of decisions clear and encourages the use of search, which is often more efficient for finding specific information. When you find a document, you immediately have context for when it was written and what else was happening at the time.&lt;/p&gt;&lt;h3 id=&quot;high-impact-document-types&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#high-impact-document-types&quot;&gt;High-impact document types&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The article provides an excellent appendix of high-impact document types that an architect can use to orchestrate ideas.&lt;/p&gt;&lt;h4 id=&quot;the-architecture-overview&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-architecture-overview&quot;&gt;The architecture overview&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A document or diagram describing the major components of a system and how they communicate.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; It helps contributors form a shared mental model of a system, which is essential for building on it, troubleshooting it, and getting it approved by leadership.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;the-dev-design&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-dev-design&quot;&gt;The dev design&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A plan for code you intend to write, outlining the steps, classes, and methods involved.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; It helps developers share knowledge, preserve core patterns, and create a permanent record of how a system evolved. It provides many of the benefits of pair programming asynchronously.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;the-project-proposal&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-project-proposal&quot;&gt;The project proposal&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A document communicating the value, cost, and impact of a potential project.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; This is how large, impactful projects are born. A well-written proposal sets the roadmap for entire teams by making it easy for leaders to say “yes”.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;the-developer-forecast&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-developer-forecast&quot;&gt;The developer forecast&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A document that raises potential risks or worse-than-expected outcomes of a decision.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; It allows an engineer to share professional foresight, get people thinking about pitfalls, and prepare the organisation to respond adeptly if things go wrong.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;the-technology-menu&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-technology-menu&quot;&gt;The technology menu&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A comparison of favoured technologies (languages, frameworks, etc.) with recommendations for when to use each.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; It creates consensus on how things are built, freeing developers from “this-versus-that” debates and allowing them to spin up new projects efficiently.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;the-problem-statement&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-problem-statement&quot;&gt;The problem statement&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A clear explanation of a problem, its constraints, and a few possible solutions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; It enables anyone, regardless of their role, to understand a problem and weigh in on the solution. It also creates a record of the decision-making process.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;the-postmortem&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#the-postmortem&quot;&gt;The postmortem&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;What it is:&lt;/strong&gt; A blameless analysis of a catastrophic failure, including its timeline, root causes, and recommended changes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;How it orchestrates ideas:&lt;/strong&gt; It helps an organisation move from fear (“this can never happen again”) to confidence (“we will make sure of it”) and shifts the culture away from individual blame toward systemic resilience.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;my-perspective-documentation-as-code&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/documents-the-architects-programming-language/#my-perspective-documentation-as-code&quot;&gt;My perspective: Documentation as code&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Isaac’s perspective aligns with how I view the craft of documentation. I see a direct parallel between writing good documentation and writing high-quality code. Just as we refactor code into clean, reusable, and understandable functions or classes, our documentation should follow the same principles.&lt;/p&gt;&lt;p&gt;The goal is not just to write something, but to create an asset that is easy for others (and our future selves) to parse and use. The emphasis on bullet points, clear headers, and logical structure is the documentation equivalent of clean code. It is about creating a clean, simple, and understandable artefact that serves a clear purpose. Thinking of documents as a “programming language” for influencing human systems is the right way to approach this essential architectural skill.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Entering the probabilistic era of software</title>
      <link href="https://allarddewinter.net/blog/entering-the-probabilistic-era-of-software/" />
      <updated>2025-08-28T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/entering-the-probabilistic-era-of-software/</id>
      <content type="html">
				&lt;p&gt;Gian Segato’s essay, &lt;a href=&quot;https://giansegato.com/essays/probabilistic-era&quot; rel=&quot;noopener&quot;&gt;Building AI Products In The Probabilistic Era&lt;/a&gt;, offers a clear perspective on the fundamental changes AI is bringing to software development. He argues that we are moving from a ‘classical’ deterministic world to a ‘quantum’ probabilistic one, a shift that requires a complete rethinking of how we build, manage, and measure software products.&lt;/p&gt;&lt;h3 id=&quot;from-deterministic-funnels-to-infinite-fields&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/entering-the-probabilistic-era-of-software/#from-deterministic-funnels-to-infinite-fields&quot;&gt;From deterministic funnels to infinite fields&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Traditionally, software has been deterministic. We build products that map known inputs to expected results: &lt;code&gt;F(x) -&gt; y&lt;/code&gt;. An action &lt;code&gt;x&lt;/code&gt; reliably produces an outcome &lt;code&gt;y&lt;/code&gt;. Our entire industry, from engineering Service Level Objectives (SLOs) to product management conversion funnels, is built on the premise of predictable, countable, and reliable outcomes.&lt;/p&gt;&lt;p&gt;Gian argues that generative AI breaks this model. We now have a function, &lt;code&gt;F&#39;(?)&lt;/code&gt;, that accepts a near-infinite range of open-ended inputs and produces a probability distribution of possible outputs. The input is unknown, and the output is stochastic.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;In moving to an AI-first world, we transitioned from funnels to infinite fields.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This change means our products can now succeed in ways we never imagined and fail in ways we never intended.&lt;/p&gt;&lt;h3 id=&quot;the-shift-from-engineering-to-empiricism&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/entering-the-probabilistic-era-of-software/#the-shift-from-engineering-to-empiricism&quot;&gt;The shift from engineering to empiricism&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This new reality demands a different mindset. The classical engineering approach of adding constraints to ensure 100% reliability can “nerf” the model, destroying the very emergent intelligence that makes it powerful.&lt;/p&gt;&lt;p&gt;Instead, Gian suggests a move towards empiricism, where we act more like scientists than traditional engineers. This involves forming hypotheses, testing them rigorously, and accepting that we do not have perfect knowledge of the system.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;With AI products, all this is no longer true. These models are discovered, not engineered. There’s some deep unknowability about them that is both powerful and scary.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This approach requires a willingness to fundamentally rethink and even rebuild systems when a new, more capable model is released, as demonstrated by Replit’s complete product re-architecture in three weeks to leverage a new model’s capabilities.&lt;/p&gt;&lt;h3 id=&quot;my-perspective&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/entering-the-probabilistic-era-of-software/#my-perspective&quot;&gt;My perspective&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Gian’s essay provides a valuable framework for what many of us are experiencing with the rise of generative AI. It feels like we are only at the beginning of understanding the implications of this shift, and his articulation of the move from deterministic to probabilistic systems is very accurate.&lt;/p&gt;&lt;p&gt;I see a direct parallel in how large corporations must adapt. Implementing these new models is not just about adding a new tool; it requires a complete overhaul of processes and how we define value.&lt;/p&gt;&lt;p&gt;However, this transition also introduces a significant tension, particularly in a corporate environment. While AI excels in ambiguity, many business functions rely on determinism. For tasks like KPI reporting or financial tracking, an 80% or 90% probability of being correct is not sufficient. The answer must be 100% right. The same applies to security; 99% secure is a critical failure.&lt;/p&gt;&lt;p&gt;This highlights a crucial challenge: how do we harness the power of probabilistic AI for creative and exploratory tasks while maintaining the deterministic integrity required for critical business operations? Finding that balance will be key for full value creation with these new tools.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The GenAI divide report: Scrutiny, hype, and the reality of AI adoption</title>
      <link href="https://allarddewinter.net/blog/the-genai-divide-report-scrutiny-hype-and-the-reality-of-ai-adoption/" />
      <updated>2025-08-27T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-genai-divide-report-scrutiny-hype-and-the-reality-of-ai-adoption/</id>
      <content type="html">
				&lt;p&gt;Two weeks ago, a report titled “The GenAI Divide,” produced in collaboration with MIT’s Project NANDA, made significant waves. Its headline claim—that 95% of enterprise Generative AI initiatives yield zero financial return—was quickly amplified by news outlets and fuelled discussions about a potential AI bubble.&lt;/p&gt;&lt;p&gt;However, a closer look at the report and the subsequent analysis from industry experts reveals a more nuanced story. The debate it sparked offers valuable lessons on technological adoption, academic rigour, and the organisational challenges that truly define success with AI.&lt;/p&gt;&lt;h3 id=&quot;a-critical-examination-of-the-report&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-genai-divide-report-scrutiny-hype-and-the-reality-of-ai-adoption/#a-critical-examination-of-the-report&quot;&gt;A critical examination of the report&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Wharton Professor &lt;a href=&quot;https://www.linkedin.com/posts/kevinwerbach_state-of-ai-in-business-2025-activity-7365026841759215616-SQWD&quot; rel=&quot;noopener&quot;&gt;Kevin Werbach provided a sharp critique&lt;/a&gt; of the report’s methodology and conclusions. He argues that the document is “deeply problematic” and that its most striking claim lacks clear evidence within the report itself.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The “MIT report” which made a big splash this week, finding few generative AI deployments generate any returns, is deeply problematic. The incident is, frankly, a great example of confirmation bias.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Kevin points out several key issues:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Unsubstantiated Claims:&lt;/strong&gt; The “95% getting zero return” figure is stated in the executive summary but is not clearly supported by data in the rest of the document. The methodology, based on interviews with 52 organisations and surveys with 153 leaders, is not detailed enough to validate such a specific, impactful claim.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Misleading Association:&lt;/strong&gt; He notes the report was produced “in collaboration with Project NANDA out of MIT,” questioning the level of involvement from MIT’s core faculty and researchers. This association lent the report a degree of credibility that its contents may not warrant.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Vague Definitions:&lt;/strong&gt; The report defines “unsuccessful” deployment in a way that does not explicitly mean “zero returns,” creating ambiguity.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Kevin suggests that the report’s authors may have lacked academic research rigour, and its findings were seized upon by sceptics looking to confirm their biases.&lt;/p&gt;&lt;h3 id=&quot;beyond-the-bubble-talk&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-genai-divide-report-scrutiny-hype-and-the-reality-of-ai-adoption/#beyond-the-bubble-talk&quot;&gt;Beyond the bubble talk&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In his Substack newsletter, &lt;a href=&quot;https://substack.com/inbox/post/171484370&quot; rel=&quot;noopener&quot;&gt;Jonas Braadbaart offers a different perspective&lt;/a&gt;. While acknowledging the report and the “bubble talk” it generated, he argues that for business owners and operators, the focus should be elsewhere. Jonas contends that we are still in the very early stages of AI adoption, comparable to the internet in 1998.&lt;/p&gt;&lt;p&gt;He cleverly uses the report’s own data to highlight what he sees as the real issue. When interviewees were asked about the likely causes for pilot failures, the top reasons were not technical.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Most of the challenges faced by these pilots were organizational—not technological.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Jonas points to a disconnect between IT and business teams, poor user experience, and a failure to set the right context for users as the primary culprits. The problem is not that the technology is failing, but that organisations are failing to adapt their processes and culture to leverage it effectively.&lt;/p&gt;&lt;h3 id=&quot;personal-reflection&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-genai-divide-report-scrutiny-hype-and-the-reality-of-ai-adoption/#personal-reflection&quot;&gt;Personal reflection&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Connecting the perspectives of Kevin Werbach and Jonas Braadbaart provides a comprehensive view. Kevin rightly scrutinises the report’s sensationalist claims and questionable methodology, reminding us to be critical of sources, even those with prestigious affiliations. Jonas, on the other hand, looks past the headline to extract a practical insight: the friction in AI adoption is more organisational than technological.&lt;/p&gt;&lt;p&gt;I believe there is immense value to be gained from AI, but it is not a magic wand. The NANDA report, despite its flaws, inadvertently highlights this truth. The focus on “agentic AI” and other technical solutions within the report feels like a distraction from the core challenge. Real, sustainable returns will not come from a slightly better model or a new marketing term. They will come from fundamentally rethinking and adapting our ways of working.&lt;/p&gt;&lt;p&gt;Success requires integrating these new tools into our existing workflows in a thoughtful way, which means changing processes that have been in place for years. It demands that we move beyond the hype and critically assess how this technology can solve specific, real-world problems within our businesses. The real “GenAI divide” is not between companies getting returns and those getting zero; it is between organisations that understand this and those that are still waiting for a plug-and-play solution.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Alberta&#39;s new blueprint: Treating data centres as grid actors</title>
      <link href="https://allarddewinter.net/blog/albertas-new-blueprint-treating-data-centres-as-grid-actors/" />
      <updated>2025-08-26T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/albertas-new-blueprint-treating-data-centres-as-grid-actors/</id>
      <content type="html">
				&lt;p&gt;I came across an interesting post by &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7365679237464223746/&quot; rel=&quot;noopener&quot;&gt;Dlzar Al Kez on LinkedIn&lt;/a&gt; detailing a significant policy shift in Alberta, Canada. The province’s grid operator, AESO, has drafted new connection requirements that fundamentally redefine the role of large, transmission-connected data centres (TCDCs). Instead of treating them as passive loads, Alberta is mandating that they behave like active, responsible grid participants.&lt;/p&gt;&lt;p&gt;The context is crucial. Alberta’s grid has a peak demand of around 12.4 GW—for context, the peak demand in the Netherlands is around 19 GW (&lt;a href=&quot;https://www.tennet.eu/nl-en/news/tennet-provides-9-gigawatts-capacity-high-voltage-grid-customers-waiting-list&quot; rel=&quot;noopener&quot;&gt;tennet.eu&lt;/a&gt;)—with limited connections to neighbouring systems. In a grid of this scale, a sudden drop or surge of 500 MW from a single data centre is not just noise; it is a major system event that could threaten stability for the entire province. As Dlzar notes, what is a minor fluctuation in a large grid like Texas’s ERCOT is a province-wide event in Alberta.&lt;/p&gt;&lt;h3 id=&quot;a-new-set-of-rules&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/albertas-new-blueprint-treating-data-centres-as-grid-actors/#a-new-set-of-rules&quot;&gt;A new set of rules&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;AESO is proactively addressing the risks associated with the rapid, high-volume power consumption of modern data centres, particularly those running AI workloads. The draft rules are a blueprint for how to integrate these massive loads safely.&lt;/p&gt;&lt;p&gt;The core requirements include:&lt;/p&gt;&lt;p&gt;➤ &lt;strong&gt;Capped Ramping:&lt;/strong&gt; Ramping speed is limited to 10 MW per minute. This forces the computational workload to align with the grid’s physical constraints, not the other way around.&lt;/p&gt;&lt;p&gt;➤ &lt;strong&gt;Mandatory Ride-Through:&lt;/strong&gt; Data centres must remain connected during significant grid disturbances, such as voltage sags and frequency swings. As Dlzar puts it: &lt;em&gt;“In practice: data centres must survive faults that would trip an industrial site because dropping hundreds of MW instantly is worse than riding through.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;➤ &lt;strong&gt;Reactive Power Support:&lt;/strong&gt; They are required to help maintain grid voltage by providing reactive power, a function traditionally handled by generation plants.&lt;/p&gt;&lt;p&gt;➤ &lt;strong&gt;Oscillation and Harmonic Limits:&lt;/strong&gt; Strict limits are placed on power variability and electrical noise to prevent grid instability.&lt;/p&gt;&lt;p&gt;➤ &lt;strong&gt;Built-in Load Shedding:&lt;/strong&gt; Data centres must have the capability to reduce their demand on command from the grid operator.&lt;/p&gt;&lt;p&gt;Dlzar summarises the shift perfectly:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This is the start of a new era. Programmable demand is no longer a silent passenger. It’s a grid actor, with obligations.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-official-blueprint&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/albertas-new-blueprint-treating-data-centres-as-grid-actors/#the-official-blueprint&quot;&gt;The official blueprint&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The details are laid out in AESO’s draft document, “&lt;a href=&quot;https://aesoengage.aeso.ca/connection-requirements-for-transmission-connected-data-centres&quot; rel=&quot;noopener&quot;&gt;Connection Requirements for Transmission-Connected Data Centres&lt;/a&gt;,” which is open for stakeholder review. This is not a high-level policy paper; it is a deeply technical, engineering-level specification that treats the data centre as a complex electrical machine.&lt;/p&gt;&lt;p&gt;The document goes into exhaustive detail. For example, it mandates that data centres provide sophisticated project models, including phasor domain and electromagnetic transient (EMT) models, before they can connect. This is the same level of scrutiny applied to power plants. It also specifies precise ride-through capabilities for numerous scenarios, from low-voltage events lasting 0.15 seconds to frequency swings and rapid phase-angle jumps. These requirements force the data centre’s internal power infrastructure to be an active participant in grid stability, rather than a fragile load that trips offline at the first sign of trouble.&lt;/p&gt;&lt;h3 id=&quot;my-takeaway&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/albertas-new-blueprint-treating-data-centres-as-grid-actors/#my-takeaway&quot;&gt;My takeaway&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While these rules are for Alberta, the principles are universal and highly relevant for Europe. The explosive growth of AI and data processing means every grid operator will face this challenge sooner or later.&lt;/p&gt;&lt;p&gt;This proactive approach offers a clear path for grid operators like TenneT or local DSOs to consider. European regulations might present challenges to implementing such rules directly, but the concept is ripe for exploration in proof-of-concept projects.&lt;/p&gt;&lt;p&gt;Furthermore, this policy could positively affect the public debate surrounding data centres. By framing them as responsible grid partners with clear obligations, it moves the conversation away from them being just massive energy consumers to being integrated, flexible assets. This transparency and accountability are essential for gaining public acceptance.&lt;/p&gt;&lt;p&gt;A critical perspective is that these strict rules might inadvertently push data centres towards proprietary, off-grid generation to guarantee uptime. However, an alternative and more constructive view is that it encourages smarter on-site solutions. As some commenters on the original post noted, this could accelerate the adoption of technologies like DC microgrids within the data centre itself. These systems can use batteries and intelligent load management to smooth out their demand on the main grid, enhancing both their own resilience and the stability of the public infrastructure.&lt;/p&gt;&lt;p&gt;Ultimately, Alberta’s move is a necessary evolution. It acknowledges that in a modern, renewables-heavy grid, large consumers cannot remain passive. They must participate in maintaining the stability of the system they depend on.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>GitHub&#39;s playbook for an AI-powered workforce</title>
      <link href="https://allarddewinter.net/blog/githubs-playbook-for-an-ai-powered-workforce/" />
      <updated>2025-08-25T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/githubs-playbook-for-an-ai-powered-workforce/</id>
      <content type="html">
				&lt;p&gt;GitHub has published a practical playbook detailing its internal strategy for building an AI-powered workforce. The document provides a clear framework for structuring organisational change around the adoption of artificial intelligence.&lt;/p&gt;&lt;p&gt;The core argument of the playbook is that successfully integrating AI is not a technology problem, but a change management challenge.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Their mistake is treating AI adoption as a technology problem when it is, in fact, a change management problem. Companies fail at AI adoption because they treat it like installing software when it’s actually rewiring how people work.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The playbook is built on a holistic system of eight mutually reinforcing pillars designed to create an ecosystem where AI fluency can thrive.&lt;/p&gt;&lt;h3 id=&quot;the-eight-pillars-of-ai-enablement&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/githubs-playbook-for-an-ai-powered-workforce/#the-eight-pillars-of-ai-enablement&quot;&gt;The eight pillars of AI enablement&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a visually structured summary of the core components outlined in the playbook:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;AI Advocates:&lt;/strong&gt; A volunteer network of internal champions who scale adoption through peer-to-peer influence and feedback.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clear policies and guardrails:&lt;/strong&gt; Simple, tiered rules that empower employees to use AI confidently and responsibly.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Learning and development:&lt;/strong&gt; An accessible ecosystem of curated training resources to build practical skills.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data-driven metrics:&lt;/strong&gt; A phased measurement framework to track adoption, engagement, and business impact.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dedicated responsible individual (DRI):&lt;/strong&gt; A central owner who orchestrates the programme and drives the overall strategy.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Executive support:&lt;/strong&gt; Visible leadership commitment that provides strategic vision, investment, and clear communication.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Right-fit tooling:&lt;/strong&gt; A portfolio of vetted first-party and third-party tools suited for various roles.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Communities of practice:&lt;/strong&gt; Dedicated forums for peer-to-peer learning, knowledge sharing, and collaborative problem-solving.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The full document provides actionable steps for implementing each of these pillars. You can read the complete playbook on the &lt;a href=&quot;https://resources.github.com/enterprise/ai-powered-workforce-playbook&quot; rel=&quot;noopener&quot;&gt;GitHub Resources site&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;my-takeaway&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/githubs-playbook-for-an-ai-powered-workforce/#my-takeaway&quot;&gt;My takeaway&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a useful framework for structuring organisational change around AI. It is interesting to see how a tech-native company like GitHub approaches this.&lt;/p&gt;&lt;p&gt;The playbook’s emphasis on change management is particularly relevant for large, non-tech corporates. In these environments, the challenge is often less about the technology itself and more about getting everyone on board, addressing fears, and rewiring established ways of working. The principles outlined here provide a solid blueprint for that process.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>MCP servers: less is more</title>
      <link href="https://allarddewinter.net/blog/mcp-servers-less-is-more/" />
      <updated>2025-08-23T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/mcp-servers-less-is-more/</id>
      <content type="html">
				&lt;p&gt;The AI development space is currently buzzing with talk of Model Context Protocol (MCP) servers, which promise to extend the capabilities of Large Language Models (LLMs). However, a recent article by Geoffrey Huntley, “&lt;a href=&quot;https://ghuntley.com/allocations/&quot; rel=&quot;noopener&quot;&gt;too many model context protocol servers and LLM allocations on the dance floor&lt;/a&gt;”, serves as a critical reminder that this new frontier is not without its significant challenges.&lt;/p&gt;&lt;p&gt;Geoffrey argues that while the hype is immense, the foundational understanding of how MCPs affect LLM performance is dangerously low. His core thesis is simple: when it comes to context, less is more.&lt;/p&gt;&lt;h3 id=&quot;the-hidden-cost-of-context&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mcp-servers-less-is-more/#the-hidden-cost-of-context&quot;&gt;The hidden cost of context&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The central problem Geoffrey identifies is the consumption of the LLM’s context window. Every tool and tool description from an installed MCP server is loaded into this window, effectively reducing the available space for your actual query and the model’s response.&lt;/p&gt;&lt;p&gt;He illustrates this with a stark example: a model with a 200k context window might only have 176k of usable space after the model’s own system prompt and the harness prompt are loaded. If a developer then installs a handful of popular MCP servers, this usable space can shrink dramatically, sometimes by more than 50%.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If your &lt;a href=&quot;http://AGENTS.md&quot; rel=&quot;noopener&quot;&gt;AGENTS.md&lt;/a&gt;, or Cursor rules are incredibly extensive, then you could find yourself operating with a headroom of 20k tokens and thus the quality of output is utter dogpoo.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This “context bloat” leads to several issues:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Degraded Performance:&lt;/strong&gt; LLMs perform a “needle in a haystack” search. The more you allocate, the harder it is for the model to find the relevant information, resulting in lower-quality output.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tool Conflicts:&lt;/strong&gt; The MCP space currently lacks namespacing. If you have multiple tools that perform similar functions (e.g., listing files), the model’s behaviour becomes non-deterministic.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Inconsistent Tuning:&lt;/strong&gt; Different LLM providers have different best practices for writing tool prompts. A tool tuned for an Anthropic model might perform poorly with a GPT model, and vice-versa.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-security-blind-spot&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mcp-servers-less-is-more/#the-security-blind-spot&quot;&gt;The security blind spot&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Beyond performance, Geoffrey highlights a major security risk. This echoes concerns I recently covered in my post, “&lt;a href=&quot;https://allarddewinter.net/blog/simon-willison-on-the-lethal-trifecta-and-mcp-security/&quot;&gt;Simon Willison on the lethal trifecta and MCP security&lt;/a&gt;”, which discusses the dangers of combining private data access with untrusted content. Since there is no meaningful separation between system prompts, harness prompts, and tool prompts, a malicious tool could potentially execute harmful instructions.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Again, there is no name-spacing in the context window. If it’s in the context window, it is up for consideration and execution. There is no significant difference between the coding harness prompt, the model system prompt, and the tooling prompts. It’s all the same.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;He points to a supply chain attack on Amazon’s Q assistant as a real-world example of this vulnerability. His recommendation for enterprises is clear: ban third-party MCPs and build your own, first-party tools to maintain control over the supply chain.&lt;/p&gt;&lt;h3 id=&quot;my-takeaway&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mcp-servers-less-is-more/#my-takeaway&quot;&gt;My takeaway&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Geoffrey’s analysis confirms the feeling that the MCP ecosystem is currently the Wild West. The rush to add more tools and capabilities is happening without sufficient regard for the second-order effects of token consumption and security. The indiscriminate installation of MCP servers is akin to filling a small backpack with every tool imaginable, only to find you have no room left for food and water.&lt;/p&gt;&lt;p&gt;The key is to be deliberate. Before installing an MCP server, we should ask:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Is this functionality already achievable through a CLI that the model knows?&lt;/li&gt;&lt;li&gt;How many tokens will this server and its tools consume?&lt;/li&gt;&lt;li&gt;Have I vetted the source of this tool?&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Ultimately, curating a small, trusted, and efficient set of tools will yield far better and safer results than collecting every available MCP server.&lt;/p&gt;&lt;h3 id=&quot;popular-mcp-servers-by-the-numbers&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/mcp-servers-less-is-more/#popular-mcp-servers-by-the-numbers&quot;&gt;Popular MCP servers by the numbers&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To provide some context on the landscape, here is a list of some of the most-starred MCP servers, based on data from &lt;a href=&quot;https://glama.ai/mcp/servers?sort=github-stargazers%3Adesc&quot; rel=&quot;noopener&quot;&gt;Glama.ai&lt;/a&gt;. This illustrates the variety and popularity of tools currently available.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Server&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Stars&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Language&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;PaddleOCR&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;52,748&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Python&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Multiple text-type recognition, handwriting recognition, and high-precision parsing.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Prisma&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;43,529&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;TypeScript&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Manage Prisma Postgres databases with ease.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;crewAI&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;35,854&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Python&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A framework for orchestrating role-playing, autonomous AI agents.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Context7&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;25,610&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;JavaScript&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Fetches up-to-date, version-specific documentation and code examples.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;GitHub MCP&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;21,218&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Go&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Official GitHub MCP server for repository interaction.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Repomix&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;18,620&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;TypeScript&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Packages repositories into single files to reduce token usage.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;Playwright MCP&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;17,368&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;TypeScript&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Enables LLMs to interact with web pages through accessibility snapshots.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;This list shows the significant developer interest in extending LLM capabilities, but as Geoffrey Huntley’s article makes clear, this power must be wielded with caution and a clear understanding of the trade-offs.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A modern toolkit for great Python projects</title>
      <link href="https://allarddewinter.net/blog/a-modern-toolkit-for-great-python-projects/" />
      <updated>2025-08-21T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-modern-toolkit-for-great-python-projects/</id>
      <content type="html">
				&lt;p&gt;I came across this excellent &lt;a href=&quot;https://github.com/duarte-pompeu/greatpytools2025&quot; rel=&quot;noopener&quot;&gt;repository and accompanying article by Duarte Pompeu&lt;/a&gt; which outlines a modern and pragmatic approach to setting up Python projects in 2025. It serves as a great reference for establishing a consistent and efficient development workflow.&lt;/p&gt;&lt;p&gt;The fundamental principle of Duarte’s approach is the centralisation of all tool configurations within the &lt;code&gt;pyproject.toml&lt;/code&gt; file. This simple strategy ensures consistency across different environments—from a developer’s local machine and IDE to the CI/CD pipeline.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you work in a team, this means these tools will affect you and all your colleagues too! There are two possible outcomes: do it well, and everyone will have a smooth experience and appreciate the setup; do it wrong, and inconsistencies and errors will make it more painful than helpful.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-recommended-toolkit&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-modern-toolkit-for-great-python-projects/#the-recommended-toolkit&quot;&gt;The recommended toolkit&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The setup is built around a small set of fast and effective tools:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Package Management (&lt;code&gt;uv&lt;/code&gt;):&lt;/strong&gt; For managing dependencies and virtual environments. &lt;code&gt;uv&lt;/code&gt; is recommended for its exceptional speed and for providing a reliable, all-in-one solution that simplifies previous complex setups involving tools like &lt;code&gt;poetry&lt;/code&gt;, &lt;code&gt;pyenv&lt;/code&gt;, and &lt;code&gt;pipx&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Formatting (&lt;code&gt;ruff format&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;ruff&lt;/code&gt; is used for code formatting, providing consistency similar to &lt;code&gt;black&lt;/code&gt; but with better performance. It is paired with &lt;code&gt;reorder-python-imports&lt;/code&gt; to manage imports in a way that minimises git conflicts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Linting (&lt;code&gt;ruff check&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;ruff&lt;/code&gt; is also used for linting, replacing &lt;code&gt;flake8&lt;/code&gt; with a faster tool that offers hundreds of rules and auto-fixing capabilities. It can detect a wide range of potential errors, from unused imports to security vulnerabilities.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Testing (&lt;code&gt;pytest&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;pytest&lt;/code&gt; remains the tool of choice for its ergonomic syntax and advanced features like fixtures and parametrized tests, making testing more efficient and maintainable.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;centralised-configuration-in-practice&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-modern-toolkit-for-great-python-projects/#centralised-configuration-in-practice&quot;&gt;Centralised configuration in practice&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;By defining rules in &lt;code&gt;pyproject.toml&lt;/code&gt;, you ensure that running a command like &lt;code&gt;uv run ruff check&lt;/code&gt; behaves identically everywhere. The repository provides a clear example configuration.&lt;/p&gt;&lt;pre class=&quot;language-toml&quot;&gt;&lt;code class=&quot;language-toml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tool.ruff&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;target-version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;py313&quot;&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src/ **.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tests/** .py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;exclude&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;src/before.py&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token key property&quot;&gt;lint.select&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;B&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# bugbear:    potential bugs&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;F&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# pyflakes:   potential errors&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;S&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# bandit:     security issues&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;UP&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;   &lt;span class=&quot;token comment&quot;&gt;# pyupgrade:  upgrade syntax for newer versions&lt;/span&gt;
  &lt;span class=&quot;token string&quot;&gt;&quot;PERF&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# perflint:   performance anti-patterns&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token table class-name&quot;&gt;tool.pytest.ini_options&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;pythonpath&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token key property&quot;&gt;testpaths&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;./tests&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;my-take&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-modern-toolkit-for-great-python-projects/#my-take&quot;&gt;My take&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I find this approach very practical and it aligns with what I have seen work effectively in team environments. I am a strong proponent of using pre-commit to integrate these checks directly into the development workflow.&lt;/p&gt;&lt;p&gt;As Duarte also suggests in his Q&amp;A, using pre-commit with language: system hooks ensures that the same tool versions and configurations defined in pyproject.toml are used. This creates a tight feedback loop.&lt;/p&gt;&lt;p&gt;The benefit is most apparent when working on code destined for cloud platforms. A CI/CD pipeline can take several minutes to provide feedback. Catching formatting, linting, or even basic security errors locally with a pre-commit hook is significantly faster and more efficient. It enforces consistency across the team before code is ever pushed.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What are the most profitable uses of ChatGPT?</title>
      <link href="https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/" />
      <updated>2025-08-20T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/</id>
      <content type="html">
				&lt;p&gt;Simon Willison recently linked to a Reddit thread asking users for the most profitable things they have done with ChatGPT. The responses offer a overview, if anecdotal, showing how people are using these tools for practical, everyday value.&lt;/p&gt;&lt;p&gt;The definition of “profit” in these threads is broad. While some users report direct income, the more pervasive theme is using the tool to reclaim value—either by drastically cutting costs on professional services, automating time-consuming tasks, or gaining leverage in disputes. The tool effectively acts as an on-demand expert, a patient tutor, or an administrative assistant.&lt;/p&gt;&lt;p&gt;The responses generally fall into a few key categories.&lt;/p&gt;&lt;h3 id=&quot;legal-and-contractual-disputes&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#legal-and-contractual-disputes&quot;&gt;Legal and contractual disputes&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;One of the most frequent applications is using the tool to understand and draft communication for legal or quasi-legal situations. It helps level the playing field against companies with dedicated legal teams.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Drafting letters to contest insurance claim denials.&lt;/li&gt;&lt;li&gt;Challenging unfair rental lease agreements or move-out fees by citing tenancy laws.&lt;/li&gt;&lt;li&gt;Negotiating with landlords over issues like a lack of heating by referencing building codes.&lt;/li&gt;&lt;li&gt;Getting out of unfair dismissal claims or securing unpaid bonuses.&lt;/li&gt;&lt;li&gt;Helping to write grant proposals that secure funding.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;I asked ChatGPT to act as an insurance expert and legal advisor to draft a letter in response to an insurance claim denial. The insurance company offered me a few thousand dollars in response to my letter, which I didn’t expect.&lt;br&gt;— u/proofofcrisis&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;professional-and-work-efficiency&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#professional-and-work-efficiency&quot;&gt;Professional and work efficiency&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Many users leverage ChatGPT to augment their professional skills, automate tedious tasks, and advance their careers.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Writing VBA macros for Excel to automate data processing.&lt;/li&gt;&lt;li&gt;Drafting well-structured performance reviews to secure raises.&lt;/li&gt;&lt;li&gt;Helping to write and debug code, especially for unfamiliar languages or systems.&lt;/li&gt;&lt;li&gt;Creating entire business systems, like interconnecting a SaaS app with a legacy VoIP server, saving thousands in development costs.&lt;/li&gt;&lt;li&gt;Preparing for job interviews by role-playing questions and answers.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Turned a business around that was losing 15k/mo… The amount of all-nighters I spent with ChatGPT coming up with strategy still gives me nightmares 😩&lt;br&gt;— EnterLucidium&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;personal-finance-and-cost-savings&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#personal-finance-and-cost-savings&quot;&gt;Personal finance and cost savings&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A huge category of use is simple, direct cost avoidance through DIY projects and better negotiations.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Diagnosing and fixing household appliances like HVAC systems, garage doors, and ovens.&lt;/li&gt;&lt;li&gt;Troubleshooting car problems to avoid expensive mechanic visits.&lt;/li&gt;&lt;li&gt;Learning local electrical codes to perform home wiring projects, saving thousands on electricians.&lt;/li&gt;&lt;li&gt;Negotiating better prices on new cars by analysing fees and comparing offers.&lt;/li&gt;&lt;li&gt;Keeping swimming pools chemically balanced without a professional service.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Electrician wanted $6,000 to wire my sauna (long run through the attic, then down an exterior wall and underground for ~30ft). Chat helped me figure out the electrical code and I did it myself for $600 and passed inspection on first try.&lt;br&gt;— u/Nothing3561&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;health-and-wellbeing&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#health-and-wellbeing&quot;&gt;Health and wellbeing&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While risky if taken as gospel, many use AI as a first-line research tool for health issues, often leading to better outcomes.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Diagnosing conditions in pets and humans by providing symptoms, prompting a second opinion from a real doctor.&lt;/li&gt;&lt;li&gt;Identifying potentially harmful drug interactions that were missed by doctors or pharmacies.&lt;/li&gt;&lt;li&gt;Acting as a “trauma dump” or a therapy tool for self-reflection and emotional processing.&lt;/li&gt;&lt;li&gt;Creating personalised workout and nutrition plans.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;It hasn’t paid me in cash yet, but it’s paid me in growth. Using ChatGPT for self-development has sharpened my emotional awareness and helped me process what I feel. I use it as a catalyst, not a crutch.&lt;br&gt;— First-Chemistry4075&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;entrepreneurship-and-side-hustles&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#entrepreneurship-and-side-hustles&quot;&gt;Entrepreneurship and side hustles&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For those building something new, ChatGPT serves as a co-founder, assistant, and creative partner.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Building and launching iOS apps or SaaS websites with little to no prior coding knowledge.&lt;/li&gt;&lt;li&gt;Writing and self-publishing textbooks or e-books.&lt;/li&gt;&lt;li&gt;Generating business ideas and developing marketing strategies.&lt;/li&gt;&lt;li&gt;Creating storyboards and scripts for creative projects.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;learning-and-self-development&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#learning-and-self-development&quot;&gt;Learning and self-development&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The tool is widely used as a personal tutor to acquire new skills or understand complex topics.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Studying for professional certifications and university degrees.&lt;/li&gt;&lt;li&gt;Learning to code, invest, or perform complex data analysis.&lt;/li&gt;&lt;li&gt;Understanding personal finance concepts like setting up an IRA.&lt;/li&gt;&lt;li&gt;Helping to manage ADHD by creating schedules and organisational systems.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;my-takeaway&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-are-the-most-profitable-uses-of-chatgpt/#my-takeaway&quot;&gt;My takeaway&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The overarching theme is one of empowerment. The tool gives individuals access to specialised knowledge that was previously hard or expensive to obtain. It acts as a powerful sparring partner for thinking through complex problems, whether that is a business strategy, a legal argument, or a DIY project.&lt;/p&gt;&lt;p&gt;At least part of the value seems to come from using it as an intelligent starting point. It can organise your thoughts, highlight what you do not know, and provide a structured path for further, more focused research. For many, it is a tool that reduces friction and provides the confidence to tackle challenges that would otherwise seem insurmountable.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://simonwillison.net/2025/Aug/19/rchatgptpro/&quot; rel=&quot;noopener&quot;&gt;Simon Willison’s link post&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/ChatGPTPro/comments/1mt5igj/what_is_the_most_profitable_thing_you_have_done/&quot; rel=&quot;noopener&quot;&gt;Reddit Thread 1: r/ChatGPTPro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/ChatGPT/comments/1km652i/what_is_the_most_profitable_thing_you_have_done/&quot; rel=&quot;noopener&quot;&gt;Reddit Thread 2: r/ChatGPT&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Thinking like a VC when evaluating a startup role</title>
      <link href="https://allarddewinter.net/blog/thinking-like-a-vc-when-evaluating-a-startup-role/" />
      <updated>2025-08-19T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/thinking-like-a-vc-when-evaluating-a-startup-role/</id>
      <content type="html">
				&lt;p&gt;I came across an interesting article by Irina Stanescu and Oana Olteanu on The Caring Techie that presents a valuable perspective on choosing a new job, particularly within the startup world. Their central idea is that joining a startup is a significant personal investment, and as such, it should be approached with the same level of scrutiny a venture capitalist (VC) would apply to a financial investment.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;But joining a startup is a bet. You’re not writing a check. Instead, you’re putting in something harder to get back: your time, focus, energy, and reputation. Once those are spent, there’s no refund.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The authors propose a framework based on five key questions to guide this due diligence process.&lt;/p&gt;&lt;h3 id=&quot;a-vc-inspired-checklist-for-job-seekers&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/thinking-like-a-vc-when-evaluating-a-startup-role/#a-vc-inspired-checklist-for-job-seekers&quot;&gt;A VC-inspired checklist for job seekers&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The article breaks down the evaluation into five core areas:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Is this a market worth betting on?&lt;/strong&gt; Before looking at the product or team, assess the market itself. Is it large and growing, or small and stagnant? A strong market can support even an average product, but a brilliant team will struggle in a declining market.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Can this team actually win?&lt;/strong&gt; Evaluate the founders and early hires. Do they have complementary skills, domain expertise (founder-market fit), and a track record of shipping products? The team’s ability to execute is critical.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Is there a business behind the product?&lt;/strong&gt; A cool product is not a business. The authors advise looking for evidence of a clear business model, customer demand (are people paying or willing to pay?), and a path to sustainable revenue. Is it a “painkiller” solving a real problem, or just a “vitamin”?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;What’s the actual deal you’re getting?&lt;/strong&gt; This involves understanding the financial offer beyond the base salary. What is the company’s valuation, and what percentage of equity are you being offered? Understanding the potential financial outcome is key to evaluating the risk-reward trade-off.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Is this the right move for you?&lt;/strong&gt; Finally, the decision must align with your personal and career goals. Does the company’s stage match your risk tolerance? Will the role help you grow the skills you want to develop?&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;a-european-perspective&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/thinking-like-a-vc-when-evaluating-a-startup-role/#a-european-perspective&quot;&gt;A European perspective&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While the article has a distinct Silicon Valley feel, particularly regarding the emphasis on stock options, its core principles are universally applicable. In many parts of Europe, significant equity grants for non-founding employees are less common or have different tax implications, which can change the calculation for the fourth question.&lt;/p&gt;&lt;p&gt;However, the fundamental premise—that you are investing your most valuable, non-refundable asset: your time—remains entirely valid. The framework forces a structured, objective analysis that moves beyond the initial excitement of a polished website or an enthusiastic recruiter.&lt;/p&gt;&lt;p&gt;By asking these questions, you can build a more complete picture of the opportunity and make a decision based on conviction rather than just a gut feeling. The full article provides much more detail and is a recommended read for anyone considering a role at a startup.&lt;/p&gt;&lt;p&gt;Read the original article here: &lt;a href=&quot;https://www.thecaringtechie.com/p/how-to-think-like-a-vc-when-evaluating&quot; rel=&quot;noopener&quot;&gt;thecaringtechie.com&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>On Simplicity in Software and System Design</title>
      <link href="https://allarddewinter.net/blog/on-simplicity-in-software-and-system-design/" />
      <updated>2025-08-18T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/on-simplicity-in-software-and-system-design/</id>
      <content type="html">
				&lt;p&gt;Sean Goedecke has written two posts that articulate a clear philosophy on design: simplicity and the deliberate elimination of complexity are marks of quality. This post summarises his main arguments and reflects on how they apply to wider architectural disciplines.&lt;/p&gt;&lt;p&gt;The ideas and concepts presented in the following summaries are entirely from Goedecke’s articles: “&lt;a href=&quot;https://www.seangoedecke.com/great-software-design/&quot; rel=&quot;noopener&quot;&gt;Great software design looks underwhelming&lt;/a&gt;” and “&lt;a href=&quot;https://www.seangoedecke.com/good-system-design/&quot; rel=&quot;noopener&quot;&gt;Everything I know about good system design&lt;/a&gt;”.&lt;/p&gt;&lt;h3 id=&quot;great-software-design-is-underwhelming&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-simplicity-in-software-and-system-design/#great-software-design-is-underwhelming&quot;&gt;Great software design is underwhelming&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Goedecke’s first article argues that great software design is not about using sophisticated features, but about proactively eliminating risk. Instead of reacting to potential failures, a good design removes the possibility of them occurring.&lt;/p&gt;&lt;p&gt;He outlines several methods for achieving this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Protecting the hot paths:&lt;/strong&gt; Moving slow or risky operations out of the direct user request-response cycle.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Removing components:&lt;/strong&gt; Simplifying the architecture by using fewer parts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Centralising state:&lt;/strong&gt; Ensuring a single source of truth to prevent data inconsistency.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Using robust systems:&lt;/strong&gt; Relying on battle-tested, simple technologies that are reliable due to their lack of sophistication.&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;Great software design looks simple because it eliminates as many failure modes as possible during the design stage. The best way to eliminate a failure mode is to not do something exciting (or if you can, not do anything at all).&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;applying-simplicity-to-system-design&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-simplicity-in-software-and-system-design/#applying-simplicity-to-system-design&quot;&gt;Applying simplicity to system design&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In the second article, Goedecke extends this philosophy from software (assembling code) to systems (assembling services). He states that complex systems are often a sign of poor design decisions being compensated for, not a mark of good engineering.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A complex system that works always evolves from a simple system that works. Beginning from scratch with a complex system is a really bad idea.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;His practical advice for keeping systems robust includes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Minimise stateful components:&lt;/strong&gt; State is where things go wrong. Isolate it to as few services as possible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use databases wisely:&lt;/strong&gt; Design clear schemas, use indexes correctly, and offload reads to replicas.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use background jobs for slow operations:&lt;/strong&gt; Keep user-facing requests fast by pushing heavy work into a queue.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cache as little as possible:&lt;/strong&gt; Caching introduces another form of state and should be a last resort.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Focus on the “hot paths”:&lt;/strong&gt; Concentrate on the most critical and high-traffic parts of a system.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;broader-architectural-context&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/on-simplicity-in-software-and-system-design/#broader-architectural-context&quot;&gt;Broader architectural context&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While Goedecke frames these principles for software and system design, they echo fundamental concepts in broader disciplines like Systems Engineering and enterprise architecture frameworks like TOGAF.&lt;/p&gt;&lt;p&gt;The core idea is about tailoring the approach to the problem. In &lt;strong&gt;Systems Engineering&lt;/strong&gt;, a key practice is to determine the necessary level of detail and formality based on the project’s complexity and risk. Not every part of a formal process is needed for every project; knowing what to leave out is as important as knowing what to include. This aligns directly with Goedecke’s principle of avoiding unnecessary components and complexity. As noted by the &lt;a href=&quot;https://sebokwiki.org/wiki/Principles_of_Systems_Thinking&quot; rel=&quot;noopener&quot;&gt;Systems Engineering Body of Knowledge (SEBoK)&lt;/a&gt;, principles are general rules that guide reasoning and conduct, not rigid instructions.&lt;/p&gt;&lt;p&gt;Similarly, with a framework like &lt;strong&gt;TOGAF&lt;/strong&gt;, the value is not in dogmatically applying every step but in using it as a toolbox. A good architect selects the appropriate tools and defines the right level of detail required to meet the stakeholder’s goals. The objective is to create a useful, guiding architecture, not to produce documentation for its own sake.&lt;/p&gt;&lt;p&gt;Goedecke’s focus on simplicity is a practical application of this thinking. Whether designing a small software component or a large enterprise system, the goal remains the same: build a solution that is fit for purpose. This means resisting the urge to add complexity and instead focusing on creating a robust, simple, and maintainable system that meets the end goal. Less is often more.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Fixing the context window for LLM agents</title>
      <link href="https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/" />
      <updated>2025-08-16T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/</id>
      <content type="html">
				&lt;p&gt;I recently came across an article by &lt;a href=&quot;http://dbreunig.com&quot; rel=&quot;noopener&quot;&gt;dbreunig.com&lt;/a&gt;, “&lt;a href=&quot;https://www.dbreunig.com/2025/06/26/how-to-fix-your-context.html&quot; rel=&quot;noopener&quot;&gt;How to Fix Your Context&lt;/a&gt;”, they neatly summarise several ideas on how to manage the context window for Large Language Model (LLM) agents. As models get ever-larger context windows, it is tempting to think we can just “throw it all in”. However, this approach often leads to degraded performance.&lt;/p&gt;&lt;p&gt;The article brings an information-management perspective to the problem, with some principles from the days before LLMs became mainstream. It all comes down to the saying: “Garbage in, garbage out.”&lt;/p&gt;&lt;h3 id=&quot;the-problem-with-long-contexts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/#the-problem-with-long-contexts&quot;&gt;The problem with long contexts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The core issue is that every token in the context influences the model’s response. The article identifies four main ways this can go wrong, which can be summarised as follows:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Failure Mode&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Poisoning&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;An error or hallucination gets into the context and is repeatedly referenced.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Distraction&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;The context becomes so large that the model focuses too much on it, ignoring its training.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Confusion&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Superfluous information in the context is used by the model to generate a low-quality response.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Clash&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;New information or tools added to the context conflict with existing information.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;six-tactics-for-context-management&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/#six-tactics-for-context-management&quot;&gt;Six tactics for context management&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To tackle these issues, the post outlines six key tactics for actively managing an agent’s context.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Every time a model ups the context window ante, a new “RAG is Dead” debate is born… But, as we covered last time: if you treat your context like a junk drawer, the junk will influence your response.&lt;/p&gt;&lt;/blockquote&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tactic&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;RAG&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Selectively adding only relevant information to the prompt.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tool Loadout&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Applying RAG principles to select only the most relevant tool definitions.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Quarantine&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Isolating different tasks into their own threads, each with a dedicated context.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Pruning&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Actively removing irrelevant or unneeded information from the context.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Summarisation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Condensing the accrued context into a shorter summary.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Context Offloading&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Using an external tool, like a scratchpad, to store notes outside the context.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;a-closer-look-at-provence&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/#a-closer-look-at-provence&quot;&gt;A closer look at Provence&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I was particularly interested in the “Context Pruning” tactic and the mention of a model called &lt;a href=&quot;https://arxiv.org/abs/2501.16214&quot; rel=&quot;noopener&quot;&gt;Provence&lt;/a&gt;. This isn’t just a simple filter. Provence is a specialised model trained to be an efficient and robust context pruner.&lt;/p&gt;&lt;p&gt;It works by framing the task as “sequence labeling”, where it learns to identify and keep only the relevant sentences in a body of text for a given query. What makes it particularly clever is that it can be unified with a reranker—a standard component in a RAG pipeline—which means it can prune the context with almost no additional computational cost. It is trained on diverse data, making it effective across different domains out-of-the-box.&lt;/p&gt;&lt;h3 id=&quot;a-practical-perspective-on-multi-agent-systems&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/#a-practical-perspective-on-multi-agent-systems&quot;&gt;A practical perspective on multi-agent systems&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The idea of “Context Quarantine” is powerful, but it also highlights the biggest challenge in agent architecture. A recent post from Cognition AI, “&lt;a href=&quot;https://cognition.ai/blog/dont-build-multi-agents&quot; rel=&quot;noopener&quot;&gt;Don’t Build Multi-Agents&lt;/a&gt;”, offers a strong, practical opinion on this.&lt;/p&gt;&lt;p&gt;The author argues that most multi-agent systems are fragile because they fail to share context effectively. If sub-agents work in isolation, their outputs can be based on conflicting assumptions, leading to poor results when the main agent tries to combine them.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Principle 1&lt;/strong&gt;: Share context, and share full agent traces, not just individual messages.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Principle 2&lt;/strong&gt;: Actions carry implicit decisions, and conflicting decisions carry bad results.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This perspective from Cognition AI does not contradict the tactics from dbreunig’s article; instead, it reinforces them. It serves as a real-world example of why disciplined context engineering is essential. Building agents that can truly work in parallel requires solving the difficult problem of cross-agent context passing, which remains a significant challenge.&lt;/p&gt;&lt;h3 id=&quot;final-thoughts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/fixing-the-context-window-for-llm-agents/#final-thoughts&quot;&gt;Final thoughts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The key takeaway from these articles is that massive context windows are a powerful capability, but not an excuse for sloppy information management. The principles of RAG, pruning, and selective inclusion are still important. As the dbreunig article concludes, it is the job of the agent designer to be deliberate about what goes into the context.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The key insight across all the above tactics is that context is not free. Every token in the context influences the model’s behavior, for better or worse… As you build your next agent or optimize an existing one, ask yourself: Is everything in this context earning its keep?&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Rethinking RAG with visual document analysis</title>
      <link href="https://allarddewinter.net/blog/rethinking-rag-with-visual-document-analysis/" />
      <updated>2025-08-15T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/rethinking-rag-with-visual-document-analysis/</id>
      <content type="html">
				&lt;p&gt;I recently came across an article from the company &lt;a href=&quot;https://www.morphik.ai/&quot; rel=&quot;noopener&quot;&gt;Morphik&lt;/a&gt; that details their approach to Retrieval-Augmented Generation (RAG). Instead of following the ‘regular’ path of parsing documents by extracting text, they treat each page as an image. This method sidesteps many of the common frustrations involved in processing complex documents with tables, charts, and intricate layouts.&lt;/p&gt;&lt;p&gt;The problem with traditional RAG pipelines is their fragility. Extracting text via OCR, detecting layouts, and chunking information intelligently are all steps where context can be lost. Morphik’s team came up with this question:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Why are we deconstructing these documents just to reconstruct meaning? What if we treated them the way humans do: as visual objects?&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;how-it-works&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/rethinking-rag-with-visual-document-analysis/#how-it-works&quot;&gt;How it works&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Their solution is built upon research like Google’s ColPali. The architecture treats each document page as a high-resolution image. This image is then divided into patches, and a Vision Transformer creates rich embeddings that capture both the textual and visual information in context. A language model then refines these embeddings to understand the overall structure.&lt;/p&gt;&lt;p&gt;When a user submits a query, the system uses a technique called “late interaction” to find relevant patches. It does not just look for keywords; it understands the spatial relationship between elements on the page. For example, it can connect the text “Q3 revenue” with a nearby chart showing an upward trend.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-650w.avif 650w, https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-960w.avif 960w, https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-650w.webp 650w, https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-960w.webp 960w, https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-650w.jpeg 650w, https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-960w.jpeg 960w, https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/ComparisonoftraditionalpipelinesvsColPali-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;839&quot; alt=&quot;A diagram comparing a traditional RAG pipeline with Morphik&#39;s ColPali-based visual pipeline.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A comparison of a traditional, multi-step RAG pipeline versus the more direct visual approach. Source: &lt;a href=&quot;https://www.morphik.ai/blog/stop-parsing-docs&quot;&gt;Morphik Blog&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The performance claims are promising. On a challenging financial document benchmark, they report a significant accuracy advantage over other methods.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The results were striking: while other end-to-end providers peaked at around 67% accuracy… Morphik delivered 95.56% accuracy on the same evaluation set.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;my-thoughts-on-this-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/rethinking-rag-with-visual-document-analysis/#my-thoughts-on-this-approach&quot;&gt;My thoughts on this approach&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a innovative way to handle the messiness of real-world documents. For financial reports, technical manuals, and other visually rich materials, preserving the original layout is not just a convenience—it is essential for preserving meaning. This method seems particularly good for use cases where the visual context is as important as the text itself.&lt;/p&gt;&lt;p&gt;However, this approach also presents some interesting trade-offs. While it excels at understanding visual context, it might be less suitable for tasks that depend on the extraction of clean, reusable text. For example, workflows that require copying and pasting specific clauses from a legal document or exporting raw data from a table into a spreadsheet would still benefit from traditional text extraction.&lt;/p&gt;&lt;p&gt;Furthermore, a key consideration for any organisation is how this model handles 100% text-based documents or tasks requiring precise, literal string matching, such as finding a specific serial number. The value of this visual-first strategy is highest when the layout itself contains information. For a simple text file, the benefits are less obvious.&lt;/p&gt;&lt;p&gt;Overall, Morphik’s work is a great example of thinking differently to solve a persistent problem. It is a reminder that sometimes the most effective solution is the one that works &lt;em&gt;with&lt;/em&gt; the nature of the information, rather than trying to force it into a different format.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Understanding the ecosystem of MBSE, SysML, and TOGAF</title>
      <link href="https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/" />
      <updated>2025-08-14T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/</id>
      <content type="html">
				&lt;p&gt;My exploration of complex system development has led me to examine the relationship between several key frameworks and methodologies: Model-Based Systems Engineering (MBSE), the Systems Modeling Language (SysML), and The Open Group Architecture Framework (TOGAF). While it can be tempting to see them as a simple hierarchy, their interactions are more interconnected.&lt;/p&gt;&lt;p&gt;This post synthesises how these concepts fit together, not as layers in a stack, but as distinct, complementary functions within the broader challenge of managing complex systems.&lt;/p&gt;&lt;h3 id=&quot;defining-their-distinct-roles&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#defining-their-distinct-roles&quot;&gt;Defining their distinct roles&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The most effective way to understand these concepts is to see them as functions with different scopes, all operating within the same ecosystem.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Systems Engineering (SE)&lt;/strong&gt; is the overarching &lt;strong&gt;discipline&lt;/strong&gt;. It is the holistic, lifecycle-spanning process for managing the technical development of a system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;TOGAF&lt;/strong&gt; provides the &lt;strong&gt;enterprise context&lt;/strong&gt;. It is a framework that helps an organisation align its technology strategy with its business goals, guiding which systems should be built and how they fit together.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MBSE&lt;/strong&gt; is a relatively new &lt;strong&gt;methodology&lt;/strong&gt; for executing systems engineering. It is a specific &lt;em&gt;way&lt;/em&gt; of doing SE that uses models instead of documents as the primary artefact.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SysML&lt;/strong&gt; is the &lt;strong&gt;language&lt;/strong&gt; used to implement the MBSE methodology. It provides the standard notation for creating the models.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let’s break down each of these roles.&lt;/p&gt;&lt;h3 id=&quot;systems-engineering-the-overarching-discipline&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#systems-engineering-the-overarching-discipline&quot;&gt;Systems engineering: The overarching discipline&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;As I explored in my previous posts on &lt;a href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/&quot; rel=&quot;noopener&quot;&gt;core SE concepts&lt;/a&gt; and the &lt;a href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/&quot; rel=&quot;noopener&quot;&gt;journey from design to disposal&lt;/a&gt;, systems engineering is the discipline that brings structure to complexity. It is a formal process that covers the entire system lifecycle, from defining needs and requirements to design, verification, operation, and retirement.&lt;/p&gt;&lt;p&gt;It is not a single layer but the entire project-level framework. The master plan for this effort is often captured in a Systems Engineering Management Plan (SEMP), which outlines all the technical activities required to deliver the system.&lt;/p&gt;&lt;h3 id=&quot;togaf-the-enterprise-context&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#togaf-the-enterprise-context&quot;&gt;TOGAF: The enterprise context&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;TOGAF operates at the level above a single project. It helps an organisation answer strategic questions like, “What capabilities do we need to achieve our business objectives?” and “How should our portfolio of systems evolve to provide these capabilities?”&lt;/p&gt;&lt;p&gt;It provides the governance and architectural vision that ensures individual projects, each run using systems engineering principles, are not just successful in isolation but also contribute to the broader enterprise strategy. In essence, TOGAF sets the stage and defines the “why” for a project, while SE manages the “how” for that specific project.&lt;/p&gt;&lt;h3 id=&quot;mbse-a-modern-approach-to-systems-engineering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#mbse-a-modern-approach-to-systems-engineering&quot;&gt;MBSE: A modern approach to systems engineering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;MBSE is not a separate discipline from SE; it is an evolution of it. Where traditional systems engineering often relied on a vast collection of documents (specifications, interface control documents, test plans), MBSE centralises this information into a single, interconnected digital model.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Adopting MBSE is more than implementing new tools; it’s about transforming your organization’s approach to systems engineering.&lt;br&gt;— &lt;a href=&quot;https://specinnovations.com/blog/how-to-get-your-organization-to-adopt-mbse&quot; rel=&quot;noopener&quot;&gt;specinnovations.com&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It is a methodological choice. A team applies the discipline of systems engineering &lt;em&gt;by using&lt;/em&gt; a model-based approach. This brings benefits like improved consistency, better change management, and clearer communication.&lt;/p&gt;&lt;h3 id=&quot;sysml-the-language-of-mbse&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#sysml-the-language-of-mbse&quot;&gt;SysML: The language of MBSE&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;If you choose the MBSE methodology, you need a language to build your models. SysML is the industry standard for this. It provides a precise, graphical notation for defining a system’s structure, behaviour, requirements, and parameters. It is the technical tool that makes the MBSE methodology practical.&lt;/p&gt;&lt;h3 id=&quot;how-they-work-together-in-practice&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#how-they-work-together-in-practice&quot;&gt;How they work together in practice&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Imagine a large energy company wants to improve its grid management.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;TOGAF (Enterprise Context):&lt;/strong&gt; The enterprise architecture team uses TOGAF to analyse business drivers (e.g., renewable energy integration, cost reduction). They identify a need for a new, intelligent grid management system and define its high-level requirements and how it must interface with other enterprise systems.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Systems Engineering (The Discipline):&lt;/strong&gt; A project is launched to build this new system. The project is governed by SE principles, documented in a SEMP. This plan outlines the entire lifecycle, including requirements management, design reviews (PDR, CDR), risk management, and its Verification and Validation (V&amp;V) strategy. This strategy ensures the team continuously checks that they are building the system correctly (verification) and building the correct system that meets the user’s needs (validation).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MBSE (The Methodology):&lt;/strong&gt; The project team decides to use an MBSE approach to manage the system’s complexity. Instead of writing a multitude of separate documents, they will build a comprehensive system model.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SysML (The Language):&lt;/strong&gt; The engineers use SysML to create the model in a tool like Cameo or Enterprise Architect. They use SysML diagrams to capture stakeholder requirements, define the system’s architecture, model its behaviour, and trace everything from end to end.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;benefits-of-a-model-based-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-the-ecosystem-of-mbse-sysml-and-togaf/#benefits-of-a-model-based-approach&quot;&gt;Benefits of a model-based approach&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Choosing to implement SE principles via an MBSE methodology offers several advantages:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Improved Communication&lt;/strong&gt;: A unified model becomes the single source of truth, breaking down silos between teams.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Reduced Risk and Cost&lt;/strong&gt;: Virtual simulation allows engineers to identify design flaws early, before expensive physical prototypes are built.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Guaranteed Traceability&lt;/strong&gt;: MBSE provides clear, end-to-end traceability from requirements through to design and testing.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Supports Sustainability&lt;/strong&gt;: It allows for the optimisation of product design to reduce waste and improve resource efficiency.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In the end, everything connects back to the core discipline of systems engineering. As I have explored in my earlier posts, it provides the structured, lifecycle-focused approach needed to manage complexity. Frameworks like TOGAF and methodologies like MBSE, powered by languages such as SysML, represent the evolution of the systems engineering toolkit. They provide engineers with increasingly sophisticated capabilities to manage complexity with greater precision and clarity. As the systems we build become more interconnected and ambitious, the continuous improvement of our engineering tools is what allows us to tackle these challenges, ensuring we not only build the system right, but also build the right system.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A practical guide to MLOps with Databricks</title>
      <link href="https://allarddewinter.net/blog/a-practical-guide-to-mlops-with-databricks/" />
      <updated>2025-08-13T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-guide-to-mlops-with-databricks/</id>
      <content type="html">
				&lt;p&gt;I recently came across this excellent free resource on MLOps with Databricks, and I am particularly proud that it comes from a great Dutch team. I have been following Maria Vechtomova and Başak Tuğçe Eskili of Marvelous MLOps for some time, and they are definitely very knowledgeable in this area.&lt;/p&gt;&lt;p&gt;This course is a great read if you want to get into the practical side of this topic. It is especially relevant as it focuses on Databricks, which provides useful but also very specific tooling for its platform.&lt;/p&gt;&lt;h3 id=&quot;my-perspective-on-mlops-with-databricks&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-mlops-with-databricks/#my-perspective-on-mlops-with-databricks&quot;&gt;My perspective on MLOps with Databricks&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While this course is an excellent guide to the “Databricks way,” I believe it is important to approach any platform with a critical eye, especially with the goal of building a flexible, long-term MLOps strategy. My primary aim is always to avoid vendor lock-in and maintain a platform-agnostic mindset where possible.&lt;/p&gt;&lt;p&gt;From that viewpoint, here are some challenges and considerations when implementing MLOps on Databricks:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Portability and Reusability:&lt;/strong&gt; Databricks-native components like Databricks Asset Bundles (DABs) are powerful for managing deployments within the ecosystem. However, they are not as portable as universal standards like Docker containers. This can make migrating workflows or parts of the stack to other platforms in the future more difficult.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Limited Customisation:&lt;/strong&gt; The convenience of managed services like Model Serving comes with trade-offs. You have less control over the underlying environment, such as specific OS-level dependencies or fine-tuning the web server. This can be a limitation for complex models with unique requirements.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Integrated vs. External Tooling:&lt;/strong&gt; The platform’s monitoring capabilities are well-integrated but can feel like a walled garden. For a comprehensive observability strategy, it is crucial that monitoring data and alerts can be easily exported to external, best-of-breed systems (like Grafana, Prometheus, or Datadog) without significant effort.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Cost Complexity:&lt;/strong&gt; The Databricks pricing model, based on DBUs (Databricks Units), can be complex to forecast and control. While powerful, features like serverless compute, auto-scaling clusters, and multiple specialised services can lead to unexpected costs if not governed carefully.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Learning Curve:&lt;/strong&gt; Although Databricks simplifies many aspects of big data and ML, its ecosystem is vast and has a steep learning curve. Concepts like Unity Catalog, workspace management, and its specific Spark optimisations require significant investment to master.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Despite these considerations, the deep integration of open-source tools like &lt;strong&gt;MLflow&lt;/strong&gt; is a major strength. It provides a solid, open foundation for model tracking and management that adds value both inside and outside the Databricks platform.&lt;/p&gt;&lt;hr&gt;&lt;h2 id=&quot;course-overview&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-mlops-with-databricks/#course-overview&quot;&gt;Course overview&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The &lt;strong&gt;MLOps with Databricks&lt;/strong&gt; course is a comprehensive 10-lecture series that provides a hands-on guide to end-to-end machine learning operations.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/marvelousmlops/marvel-characters&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Full Course Repository on GitHub&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;What makes this course particularly valuable is its focus on practical implementation over theory, using the Marvel Characters dataset to build a complete MLOps pipeline.&lt;/p&gt;&lt;p&gt;Key technologies covered include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Databricks Lakehouse Platform&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MLflow&lt;/strong&gt; for experiment tracking and model registry&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Unity Catalog&lt;/strong&gt; for governance&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Databricks Asset Bundles (DAB)&lt;/strong&gt; for CI/CD&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lakehouse Monitoring&lt;/strong&gt; for production model oversight&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;lecture-summary&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-guide-to-mlops-with-databricks/#lecture-summary&quot;&gt;Lecture summary&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Lecture&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Title &amp; Link&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Key Focus&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;1&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/introduction-to-mlops&quot; rel=&quot;noopener&quot;&gt;Introduction to MLOps&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Foundational concepts, the distinction from DevOps, and an overview of the MLOps tool landscape.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;2&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/developing-on-databricks&quot; rel=&quot;noopener&quot;&gt;Developing on Databricks&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Moving beyond notebooks to production-grade software engineering practices and local development setups.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;3&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/getting-started-with-mlflow&quot; rel=&quot;noopener&quot;&gt;Getting Started with MLflow&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The core components of MLflow: tracking experiments, runs, parameters, metrics, and artifacts.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;4&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/logging-and-registering-models-with&quot; rel=&quot;noopener&quot;&gt;Logging and Registering Models&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Bridging training and deployment by logging models, defining signatures, and using the model registry.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;5&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/model-serving-architectures&quot; rel=&quot;noopener&quot;&gt;Model Serving Architectures&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A conceptual overview of different deployment patterns: batch, real-time, and hybrid architectures.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;6&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/lecture-6-deploying-model-serving&quot; rel=&quot;noopener&quot;&gt;Deploying Model Serving Endpoint&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A practical guide to deploying models as REST APIs, including A/B testing implementations.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;7&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/lecture-7-databricks-asset-bundles&quot; rel=&quot;noopener&quot;&gt;Databricks Asset Bundles&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Using declarative YAML (DABs) for infrastructure-as-code to package and deploy ML workflows.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;8&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/cicd-and-deployment-strategies&quot; rel=&quot;noopener&quot;&gt;CI/CD and Deployment Strategies&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Automating the path to production with Git flow, GitHub Actions, and security best practices.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;9&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/introduction-to-ml-monitoring&quot; rel=&quot;noopener&quot;&gt;Introduction to ML Monitoring&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The “why” of monitoring: understanding data drift, concept drift, and monitoring architecture.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;10&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;a href=&quot;https://marvelousmlops.substack.com/p/lecture-10-implementing-model-monitoring&quot; rel=&quot;noopener&quot;&gt;Implementing Model Monitoring&lt;/a&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A complete implementation of a monitoring system using inference tables and Lakehouse Monitoring.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
 			</content>
    </entry><entry>
      <title>Beyond keys: The rise of semantic and prefix caching for LLMs</title>
      <link href="https://allarddewinter.net/blog/beyond-keys-the-rise-of-semantic-and-prefix-caching-for-llms/" />
      <updated>2025-08-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/beyond-keys-the-rise-of-semantic-and-prefix-caching-for-llms/</id>
      <content type="html">
				&lt;p&gt;Caching is a fundamental concept in system design. At its core, it involves storing frequently accessed data in a temporary, high-speed storage layer that sits between the user and the primary data source, like a database. The goal is simple: improve performance by serving requests from this fast local store, avoiding slower network calls and database operations. When a request for data is made for the first time, it results in a “cache miss,” and the data is fetched from the database and stored in the cache. Subsequent identical requests result in a “cache hit,” where the data is served directly from the cache, leading to significantly faster response times.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/Cache-Working-650w.avif 650w, https://allarddewinter.net/assets/images/Cache-Working-960w.avif 960w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/Cache-Working-650w.webp 650w, https://allarddewinter.net/assets/images/Cache-Working-960w.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/Cache-Working-650w.jpeg 650w, https://allarddewinter.net/assets/images/Cache-Working-960w.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/Cache-Working-960w.jpeg&quot; width=&quot;960&quot; height=&quot;480&quot; alt=&quot;A diagram illustrating the cache workflow, where a client request first checks the cache before querying the database.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A simplified view of how a cache intercepts requests to reduce database load and improve response times. Source: &lt;a href=&quot;https://www.geeksforgeeks.org/system-design/caching-system-design-concept-for-beginners/&quot;&gt;GeeksforGeeks&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This traditional model, where a cache hit relies on an identical request, works perfectly for predictable queries. However, the game changes with Large Language Models (LLMs). I came across an article from Raul Junco in &lt;a href=&quot;https://substack.com/inbox/post/170391808&quot; rel=&quot;noopener&quot;&gt;System Design Classroom&lt;/a&gt; that clearly articulates this challenge. He points out that in AI systems, users often ask for the same information using different phrasing. For example:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;“What is semantic caching?”&lt;/li&gt;&lt;li&gt;“Can you explain how semantic caching works?”&lt;/li&gt;&lt;li&gt;“Tell me about caching based on meaning.”&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All three questions seek the same answer, but to a traditional cache, they are entirely different strings. The result is a cache miss every time, triggering a new, costly call to the LLM for a response you have likely already generated. As Junco’s article puts it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Caching by key doesn’t work when your users speak in meaning.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is where new, more intelligent caching methods become essential.&lt;/p&gt;&lt;h3 id=&quot;a-new-approach-semantic-caching-with-redis-8&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-keys-the-rise-of-semantic-and-prefix-caching-for-llms/#a-new-approach-semantic-caching-with-redis-8&quot;&gt;A new approach: Semantic caching with Redis 8&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Junco’s article focuses on the new capabilities in Redis 8, which aim to solve this problem at the application/data-layer by understanding the &lt;em&gt;meaning&lt;/em&gt; behind a query, not just its literal text. This is achieved through a combination of new features:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Vector Sets:&lt;/strong&gt; Redis can now natively store and search vectors. This allows it to find prompts that are “close” in meaning by comparing their vector embeddings, without needing a separate vector database.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;LangCache:&lt;/strong&gt; This is a managed semantic cache built on Redis. It takes an incoming prompt, creates an embedding, and searches the cache for vectors of previous prompts that are semantically similar. If a close match is found, it returns the cached response, skipping the LLM call entirely.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Redis Flex:&lt;/strong&gt; To make storing vast amounts of cached data affordable, Redis Flex uses a hybrid memory model. It keeps “hot” data in RAM for speed and offloads less-used “warm” data to more economical SSD storage.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This approach moves caching from a simple key-match to a more powerful meaning-match, directly addressing the issue of varied user phrasing.&lt;/p&gt;&lt;h3 id=&quot;the-incumbents-approach-prefix-caching&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-keys-the-rise-of-semantic-and-prefix-caching-for-llms/#the-incumbents-approach-prefix-caching&quot;&gt;The incumbents’ approach: Prefix caching&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While Redis tackles this at the application layer, major AI providers like OpenAI and Anthropic (Claude) have implemented their own form of caching at the API level. Their method is best described as &lt;strong&gt;prefix caching&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Instead of understanding semantics, their systems identify and cache the static, initial parts of a prompt. This is particularly effective for applications that repeatedly send large, unchanging blocks of text, such as a detailed system prompt, few-shot examples, or context from a RAG system.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anthropic (Claude):&lt;/strong&gt; Provides explicit control via a &lt;code&gt;cache_control&lt;/code&gt; parameter in the API call. You mark which parts of the prompt are static (e.g., a system message or a large document), and Claude caches them. Subsequent calls only need to process the new, dynamic parts of the prompt, saving on token costs and reducing latency. You can find the details in their &lt;a href=&quot;https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching&quot; rel=&quot;noopener&quot;&gt;prompt caching documentation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenAI:&lt;/strong&gt; Implements this automatically for prompts over 1024 tokens. It hashes the beginning of a prompt and routes requests with the same hash to a server that has that prefix cached. While automatic, it offers less direct control than Claude’s method. More details are in their &lt;a href=&quot;https://platform.openai.com/docs/guides/prompt-caching&quot; rel=&quot;noopener&quot;&gt;prompt caching guide&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;comparison-semantic-vs-prefix-caching&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-keys-the-rise-of-semantic-and-prefix-caching-for-llms/#comparison-semantic-vs-prefix-caching&quot;&gt;Comparison: Semantic vs. prefix caching&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These two strategies solve related but distinct problems. Semantic caching is user-focused, while prefix caching is developer-focused. Here is a breakdown of the differences:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Feature&lt;/th&gt;&lt;th&gt;Redis (Semantic Caching)&lt;/th&gt;&lt;th&gt;Claude &amp; OpenAI (Prefix Caching)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Core Mechanism&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Vector similarity search on prompt embeddings.&lt;/td&gt;&lt;td&gt;Exact match of the initial, static part (prefix) of a prompt.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Solves For&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Varied user phrasing for the same intent.&lt;/td&gt;&lt;td&gt;Repetitive, large static contexts (e.g., system prompts, RAG).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Implementation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Application-layer service (e.g., Redis Cloud).&lt;/td&gt;&lt;td&gt;Built directly into the LLM provider’s API.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Control&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Granular control over similarity thresholds, TTLs, etc.&lt;/td&gt;&lt;td&gt;API-level control (explicit in Claude, automatic in OpenAI).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;High. Understands meaning, independent of exact wording.&lt;/td&gt;&lt;td&gt;Low. Requires the prefix to be 100% identical.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Primary Benefit&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Reduces redundant calls from semantically similar user inputs.&lt;/td&gt;&lt;td&gt;Reduces token processing for large, developer-defined contexts.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;why-this-matters&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-keys-the-rise-of-semantic-and-prefix-caching-for-llms/#why-this-matters&quot;&gt;Why this matters&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The evolution of caching for AI systems is a big step towards making them more efficient, scalable, and affordable. The quote from Junco’s article is a powerful summary:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Every LLM call you make that could’ve been a cache hit is tech debt you’re paying in real time.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Semantic caching, like the solution from Redis, represents a fundamental shift. It addresses the inherent ambiguity of natural language. Prefix caching, on the other hand, is a pragmatic and powerful optimisation for common development patterns like RAG.&lt;/p&gt;&lt;p&gt;They are not mutually exclusive. A truly optimised system will likely use both: prefix caching at the API level to handle static system instructions and document context, and semantic caching at the application level to handle the diversity of user queries. This layered approach seems to be the most logical path forward for building robust and cost-effective AI applications.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Onboarding AI with READMEs and quality gates</title>
      <link href="https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/" />
      <updated>2025-08-11T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/</id>
      <content type="html">
				&lt;p&gt;In my last post on &lt;a href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/&quot;&gt;structuring AI-assisted development&lt;/a&gt;, I explored the idea of creating rulebooks to steer AI coding tools. While this is a powerful technique, I have sometimes struggled to get consistent, high-quality results from AI agents. The process can still feel like it requires constant supervision.&lt;/p&gt;&lt;p&gt;A recent article by Fuzzy Computer, “&lt;a href=&quot;https://www.fuzzycomputer.com/posts/onboarding&quot; rel=&quot;noopener&quot;&gt;Onboarding for coding agents&lt;/a&gt;”, offers a practical solution that reframes the problem. Instead of focusing solely on instructing the AI, it proposes structuring the project environment so that the AI can self-correct. The core idea is simple but effective: use universal documentation for context and automated tools for constraints.&lt;/p&gt;&lt;p&gt;This approach creates a system that is not only beneficial for AI agents but also for any human developer joining the project.&lt;/p&gt;&lt;h3 id=&quot;the-two-pillars-of-the-system&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/#the-two-pillars-of-the-system&quot;&gt;The two pillars of the system&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The article proposes a clear, two-part strategy for managing AI collaboration, moving away from tool-specific configuration files like &lt;code&gt;CLAUDE.md&lt;/code&gt; or &lt;code&gt;.cursor/rules&lt;/code&gt; towards a more universal setup.&lt;/p&gt;&lt;h4 id=&quot;1-onboarding-with-readmes&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/#1-onboarding-with-readmes&quot;&gt;1. Onboarding with READMEs&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The first pillar is to treat every AI session like onboarding a new team member. Instead of putting project context into proprietary files, place it in a series of &lt;code&gt;README.md&lt;/code&gt; files, a format every developer already understands.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Ask yourself: if a new software engineer or designer joined this project tomorrow, what would you want them to read before they start on their first task? That’s the type of context you should put in READMEs.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The article suggests a simple naming convention to keep this context modular:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt;: The high-level project overview.&lt;/li&gt;&lt;li&gt;&lt;code&gt;README.architecture.md&lt;/code&gt;: Explains the application structure, data flow, and key patterns.&lt;/li&gt;&lt;li&gt;&lt;code&gt;README.commands.md&lt;/code&gt;: Lists key development scripts and commands.&lt;/li&gt;&lt;li&gt;&lt;code&gt;README.design.md&lt;/code&gt;: Details the design system and visual guidelines.&lt;/li&gt;&lt;li&gt;&lt;code&gt;README.testing.md&lt;/code&gt;: Outlines testing strategies and patterns.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This way, the &lt;code&gt;CLAUDE.md&lt;/code&gt; file shrinks to a simple instruction list, telling the AI to read all relevant &lt;code&gt;README&lt;/code&gt; files at the start of a session.&lt;/p&gt;&lt;h4 id=&quot;2-quality-gates&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/#2-quality-gates&quot;&gt;2. Quality gates&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The second pillar is to enforce rules through the environment itself, not through text-based instructions. These are called “Quality Gates”—automated checks that must pass before the AI’s work is considered complete.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This works well because LLMs are terrible at formatting whitespace or sorting imports and Tailwind classes consistently, or ensuring every React hook’s dependency array is correct. But they’re good at running tools and fixing errors until all checks pass.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The article uses TypeScript as example, for a Python project we can make something similar:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;ruff format .&lt;/code&gt; (Code formatting)&lt;/li&gt;&lt;li&gt;&lt;code&gt;ruff check .&lt;/code&gt; (Linting rules)&lt;/li&gt;&lt;li&gt;&lt;code&gt;mypy .&lt;/code&gt; (Static type checking)&lt;/li&gt;&lt;li&gt;&lt;code&gt;pytest&lt;/code&gt; (Unit and integration tests)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;By instructing the AI to run these checks and fix any errors until they all pass, you delegate the tedious work to the machine while ensuring the output meets your project’s quality standards.&lt;/p&gt;&lt;h3 id=&quot;giving-the-software-an-ooda-loop&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/#giving-the-software-an-ooda-loop&quot;&gt;Giving the software an OODA loop&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This “Quality Gates” pattern is effective because modern AI models can now operate in a feedback loop. The article connects this to the OODA loop, a decision-making model from military strategy.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/ooda-loop-boyd-650w.avif 650w, https://allarddewinter.net/assets/images/ooda-loop-boyd-960w.avif 960w, https://allarddewinter.net/assets/images/ooda-loop-boyd-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/ooda-loop-boyd-650w.webp 650w, https://allarddewinter.net/assets/images/ooda-loop-boyd-960w.webp 960w, https://allarddewinter.net/assets/images/ooda-loop-boyd-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/ooda-loop-boyd-650w.jpeg 650w, https://allarddewinter.net/assets/images/ooda-loop-boyd-960w.jpeg 960w, https://allarddewinter.net/assets/images/ooda-loop-boyd-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/ooda-loop-boyd-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;572&quot; alt=&quot;Diagram of the OODA loop: Observe, Orient, Decide, Act.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;The OODA loop, developed by John Boyd. &lt;a href=&quot;https://en.wikipedia.org/wiki/OODA_loop&quot;&gt;Source: Wikipedia&lt;/a&gt;.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Wikipedia describes the OODA loop as follows:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The OODA loop (observe, orient, decide, act) is a decision-making model developed by United States Air Force Colonel John Boyd. […] The approach explains how agility can overcome raw power in dealing with human opponents. An entity (whether an individual or an organization) that can process this cycle quickly, observing and reacting to unfolding events more rapidly and/or more effectively than an opponent, can thereby get inside the opponent’s decision cycle and gain the advantage.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;When an AI agent writes code that fails a linting check (Observe), it analyses the error (Orient), determines a fix (Decide), and rewrites the code (Act). It repeats this cycle until all gates pass, effectively giving the development process its own primitive OODA loop.&lt;/p&gt;&lt;h3 id=&quot;an-evolution-of-steering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/onboarding-ai-with-readmes-and-quality-gates/#an-evolution-of-steering&quot;&gt;An evolution of steering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This approach feels like a natural evolution from the concepts in my previous post. Where “vibe coding” with rulebooks is about actively &lt;em&gt;steering&lt;/em&gt; the AI with prompts, this method is about building a self-correcting &lt;em&gt;environment&lt;/em&gt;. It shifts the focus from micromanagement to system design. The developer defines the “laws of physics”—the tech stack, architecture, and quality standards—and the AI operates within that well-defined world.&lt;/p&gt;&lt;p&gt;I plan to implement this system in my own projects. The dual benefit is what makes it so appealing: it creates clear, modular documentation that serves both human developers and our new AI assistants, making the entire development process more robust and efficient.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Simon Willison on the lethal trifecta and MCP security</title>
      <link href="https://allarddewinter.net/blog/simon-willison-on-the-lethal-trifecta-and-mcp-security/" />
      <updated>2025-08-09T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/simon-willison-on-the-lethal-trifecta-and-mcp-security/</id>
      <content type="html">
				&lt;p&gt;Simon Willison has published another excellent piece on the persistent security challenges in the world of AI, based on his recent talk at the Bay Area AI Security Meetup. You can find his full annotated presentation &lt;a href=&quot;https://simonwillison.net/2025/Aug/9/bay-area-ai/&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;He revisits the concept of prompt injection and expands on what he calls the “lethal trifecta”—a combination of capabilities that makes AI agents vulnerable to data theft.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The lethal trifecta of capabilities is:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Access to your private data&lt;/li&gt;&lt;li&gt;Exposure to untrusted content&lt;/li&gt;&lt;li&gt;The ability to externally communicate in a way that could be used to steal your data&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;When an AI agent combines these three features, it can become a target for attackers who can trick it into accessing private information and sending it to them.&lt;/p&gt;&lt;p&gt;Simon argues that many common mitigations, such as using an AI to scan for malicious prompts, are insufficient. He makes a point about the standards we should demand:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;… in application security, 99% is a failing grade! Imagine if our SQL injection protection failed 1% of the time.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This highlights a point that I find particularly frustrating: the security responsibility being placed on the end user. Most people are not aware of these risks. They are often just keen to experiment with the latest technology, and in doing so, can inadvertently create security holes. In my own company, we use Microsoft Copilot. While it offers clear benefits, it also introduces risks that need to be balanced with proper education—something that is often lacking. With the current lack of robust security standards for LLMs, it feels like we are simply waiting for the next security incident to happen.&lt;/p&gt;&lt;p&gt;This new post is a great follow-up to the ideas I summarised previously in “&lt;a href=&quot;https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/&quot;&gt;Security risks in LLM agents: Simon Willison’s insights&lt;/a&gt;”, where I first covered the lethal trifecta. It is worrying to see how fundamental these challenges remain. Simon’s critique of the Model Context Protocol (MCP) for outsourcing these critical security decisions to users is good. We need better-designed systems, not just better-informed users.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A periodic table for system design</title>
      <link href="https://allarddewinter.net/blog/a-periodic-table-for-system-design/" />
      <updated>2025-08-08T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-periodic-table-for-system-design/</id>
      <content type="html">
				&lt;p&gt;I came across a project on GitHub by Joy Arulraj that presents a “periodic table” of system design principles. The goal is to create a shared vocabulary for concepts that recur across different domains in computer science, such as databases, operating systems, and distributed systems.&lt;/p&gt;&lt;p&gt;The paper argues that different fields often use their own terminology for the same underlying ideas. As Arulraj notes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For newcomers, it can be challenging to spot connections across different domains due to the diversity of traditions and vocabularies: the same design principle may appear in different guises across domains.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This project attempts to solve this by distilling over 100 influential papers into a structured table of more than 40 design principles, grouped into themes like Structure, Efficiency, and Reliability.&lt;/p&gt;&lt;h3 id=&quot;a-systems-engineering-viewpoint&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-periodic-table-for-system-design/#a-systems-engineering-viewpoint&quot;&gt;A systems engineering viewpoint&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;From a systems engineering perspective, the effort to create a common language is valuable. A core part of systems engineering education focuses on structured design, defining system boundaries, understanding interfaces, and performing trade-off analyses. This table provides a vocabulary for these activities.&lt;/p&gt;&lt;p&gt;For example, a trade-off analysis often involves balancing principles from different groups in the table. One might need to relax consistency (&lt;code&gt;Cr&lt;/code&gt;) to improve scalability (&lt;code&gt;Sc&lt;/code&gt;), or choose between a generalised design (&lt;code&gt;Gr&lt;/code&gt;) and a common-case specialisation (&lt;code&gt;Cc&lt;/code&gt;). Having these principles explicitly named helps in articulating design decisions.&lt;/p&gt;&lt;p&gt;The methodology for selecting principles is also logical, requiring them to be abstract (implementation-independent) and general (applicable across domains).&lt;/p&gt;&lt;h3 id=&quot;applying-the-principles-effectively&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-periodic-table-for-system-design/#applying-the-principles-effectively&quot;&gt;Applying the principles effectively&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To get the most value from this resource, it is helpful to consider how to apply it. While the abbreviations offer a concise shorthand, they do introduce a learning curve. Taking the time to become familiar with the definitions is key to using the vocabulary fluently in discussions.&lt;/p&gt;&lt;p&gt;The table’s greatest strength is as a vocabulary for articulating design trade-offs, rather than as a prescriptive checklist. Approaching it as a checklist could inadvertently lead to over-engineering, which would contradict the foundational principle of Simplicity (&lt;code&gt;Si&lt;/code&gt;). The author rightly notes this in the paper, positioning it as a vocabulary to aid discussion.&lt;/p&gt;&lt;p&gt;Within the list, certain principles stand out as universally applicable starting points for any project. Concepts like &lt;strong&gt;Simplicity (&lt;code&gt;Si&lt;/code&gt;)&lt;/strong&gt;, &lt;strong&gt;Modularity (&lt;code&gt;Mo&lt;/code&gt;)&lt;/strong&gt;, and &lt;strong&gt;Policy/Mechanism Separation (&lt;code&gt;Pm&lt;/code&gt;)&lt;/strong&gt; are not just items on a list but core tenets of sound engineering that help manage complexity from the beginning.&lt;/p&gt;&lt;p&gt;The full project and the paper are available on GitHub: &lt;a href=&quot;https://github.com/jarulraj/periodic-table&quot; rel=&quot;noopener&quot;&gt;A Periodic Table of System Design Principles&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A deeper look at AI&#39;s impact through the SPACE framework</title>
      <link href="https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/" />
      <updated>2025-08-07T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/</id>
      <content type="html">
				&lt;p&gt;A short while ago, I posted about &lt;a href=&quot;https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/&quot;&gt;different frameworks for measuring developer productivity&lt;/a&gt;, including the holistic SPACE framework. I recently came across an article from &lt;em&gt;Research-Driven Engineering Leadership&lt;/em&gt; that provides a great real-world application of this model: &lt;a href=&quot;https://open.substack.com/pub/rdel/p/rdel-104-how-does-the-space-framework&quot; rel=&quot;noopener&quot;&gt;RDEL #104: How does the SPACE framework apply to AI’s impact on engineering?&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The article summarises a detailed study that surveyed over 500 developers to understand how AI tools are changing their work. The findings confirm what many of us might suspect, but it is valuable to see it backed by data.&lt;/p&gt;&lt;h3 id=&quot;key-findings-from-the-research&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/#key-findings-from-the-research&quot;&gt;Key findings from the research&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The study shows that AI adoption is widespread, with 75% of developers reporting regular use. For those who use AI, the benefits are clear across most dimensions of the SPACE framework:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Activity &amp; Efficiency:&lt;/strong&gt; 88% of users reported improved task throughput, and 82% felt their efficiency had increased.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; 71% believe AI helps them deliver more customer or business value.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Satisfaction:&lt;/strong&gt; 62% reported higher job satisfaction since using AI tools.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The research highlights that AI excels at handling repetitive work, freeing up developers to focus on more complex challenges. As some participants noted in the full paper:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“It takes care of so much tedious work!” “I’m still stuck solving all the hard problems”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-nuance-of-collaboration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/#the-nuance-of-collaboration&quot;&gt;The nuance of collaboration&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A more nuanced story emerges around the Collaboration dimension. Fewer than half of the developers (48%) agreed that AI improved their ability to collaborate, with a significant portion remaining neutral.&lt;/p&gt;&lt;p&gt;However, the qualitative interviews in the study revealed that AI is not hindering collaboration but changing its nature. Developers are less likely to interrupt colleagues with simple coding questions, as they can turn to an AI assistant first. This reduces low-value interruptions and shifts team conversations towards higher-value topics like architecture and brainstorming.&lt;/p&gt;&lt;h3 id=&quot;the-critical-role-of-team-culture&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-look-at-ais-impact-through-the-space-framework/#the-critical-role-of-team-culture&quot;&gt;The critical role of team culture&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The research also underscores a critical factor that goes beyond the tool itself: team and organisational culture. Developers in organisations that actively support AI adoption are &lt;strong&gt;seven times more likely&lt;/strong&gt; to use it daily.&lt;/p&gt;&lt;p&gt;This reinforces a key point from the research paper: when AI adoption is high within a team, individuals perceive greater benefits for both the team and themselves.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Developers on teams with higher AI adoption don’t just rate their team as more productive—they also report stronger personal agreement that AI makes themselves more productive.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This suggests that shared learning, best practices, and a supportive environment are essential for maximising the benefits of AI. It is not just about providing a tool, but about a culture where it can be used effectively. This study provides valuable evidence for why a multi-dimensional framework like SPACE is necessary to understand the true impact of a technology like AI.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A practical framework for trusting your gut</title>
      <link href="https://allarddewinter.net/blog/a-practical-framework-for-trusting-your-gut/" />
      <updated>2025-08-06T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-framework-for-trusting-your-gut/</id>
      <content type="html">
				&lt;p&gt;In business, we often talk about the balance between data-driven decisions and relying on gut feeling. While numbers provide a solid foundation, intuition plays a crucial role that is difficult to quantify. I came across this excellent article by Phil McKinney, which provides a practical way to structure this process.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--650w.avif 650w, https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--960w.avif 960w, https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--650w.webp 650w, https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--960w.webp 960w, https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--650w.jpeg 650w, https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--960w.jpeg 960w, https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/funny-representation-of-the-gut-feeling--1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;787&quot; alt=&quot;A funny representation of gut feeling&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Systematically investigating your gut feeling.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;In his post, “&lt;a href=&quot;https://philmckinney.substack.com/p/the-200m-gut-check-that-taught-me&quot; rel=&quot;noopener&quot;&gt;The $200M Gut Check That Taught Me Intuition Isn’t Magic&lt;/a&gt;”, McKinney shares two contrasting personal stories: one where he dismissed Twitter’s potential and another where his intuition saved his company from a $200 million bad acquisition. The difference, he argues, was not luck but the application of what he now calls the ‘Practical Thinking Framework’.&lt;/p&gt;&lt;p&gt;He posits that what we call ‘gut feeling’ is often our brain detecting inconsistencies between the official story and the underlying reality. The key is not to follow that feeling blindly but to use it as a trigger for a systematic investigation.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Most innovation failures happen because people address the stated situation rather than the real situation.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The framework consists of three steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Reality Recognition:&lt;/strong&gt; See the situation for what it actually is, not what it is presented to be.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Experience Application:&lt;/strong&gt; Use your specific knowledge and past experiences, not generic best practices.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stakeholder Psychology Reading:&lt;/strong&gt; Decode what people truly want, need, and fear, versus what they claim they need.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;McKinney’s core argument is that good judgment does not come from having better intuition, but from having a better system to analyse it.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The leaders with amazing judgment haven’t been blessed with superior gut feelings—they’ve systematised them.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;my-take&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-framework-for-trusting-your-gut/#my-take&quot;&gt;My take&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;What I find particularly valuable here is the idea that intuition should not be an endpoint, but a starting point for investigation. The framework provides the ‘how’—a structured way to validate that feeling, which is much more robust than either blindly trusting a hunch or ignoring it completely. It turns a vague feeling into a starting point for a practical analysis. This is a great bookmark for anyone who needs to make (high-stakes) decisions and wants to integrate their experience and intuition in a more structured way.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>An oral history of how ChatGPT disrupted the field of NLP</title>
      <link href="https://allarddewinter.net/blog/an-oral-history-of-how-chatgpt-disrupted-the-field-of-nlp/" />
      <updated>2025-08-05T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/an-oral-history-of-how-chatgpt-disrupted-the-field-of-nlp/</id>
      <content type="html">
				&lt;p&gt;This oral history from Quanta Magazine documents the disruption in the Natural Language Processing (NLP) field. When I first entered data science, NLP was a distinct specialisation. The colleagues I knew in that area were highly intelligent and research-focused, so reading about their collective experience with this shift is a useful reference.&lt;/p&gt;&lt;p&gt;The article, &lt;a href=&quot;https://www.quantamagazine.org/when-chatgpt-broke-an-entire-field-an-oral-history-20250430&quot; rel=&quot;noopener&quot;&gt;When ChatGPT Broke an Entire Field: An Oral History&lt;/a&gt;, uses interviews with researchers to tell the story of the NLP community’s journey from the introduction of the Transformer architecture to the release of ChatGPT.&lt;/p&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-650w.avif 650w, https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-960w.avif 960w, https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-650w.webp 650w, https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-960w.webp 960w, https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-650w.jpeg 650w, https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-960w.jpeg 960w, https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/a-group-of-dusty--academic-books-on-a-shelf-lookin-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;787&quot; alt=&quot;A shiny robot casually rewrites dusty academic books.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h3 id=&quot;key-moments-in-the-timeline&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-oral-history-of-how-chatgpt-disrupted-the-field-of-nlp/#key-moments-in-the-timeline&quot;&gt;Key moments in the timeline&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The article outlines a clear progression of events that reshaped the field:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;2017:&lt;/strong&gt; The “Attention Is All You Need” paper introduces the Transformer architecture, though its full impact was not immediately recognised.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;2018:&lt;/strong&gt; Google’s open-source model, BERT, begins to shatter performance records on NLP tasks, leading to a “benchmark boom”.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;2020:&lt;/strong&gt; OpenAI releases GPT-3. Its scale and capability to perform complex tasks with simple prompts was a shock to many researchers, leading to what one described as a “career-existential crisis”.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;2020-2022:&lt;/strong&gt; Debates intensify around model “understanding” and the ethics of scale, exemplified by the influential “Stochastic Parrots” paper.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;November 2022:&lt;/strong&gt; The public launch of ChatGPT acts as a “Chicxulub” moment, making many existing NLP research problems obsolete overnight.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;2023-Present:&lt;/strong&gt; The field reorients completely. NLP is largely absorbed into the broader AI landscape, with a focus on prompting, evaluation, and building foundational models.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;summary-of-the-disruption&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-oral-history-of-how-chatgpt-disrupted-the-field-of-nlp/#summary-of-the-disruption&quot;&gt;Summary of the disruption&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The release of GPT-3 in 2020 was the first major shock. As one professor noted, tasks that once formed the basis of a five-year PhD could suddenly be replicated in a month.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I’m trying out all the things that my recent Ph.D. students had done as their dissertations, and just realizing — oh my God, the thing that had taken a student five years? Seems like I could reproduce that in a month.&lt;br&gt;— Christopher Callison-Burch, University of Pennsylvania&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The public launch of &lt;strong&gt;ChatGPT&lt;/strong&gt; was the final, decisive event. It effectively ended entire categories of academic research.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;In a day, a lot of the problems that a large percentage of researchers were working on — they just disappeared.&lt;br&gt;— Iz Beltagy, Allen Institute for AI&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The aftermath has been a complete reorientation of the field, with researchers grappling with obsolete work, intense media attention, and a new reality driven by corporate-funded, large-scale AI.&lt;/p&gt;&lt;p&gt;The article effectively documents the human and professional consequences of rapid technological change. It confirms my early impression of the field being full of deep thinkers, and it is notable to see them navigate a revolution they helped create.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you achieve so much, you also have to accept that the debates are going to be heated. How else could it be?&lt;br&gt;— Christopher Potts, Stanford University&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>A practical guide to setting company policies</title>
      <link href="https://allarddewinter.net/blog/a-practical-guide-to-setting-company-policies/" />
      <updated>2025-08-04T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-guide-to-setting-company-policies/</id>
      <content type="html">
				&lt;p&gt;I came across an article on the Stay SaaSy blog about the important, and often delicate, task of setting company policies.&lt;/p&gt;&lt;p&gt;You can read the full piece here: &lt;a href=&quot;https://staysaasy.com/management/2025/05/05/setting-startup-policies.html&quot; rel=&quot;noopener&quot;&gt;Setting Startup Policies&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What I particularly appreciate is its clear perspective, which applies not just to startups but to any company. It covers the entire lifecycle of a policy, from its birth to its eventual dead. The author frames policy-setting as a core executive function and provides a set of practical rules to follow.&lt;/p&gt;&lt;p&gt;The article makes several valuable points, which I have summarised below:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Treat policies like products.&lt;/strong&gt; A policy needs to be well-designed to avoid unintended consequences. This involves using existing solutions as a starting point, getting wide feedback before release, and rolling them out progressively.&lt;blockquote&gt;&lt;p&gt;The best way to ensure that your policies make sense from top to bottom is to treat them like products.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ensure full transparency.&lt;/strong&gt; Secret exceptions or loopholes erode trust quickly. The author suggests an “all hands test”: if you would be nervous explaining the entire policy, including its exceptions, to the whole company, it needs to be rethought.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Do not punish good behaviour.&lt;/strong&gt; Policies should never create a situation where following the rules puts someone at a disadvantage. For example, a “use-it-or-lose-it” budget can punish teams that are fiscally responsible.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Allow for evolution.&lt;/strong&gt; The people most affected by a policy must have a way to influence its change. A policy should not become a fixed rule that harms one group to benefit another.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use them sparingly.&lt;/strong&gt; Creating policies can be a form of false productivity. It adds friction and can slow people down. Healthy organisations focus on pruning and automating rules that are no longer needed.&lt;blockquote&gt;&lt;p&gt;Many teams confuse creating policies with adding value – one of the most toxic mistakes that an organization can allow.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Helpful post for setting guardrails effectively.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Leadership co-processing with LLMs</title>
      <link href="https://allarddewinter.net/blog/leadership-co-processing-with-llms/" />
      <updated>2025-08-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/leadership-co-processing-with-llms/</id>
      <content type="html">
				&lt;p&gt;In the rapidly evolving landscape of AI, it is refreshing to see perspectives on Large Language Models (LLMs) that go beyond coding assistance or virtual companionship. James Stanier, in his post for &lt;em&gt;The Engineering Manager&lt;/em&gt;, provides a look at how leaders can use LLMs as a “co-processor” to enhance their thinking and decision-making.&lt;/p&gt;&lt;p&gt;He frames the core idea as follows:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Effectively, I now think of LLMs as a co-processor for my brain. It isn’t always correct or even trustworthy, but in practice it always puts momentum behind my thinking, and often helps me to see things from a different perspective.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Stanier outlines several practical techniques for integrating LLMs into leadership workflows:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Prompting:&lt;/strong&gt; Using simple prompts to inject momentum into problem-solving and overcome the initial friction of a blank page.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pair Prompting:&lt;/strong&gt; A collaborative method where two people use an LLM as a third member of the team to work through a problem, documenting the entire thought process.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Deep Research:&lt;/strong&gt; Leveraging the LLM as a research assistant to explore topics in depth, saving significant time.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Contrarian Thinking:&lt;/strong&gt; Employing the LLM to challenge assumptions and identify personal biases, leading to more robust decisions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Executive Assistant:&lt;/strong&gt; Using the LLM to prioritise tasks and structure the day, especially during busy periods.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Coach and Sounding Board:&lt;/strong&gt; A way to process thoughts and reactions to complex situations in a structured, two-way dialogue.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This perspective is valuable because it focuses on augmenting, not replacing, human thought. I particularly liked the concept of “pair prompting,” where the tool facilitates a richer, documented collaboration between two people.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Pair prompting is just like pair programming, but with an LLM as the third member of the team. The idea is that you and your partner can use the LLM to help you both think through a problem together, and it can help you to see things from a different perspective.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In my day-to-day work, I also use LLMs for many non-coding tasks. Beyond basic grammar and spelling checks, I use them to navigate complex situations. By using pre-set prompts based on principles like those from Michael Pilarczyk, I can more quickly find a path to a decisive, well-considered action.&lt;/p&gt;&lt;p&gt;Of course, it is crucial to remain critical. An LLM does not have the full context of a situation, nor to all of your thougths and ideas, so its output must be adapted and validated against your specific circumstances.&lt;/p&gt;&lt;p&gt;The full article by James Stanier offers more detail and example prompts. You can read it on his Substack: &lt;a href=&quot;https://theengineeringmanager.substack.com/p/leadership-co-processing-with-llms&quot; rel=&quot;noopener&quot;&gt;Leadership co-processing with LLMs&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Experimenting with Kilo Code and the Model Context Protocol</title>
      <link href="https://allarddewinter.net/blog/experimenting-with-kilo-code-and-the-model-context-protocol/" />
      <updated>2025-08-02T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/experimenting-with-kilo-code-and-the-model-context-protocol/</id>
      <content type="html">
				&lt;p&gt;For the past couple of weeks, I have been experimenting with AI-assisted coding tools. After trying Cursor, I started looking into &lt;a href=&quot;https://kilocode.ai/&quot; rel=&quot;noopener&quot;&gt;Kilo Code&lt;/a&gt;, an open-source alternative that plugs into VS Code. My main motivation was to gain more flexibility, specifically the ability to experiment with models of my own choosing, like the Kimi K2 model from Moonshot via &lt;a href=&quot;https://openrouter.ai/&quot; rel=&quot;noopener&quot;&gt;OpenRouter&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Kilo Code accelerates development with AI-driven code generation and task automation. This open source extension plugs directly into VS Code.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;My initial impressions are positive. I particularly like the ease with which you can change the rules for the AI and the availability of different modes, such as the ‘Architect’ mode, which adapts the AI’s persona for specific tasks.&lt;/p&gt;&lt;h3 id=&quot;the-challenge-with-the-model-context-protocol&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/experimenting-with-kilo-code-and-the-model-context-protocol/#the-challenge-with-the-model-context-protocol&quot;&gt;The challenge with the Model Context Protocol&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;However, I ran into a snag while trying to set up the Playwright Model Context Protocol (MCP) to allow the AI to control a web browser. The Playwright documentation suggested a simple ‘add to cursor’ button, but this did not work as expected within Kilo Code. I could see in the logs that the server was spinning up correctly, but Kilo Code itself could not connect. It took some digging to realise the server was being initiated in the context of my main editor, not within Kilo Code’s environment.&lt;/p&gt;&lt;p&gt;The solution was in the &lt;a href=&quot;https://kilocode.ai/docs/features/mcp/using-mcp-in-kilo-code#windows-configuration-example&quot; rel=&quot;noopener&quot;&gt;Kilo Code documentation&lt;/a&gt;, which provided a Windows-specific configuration for running MCP servers directly. Adapting the example was the key to getting it working:&lt;/p&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;mcpServers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;playwright&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cmd&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;/c&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;npx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;-y&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token string&quot;&gt;&quot;@playwright/mcp@latest&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;With the setup now working correctly, I am experimenting with a project to build a reverse hotel search: you select a room, and it finds the availability. It is still a work in progress, but it is a fun way to explore the capabilities of these new tools.&lt;/p&gt;&lt;p&gt;This hands-on experience of configuring tools and setting up protocols is a practical follow-up to my previous thoughts on &lt;a href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/&quot;&gt;structuring AI-assisted development&lt;/a&gt;. Having the right rules and configurations in place is essential to move beyond simple ‘vibe coding’ and into a more deliberate and powerful workflow.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Putting the developer at the centre of platform engineering</title>
      <link href="https://allarddewinter.net/blog/putting-the-developer-at-the-centre-of-platform-engineering/" />
      <updated>2025-08-01T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/putting-the-developer-at-the-centre-of-platform-engineering/</id>
      <content type="html">
				&lt;p&gt;I came across an article on the Stack Overflow blog, “&lt;a href=&quot;https://stackoverflow.blog/2025/07/23/building-better-platforms-with-continuous-discovery&quot; rel=&quot;noopener&quot;&gt;Building better platforms with continuous discovery&lt;/a&gt;”, which offers a tangible and practical perspective on platform engineering. It argues for adopting a product management practice—continuous discovery—to ensure platform teams build tools that developers, their customers, actually need and use.&lt;/p&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/skyscraper-dev-650w.avif 650w, https://allarddewinter.net/assets/images/skyscraper-dev-960w.avif 960w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/skyscraper-dev-650w.webp 650w, https://allarddewinter.net/assets/images/skyscraper-dev-960w.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/skyscraper-dev-650w.jpeg 650w, https://allarddewinter.net/assets/images/skyscraper-dev-960w.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/skyscraper-dev-960w.jpeg&quot; width=&quot;960&quot; height=&quot;720&quot; alt=&quot;An illustration showing construction workers listening to a developer&#39;s plan for a skyscraper.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;The core idea is to treat internal engineers as customers and to understand their workflows and pain points before building solutions. This prevents teams from creating tools that, while technically sound, do not get adopted because they solve the wrong problem. As the article states:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When discovery is missing, platform work starts to drift from its real purpose, which is empowering engineers to deploy working software faster and with confidence.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;While the article provides a strong framework, it is a bit light on the specific methods used to gather this continuous feedback from engineers. However, the central principle of placing the developer at the heart of the process is a valuable one, especially in larger corporate environments where platform teams can become disconnected from the developers they serve.&lt;/p&gt;&lt;p&gt;This approach is a practical next step to the ideas I explored in my post on “&lt;a href=&quot;https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/&quot;&gt;From platform engineering to platform democracy&lt;/a&gt;”. Where platform democracy describes the ‘what’—a more collaborative and flexible platform model—continuous discovery provides the ‘how’. It is the mechanism through which developers can contribute to and shape the platform, ensuring it meets their evolving needs.&lt;/p&gt;&lt;p&gt;It also connects well with the mindset of moving quickly, which I discussed in “&lt;a href=&quot;https://allarddewinter.net/blog/the-cost-of-being-wrong/&quot;&gt;The cost of being wrong&lt;/a&gt;”. By maintaining a tight feedback loop with developers, platform teams can iterate with more confidence. They can test assumptions early and often, reducing the risk of building the wrong thing for months on end. This aligns perfectly with the article’s conclusion:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Shipping fast is great. Shipping right is better. Discovery helps us do both.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Ultimately, continuous discovery is a useful framework for ensuring platform engineering delivers on its primary promise: helping developers ship valuable software more effectively.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Women as technology</title>
      <link href="https://allarddewinter.net/blog/women-as-technology/" />
      <updated>2025-07-31T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/women-as-technology/</id>
      <content type="html">
				&lt;p&gt;Today I visited an interesting exhibition at the Design Museum Den Bosch called &lt;a href=&quot;https://designmuseum.nl/tentoonstelling/vrouwen-als-technologie/&quot; rel=&quot;noopener&quot;&gt;‘Vrouwen als technologie’ (Women as Technology)&lt;/a&gt;. It provides a powerful perspective on how women’s roles in technology have been shaped, and often marginalised, over time.&lt;/p&gt;&lt;p&gt;It is quite sad to see how this marginalisation persists. For example, the film industry cemented the image of the “computer nerd” as a man, while in the early days of computing, it was often women who operated the large IBM machines. It was thought they could work with more focus and precision for longer periods, a skill deemed essential for operating both early computers and complex machinery like textile looms. This shift from operator to a male-dominated field is a recurring theme.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/ibm-machine-500w.avif 500w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/ibm-machine-500w.webp 500w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/ibm-machine-500w.jpeg 500w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/ibm-machine-500w.jpeg&quot; width=&quot;500&quot; height=&quot;396&quot; alt=&quot;A woman operating an IBM mainframe computer in the mid-20th century.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A woman operating an early IBM computer. Women were often hired for these roles due to their perceived ability to concentrate for long periods. Image source: &lt;a href=&quot;https://braythwayt.com/posterous/2012/03/29/a-womans-story.html&quot;&gt;Braythwayt.com&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The exhibition shows that technology is rarely neutral; it reflects the prevailing societal views of its time. It explores this through four key, and sometimes problematic, roles assigned to women.&lt;/p&gt;&lt;h3 id=&quot;some-roles-of-women-in-technology&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/women-as-technology/#some-roles-of-women-in-technology&quot;&gt;Some roles of women in technology&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The museum organises its narrative around four themes: women as calculators, homemakers, incubators, and lust machines.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Calculators and assistants&lt;/strong&gt;&lt;br&gt;This section reminded me of how the first computers were marketed. The computing power of early machines in the 1940s was sometimes measured in “girl-hours”. When the work became more valued, it symbolically became more ‘masculine’. We see this today with virtual assistants like Siri and Alexa, which are given female names and voices by default, reinforcing the idea of women in service roles.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Incubators&lt;/strong&gt;&lt;br&gt;The exhibition also touches on more confronting topics, such as how medical technology has been designed by men for women. There are some gruesome stories. The design of the first incubator (&lt;em&gt;couveuse&lt;/em&gt; in Dutch) treated the womb as a kind of industrial machine, reducing a natural process to a mechanical one. An 1875 papier-mâché model of a uterus, presented completely isolated from the woman herself, is an example of this detached, clinical view.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Lust machines&lt;/strong&gt;&lt;br&gt;The objectification continues with modern technology. AI robots and chatbots are often modelled on Western ideals of female beauty. It is telling that among the most popular applications for some large language models are chats with fictional female characters. The exhibition features a hyper-realistic sex robot from RealDoll, which highlights how technology is used to fulfil male desires.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The exhibition is rightly called Women as technology: not only because women are often reduced to machines, but also because they are interwoven with technology – as a driving force, as a critical consumer and as a brilliant designer. In short: as infinitely more than the smiling users of household appliances and secret vibrators.&lt;br&gt;— Doortje Lenders, Vrij Nederland&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The themes feel particularly relevant today. With major societal shifts like the reversal of Roe v. Wade in the United States and the growing online popularity of the ‘trad wife’ movement, it seems we are reinforcing some of the very stereotypes this exhibition critiques.&lt;/p&gt;&lt;p&gt;This exhibition does an excellent job of showing the ambivalent relationship between women and technology. It reveals how technology has both shaped and been shaped by these roles, but it also highlights the important contributions women have made and continue to make in the fields of computing, medicine, and design. It is a valuable perspective.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The bitter lesson for organisations</title>
      <link href="https://allarddewinter.net/blog/the-bitter-lesson-for-organisations/" />
      <updated>2025-07-30T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-bitter-lesson-for-organisations/</id>
      <content type="html">
				&lt;p&gt;I read another great piece by Ethan Mollick titled “&lt;a href=&quot;https://www.oneusefulthing.org/p/the-bitter-lesson-versus-the-garbage&quot; rel=&quot;noopener&quot;&gt;The Bitter Lesson versus The Garbage Can&lt;/a&gt;”. He presents two compelling concepts that are on a collision course.&lt;/p&gt;&lt;p&gt;First is the “Garbage Can Model” of organisations. This theory suggests that most companies are not the well-oiled machines we imagine. Instead, they are chaotic collections of problems, solutions, and people, where processes are often undocumented, informal, and evolved rather than designed. As Mollick shares from one case study:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The CEO, after being walked through the map, sat down, put his head on the table, and said, “This is even more fucked up than I imagined.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Second is “The Bitter Lesson” from the world of AI research. Coined by computer scientist Richard Sutton, it observes that attempts to build AI by encoding complex human knowledge are consistently beaten by general methods that leverage massive computational power. The AI simply figures out a better way on its own through brute force.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;…encoding human understanding into an AI tends to be worse than just letting the AI figure out how to solve the problem, and adding enough computing power until it can do it better than any human.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-core-conflict&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-bitter-lesson-for-organisations/#the-core-conflict&quot;&gt;The core conflict&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The central question Mollick raises is whether this Bitter Lesson will apply to our messy, “Garbage Can” organisations. Will we soon have AI agents that we can simply give an outcome—like “produce the weekly sales report”—and they will figure out how to navigate the internal chaos to deliver it, rendering our carefully crafted processes obsolete?&lt;/p&gt;&lt;p&gt;This seems logical. An AI trained on outcomes could find more efficient paths than the ones humans have created through habit and negotiation. It suggests a future where understanding &lt;em&gt;how&lt;/em&gt; work gets done is less important than clearly defining what a successful &lt;em&gt;output&lt;/em&gt; looks like.&lt;/p&gt;&lt;h3 id=&quot;where-humans-remain-essential&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-bitter-lesson-for-organisations/#where-humans-remain-essential&quot;&gt;Where humans remain essential&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This leads to an interesting question: if AI can optimise processes through brute force, where does that leave human expertise and historical knowledge? I believe our value shifts to areas that computation alone cannot address.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Defining ‘good’&lt;/strong&gt;: An AI can achieve a target, but a human must define it. For qualitative goals like “excellent customer service” or “a positive company culture,” human judgment is needed to set the parameters of success.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Handling ambiguity and ethics&lt;/strong&gt;: Business is not as clear-cut as a chess game. Humans are required to navigate situations with conflicting goals, ethical grey areas, and incomplete information. An AI might find the most &lt;em&gt;efficient&lt;/em&gt; way to a sale, but a human must ensure it is not a manipulative or brand-damaging one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Asking the right questions (first principles)&lt;/strong&gt;: An AI is exceptional at solving a problem it is given. Humans, however, are capable of questioning if we are solving the right problem in the first place. This first-principles thinking, which redefines the entire challenge, is a uniquely human form of innovation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Understanding ‘why’ (Chesterton’s Fence)&lt;/strong&gt;: Many seemingly inefficient processes exist for good, unwritten reasons—to maintain relationships, ensure legal compliance, or manage team morale. Humans provide the wisdom to understand &lt;em&gt;why&lt;/em&gt; a fence was built before tearing it down, preventing unforeseen consequences.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The future is not about AI replacing human processes wholesale. It is about a partnership where we use our uniquely human skills to direct the immense power of AI. We will set the destination, define the rules of the road, and let the AI find the best route.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The cost of being wrong</title>
      <link href="https://allarddewinter.net/blog/the-cost-of-being-wrong/" />
      <updated>2025-07-29T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-cost-of-being-wrong/</id>
      <content type="html">
				&lt;p&gt;I love this kind of perspective. As a deep thinker, I sometimes find myself analysing a decision to the point of paralysis. This article by Jack Vanlightly, “&lt;a href=&quot;https://jack-vanlightly.com/blog/2025/7/22/the-cost-of-being-wrong&quot; rel=&quot;noopener&quot;&gt;The Cost of Being Wrong&lt;/a&gt;”, offers a helpful perspective.&lt;/p&gt;&lt;p&gt;The core idea is that the cost of being wrong shapes how we make decisions. In science or civil engineering, mistakes can be catastrophic and set progress back years. In software, however, the cost of failure is often remarkably low. We can roll back a deployment, fix a bug, or pivot on an architectural choice without bringing down a bridge.&lt;/p&gt;&lt;p&gt;Vanlightly quotes a post that captures this idea perfectly:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Real founders? They make the wrong decision at 9am. Fix it by noon. Ship by 5. Coward founders are still scheduling the kickoff meeting. Your job isn’t to be liked. Your job is to be clear. Wrong but decisive beats right but timid… every single time.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This freedom to experiment and course-correct is one of the best parts of working in technology. Instead of agonising over finding the perfect, irreversible solution, we should embrace our ability to iterate.&lt;/p&gt;&lt;p&gt;As Vanlightly concludes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“So if you sometimes struggle with decision making, as I myself have done, just remember that software decisions are not irreversible, they do not have to be perfect.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It is a good and simple reminder. I recommend reading the full article for his complete analysis.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A refreshing, back-to-basics approach to coding with AI</title>
      <link href="https://allarddewinter.net/blog/a-refreshing-back-to-basics-approach-to-coding-with-ai/" />
      <updated>2025-07-28T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-refreshing-back-to-basics-approach-to-coding-with-ai/</id>
      <content type="html">
				&lt;p&gt;I came across an article by Salvatore Sanfilippo (antirez) titled “&lt;a href=&quot;https://antirez.com/news/154&quot; rel=&quot;noopener&quot;&gt;Coding with LLMs in the summer of 2025&lt;/a&gt;”. I find his perspective on using Large Language Models (LLMs) in development quite refreshing because it feels like a return to first principles.&lt;/p&gt;&lt;p&gt;Antirez argues that while frontier models like Gemini 2.5 Pro are incredibly powerful, their best use is as a direct extension of the programmer, not as an autonomous agent. The goal is not to have the AI do the work for you, but to amplify your own capabilities. He sees the ideal partnership as a “human+LLM equation” where the developer remains firmly in control.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I strongly believe the maximum quality of work is reached using the human+LLM equation.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;His approach is about maximising the effectiveness of this partnership by providing the LLM with extensive, high-quality context—the entire codebase, relevant documentation, and a “brain dump” of your own thoughts and goals.&lt;/p&gt;&lt;h3 id=&quot;retaining-control-no-agents-allowed&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-refreshing-back-to-basics-approach-to-coding-with-ai/#retaining-control-no-agents-allowed&quot;&gt;Retaining control: no agents allowed&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The most distinct part of his argument is the deliberate rejection of integrated agents and tools that automate the interaction with the LLM. He advocates for a more manual, explicit process: copying and pasting code from your terminal directly into a LLM’s interface and back again.&lt;/p&gt;&lt;p&gt;His reasoning is that this keeps the developer in the loop at all times. You are forced to see, review, and understand every piece of information the LLM receives and every suggestion it provides. This prevents the model from making decisions based on incomplete or incorrect context, which is a common failure point for many integrated tools.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;You must be in control of what the LLM can see when providing a reply.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;By acting as the manual interface, you ensure you are still the coder, just an augmented one. You retain a complete understanding of the code and its design, which is essential for building high-quality, robust software.&lt;/p&gt;&lt;h3 id=&quot;a-different-perspective-on-developer-augmentation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-refreshing-back-to-basics-approach-to-coding-with-ai/#a-different-perspective-on-developer-augmentation&quot;&gt;A different perspective on developer augmentation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This view provides an interesting contrast to the “vibe coding” approach I wrote about recently in “&lt;a href=&quot;https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/&quot;&gt;The last hurrah of human coding&lt;/a&gt;”, which relies on integrated tools like Cursor to structure the AI’s workflow.&lt;/p&gt;&lt;p&gt;While Alex MacCaw’s method uses rules and scaffolds to rein in the AI within an editor, antirez’s method achieves control by stepping outside the editor entirely. It is a more purist approach, ensuring nothing happens without the developer’s explicit action.&lt;/p&gt;&lt;p&gt;Both philosophies agree on the most important point: the developer’s experience, taste, and architectural judgment are irreplaceable. The debate is simply about the best interface for applying that judgment. Antirez’s method feels particularly suited for deep, foundational work where absolute clarity and control are needed. It is a reminder that sometimes, the most effective tools are the ones that keep us most engaged.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>People, principles, process, then product</title>
      <link href="https://allarddewinter.net/blog/people-principles-process-then-product/" />
      <updated>2025-07-26T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/people-principles-process-then-product/</id>
      <content type="html">
				&lt;p&gt;In his post, “&lt;a href=&quot;https://mikefisher.substack.com/p/people-principles-process-product&quot; rel=&quot;noopener&quot;&gt;People &gt; Principles &gt; Process &gt; Product&lt;/a&gt;”, Mike Fisher makes a case for the order in which leaders should focus their efforts. He argues that while the natural tendency is to jump straight into fixing or improving the product, this approach is backwards.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Despite this being most of our natural proclivity, I think it’s backwards. The order in which we should focus is people, principles, process, and then product.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Fisher suggests that true, sustainable success comes from building a solid foundation. This starts with getting the right &lt;strong&gt;people&lt;/strong&gt; on the team and fostering trust. Next, you establish the &lt;strong&gt;principles&lt;/strong&gt; that guide decision-making and define the culture. With those in place, you can create the &lt;strong&gt;processes&lt;/strong&gt; that enable smooth, repeatable execution. Only then, he argues, should the focus shift to the &lt;strong&gt;product&lt;/strong&gt;, which becomes the natural outcome of a well-functioning team.&lt;/p&gt;&lt;p&gt;I find this a clear and valuable way to think about delivering a product, whether as a team, department or an entire company. It particularly applies after a reorganisation, when realignment is critical. You might have the same people, but you still need to align on the new principles and processes.&lt;/p&gt;&lt;p&gt;I have seen what happens when you skip these steps. When principles are not well-established, people are left without clear guidance. They often revert to their old ways of working, which may have been effective in a previous structure but are not suited for the new one. They simply do not know any better because the new guiding principles and processes have not been properly established.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;In the end, great products are the byproduct of great teams, clear values, and thoughtful execution. That’s why the product comes last, because when everything else is working, it’s the natural outcome.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Skipping a step or getting the order wrong makes progress difficult. Fisher’s framework confirms that the sequence is effective for building products.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Networking for people who do not network</title>
      <link href="https://allarddewinter.net/blog/networking-for-people-who-do-not-network/" />
      <updated>2025-07-25T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/networking-for-people-who-do-not-network/</id>
      <content type="html">
				&lt;p&gt;I am not a natural networker, so I was glad to find this practical breakdown on the topic. While I recognise the benefits, it is an area where I would like to grow. The article from Stay SaaSy, “&lt;a href=&quot;https://staysaasy.com/networking/2024/12/11/networking-for-people-who-dont-network.html&quot; rel=&quot;noopener&quot;&gt;Networking For People Who Don’t Network&lt;/a&gt;”, offers some excellent, down-to-earth advice.&lt;/p&gt;&lt;p&gt;They compare networking to working out: a small, consistent effort can yield significant benefits.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The #1 missed opportunity in networking is failing to take the achingly simple steps to build a network from people you work with every day.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;a-summary-of-their-heuristics&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/networking-for-people-who-do-not-network/#a-summary-of-their-heuristics&quot;&gt;A summary of their heuristics&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Here is a scannable summary of their main points:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Start with your coworkers&lt;/strong&gt;: This is your most accessible and high-quality network. Be competent, a good teammate, and positive.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;It is a numbers game&lt;/strong&gt;: Meet many people without the pressure of making every connection a deep one.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Find what works for you&lt;/strong&gt;: Choose events you genuinely enjoy, whether that is small dinners or specific meetups, rather than forcing yourself into environments you dislike.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Nurture your network&lt;/strong&gt;: A simple “thinking of you” message or a semi-regular in-person meeting keeps relationships alive.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Do not act weird&lt;/strong&gt;: Avoid common pitfalls like asking someone to be your mentor on the first meeting or bragging.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I also found this point about workplace positivity very true:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Winners are inspired by ambition and shared victories, and complaining is pretty much the polar opposite.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Stay SaaSy has many other great posts, so their site is worth exploring. They also publish a newsletter on Substack.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Aligned autonomy: from military strategy to engineering teams</title>
      <link href="https://allarddewinter.net/blog/aligned-autonomy-from-military-strategy-to-engineering-teams/" />
      <updated>2025-07-24T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/aligned-autonomy-from-military-strategy-to-engineering-teams/</id>
      <content type="html">
				&lt;p&gt;I came across an interesting article in the Stack Overflow newsletter, “&lt;a href=&quot;https://stackoverflow.blog/2025/07/14/building-stronger-engineering-teams-with-aligned-autonomy/&quot; rel=&quot;noopener&quot;&gt;Building stronger engineering teams with aligned autonomy&lt;/a&gt;”, which discusses a leadership philosophy for empowering teams. The core idea is to give teams the freedom to make decisions independently (autonomy) while ensuring those decisions support the company’s broader goals (alignment).&lt;/p&gt;&lt;p&gt;The article describes this as offering “freedom within a framework, where engineers understand the why behind their work but have the space to figure out the how.” This approach relies on three key components:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;A clear north star:&lt;/strong&gt; A guiding, long-term objective.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Feedback loops:&lt;/strong&gt; Systems to measure impact and course-correct.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Guardrails, not gates:&lt;/strong&gt; Clear boundaries that define acceptable decisions without halting progress.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This concept immediately struck me as familiar, as it closely mirrors a fundamental doctrine used in military organisations like the U.S. Marine Corps and the Army: &lt;strong&gt;Mission Command&lt;/strong&gt;.&lt;/p&gt;&lt;h3 id=&quot;the-military-parallel-mission-command&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/aligned-autonomy-from-military-strategy-to-engineering-teams/#the-military-parallel-mission-command&quot;&gt;The military parallel: mission command&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In the military, the success of any operation hinges on achieving the mission objective. Mission Command is a command philosophy that empowers subordinate leaders to execute mission orders with disciplined initiative. A commander provides their “Intent”—a clear and concise statement of the purpose of the operation and the desired end state.&lt;/p&gt;&lt;p&gt;This Commander’s Intent explains the &lt;em&gt;what&lt;/em&gt; and the &lt;em&gt;why&lt;/em&gt;, but it deliberately does not specify the &lt;em&gt;how&lt;/em&gt;. It is then up to the individual unit leaders on the ground to determine the best way to achieve that objective based on the real-time situation they face. Completing the mission is paramount, and this decentralised execution allows for speed, adaptability, and resilience in a chaotic environment.&lt;/p&gt;&lt;h3 id=&quot;a-direct-comparison&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/aligned-autonomy-from-military-strategy-to-engineering-teams/#a-direct-comparison&quot;&gt;A direct comparison&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The parallels between “aligned autonomy” and “mission command” are striking. The concepts map almost directly onto each other:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;The “North Star”&lt;/strong&gt; in business is the military’s &lt;strong&gt;“Commander’s Intent”&lt;/strong&gt;. It defines the purpose and desired outcome.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;“Guardrails”&lt;/strong&gt; are the business equivalent of &lt;strong&gt;“Rules of Engagement”&lt;/strong&gt;. They set the non-negotiable limits for action.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;“Team Autonomy”&lt;/strong&gt; mirrors the military’s &lt;strong&gt;“Disciplined Initiative”&lt;/strong&gt;. It is the freedom to decide &lt;em&gt;how&lt;/em&gt; to achieve the mission within the given constraints.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The Stack Overflow article states that leaders must shift from “giving directions to providing context.” This is the essence of Mission Command. A leader’s primary job is to ensure everyone understands the strategic context so they can make effective independent decisions. As the article puts it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Leaders who want to build a culture of aligned autonomy need to undergo a mental shift: from giving directions to providing context. That means sharing the why but not dictating the what or how.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Whether on the battlefield or in a business, this principle creates highly effective organisations. This approach particularly appeals to me because it focuses on clear goals and efficient execution, without unnecessary fuss. It is not a new management trend but a time-tested leadership philosophy for achieving complex goals in dynamic environments. It proves that when you give talented people a clear purpose and the trust to execute—using or creating standard practices to get there—they will deliver remarkable results.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What makes a principal engineer different from a senior?</title>
      <link href="https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/" />
      <updated>2025-07-23T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/</id>
      <content type="html">
				&lt;p&gt;I recently watched an insightful video featuring Steve Hume, who spent 17 years as a Principal Engineer at Amazon. He shared a great deal about the company’s engineering culture, but what I found most interesting was his breakdown of the Principal Engineer role. It is not just the next step on the ladder; it is a leap into a different, and often more challenging, type of work.&lt;/p&gt;&lt;p&gt;The role is not about being the best coder; it is about navigating ambiguity and wielding influence, often with significant trade-offs.&lt;/p&gt;&lt;h3 id=&quot;the-leap-from-senior-to-principal&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/#the-leap-from-senior-to-principal&quot;&gt;The leap from senior to principal&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;At many companies, the path from Senior to a role like Staff or Principal is a linear progression. At Amazon, the path is deliberately different. They largely omit the “Staff Engineer” level, creating a huge step between Senior (L6) and Principal (L7). Hume notes the promotion is incredibly difficult, with thousands of Senior Engineers competing for a few hundred Principal roles.&lt;/p&gt;&lt;p&gt;A Senior Engineer at Amazon is a force within their team. They are expected to deliver complex projects and, crucially, own their services end-to-end. As Hume puts it, &lt;em&gt;“At Amazon, you don’t just build it—you’ll be paged at 3 AM when it breaks in production.”&lt;/em&gt; They lead through influence and documentation within their domain, but they cannot command other teams to do work. Their autonomy is bounded by their team’s scope.&lt;/p&gt;&lt;p&gt;The Principal role is a fundamental shift in three key areas.&lt;/p&gt;&lt;h3 id=&quot;1-from-solving-problems-to-defining-the-problem-space&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/#1-from-solving-problems-to-defining-the-problem-space&quot;&gt;1. From solving problems to defining the problem space&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is the most critical differentiator. A Senior Engineer solves a given problem. A Principal Engineer is given a vague business objective and must first define the problem itself, and then expand the entire menu of possible solutions.&lt;/p&gt;&lt;p&gt;When a VP says, “Improve availability for our NFL streams,” the Principal’s job is not to start optimising code. It is to ask:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Should we re-architect the service?&lt;/li&gt;&lt;li&gt;Should we buy a third-party solution?&lt;/li&gt;&lt;li&gt;Should we reallocate engineers from a lower-priority team to this problem?&lt;/li&gt;&lt;li&gt;Is this even the right problem to solve to achieve the business goal?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;They might even decide to kill a project if it is not the highest-impact work. This is about strategic leverage, not just technical execution.&lt;/p&gt;&lt;h3 id=&quot;2-autonomy-with-high-stakes-accountability&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/#2-autonomy-with-high-stakes-accountability&quot;&gt;2. Autonomy with high-stakes accountability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The role is not about “freedom from micromanagement.” It is about being thrust into ambiguity with high-stakes accountability. As Hume says, &lt;em&gt;“A VP tells you the direction, not the steps.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;A Principal is expected to take that vague directive and deliver a transformative solution without hand-holding. The other side is that if they fail, the consequence is not a performance improvement plan; it is a loss of trust from senior leadership. The feedback would be, &lt;em&gt;“This is not what I expected from a Principal.”&lt;/em&gt; That is a career-limiting outcome.&lt;/p&gt;&lt;h3 id=&quot;3-influence-over-authority-the-paradox-of-belonging&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/#3-influence-over-authority-the-paradox-of-belonging&quot;&gt;3. Influence over authority: The paradox of belonging&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Hume describes the Principal experience with a compelling phrase: &lt;em&gt;“You belong everywhere and nowhere.”&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This is not just about floating between teams; it is a significant psychological and political challenge. Principals operate in the gaps, which means they are constantly having to rebuild context in new domains. They often face friction from teams who may resent an “outsider” parachuting in to give advice.&lt;/p&gt;&lt;p&gt;Because they have no direct authority, they must lead entirely through influence. They work with teams by challenging assumptions, connecting people to avoid duplicated work, and using data and well-structured arguments (like the ‘six-pagers’) to build consensus. They act as guides and guardrails, not commanders. This status also leads to extreme bandwidth challenges, forcing them to prioritise ruthlessly, often at the expense of hands-on coding.&lt;/p&gt;&lt;h3 id=&quot;how-this-compares-to-our-own-expert-roles&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-a-principal-engineer-different-from-a-senior/#how-this-compares-to-our-own-expert-roles&quot;&gt;How this compares to our own expert roles&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This analysis makes the comparison to my own company’s structure much sharper. We have technical experts who are the highest authority within a specific domain. This model prioritises &lt;strong&gt;depth&lt;/strong&gt;. Our experts have deep, long-term context and ownership, which is invaluable for core business areas.&lt;/p&gt;&lt;p&gt;Amazon’s model is structurally different and deliberately so. By avoiding domain-aligned Principals, they force them to develop &lt;strong&gt;breadth&lt;/strong&gt;. Their value comes from identifying and solving systemic, cross-organisational problems that no single team can see or solve.&lt;/p&gt;&lt;p&gt;The trade-off is clear. Our model builds world-class specialists but may struggle to address issues that span multiple domains. Amazon’s model is designed to fix those systemic issues but means its Principals may lack the deep, focused expertise that our roles cultivate. Neither is inherently better, but they are optimised for different goals.&lt;/p&gt;&lt;p&gt;The video was an interesting look into a role defined by its trade-offs: influence over hands-on coding, breadth over depth, and autonomy at the cost of extreme accountability.&lt;/p&gt;&lt;p&gt;You can watch the full video here: &lt;a href=&quot;https://www.youtube.com/watch?v=vZGycBUc1vM&quot; rel=&quot;noopener&quot;&gt;What is a Principal Engineer at Amazon? With Steve Huynh&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Roger Martin on going on the offensive with creative strategy</title>
      <link href="https://allarddewinter.net/blog/roger-martin-on-going-on-the-offensive-with-creative-strategy/" />
      <updated>2025-07-22T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/roger-martin-on-going-on-the-offensive-with-creative-strategy/</id>
      <content type="html">
				&lt;p&gt;I recently came across an interesting article by Roger Martin, “&lt;a href=&quot;https://rogermartin.medium.com/going-on-the-offensive-with-creative-strategy-3310d9c1c2d6&quot; rel=&quot;noopener&quot;&gt;Going on the Offensive with Creative Strategy&lt;/a&gt;,” which questions a foundational principle of modern business. His argument is a direct challenge to the way many of us, myself included, have been taught to approach new ideas.&lt;/p&gt;&lt;h3 id=&quot;the-core-argument&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/roger-martin-on-going-on-the-offensive-with-creative-strategy/#the-core-argument&quot;&gt;The core argument&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Martin posits that the business world is dominated by “analytics”—executives who believe that the future can be accurately predicted by rigorously analysing data from the past. On the other side are the “creatives”—the innovators and designers trying to build something new.&lt;/p&gt;&lt;p&gt;The problem arises when creatives are forced to justify their new ideas using the analytics’ framework. They are asked to prove future success with historical data, which is an impossible task for something that has never existed before. As Martin notes, this is a game creatives are destined to lose.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Creatives have a strong tendency to attempt to defend their ideas while implicitly or explicitly accepting the dominant premise.&lt;/p&gt;&lt;/blockquote&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/knight-robot-650w.avif 650w, https://allarddewinter.net/assets/images/knight-robot-960w.avif 960w, https://allarddewinter.net/assets/images/knight-robot-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/knight-robot-650w.webp 650w, https://allarddewinter.net/assets/images/knight-robot-960w.webp 960w, https://allarddewinter.net/assets/images/knight-robot-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/knight-robot-650w.jpeg 650w, https://allarddewinter.net/assets/images/knight-robot-960w.jpeg 960w, https://allarddewinter.net/assets/images/knight-robot-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/knight-robot-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;787&quot; alt=&quot;A knight with a paintbrush jousts with a robot holding an abacus.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Creativity versus analytics: a battle of methodologies.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h3 id=&quot;the-flaw-in-the-analytical-premise&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/roger-martin-on-going-on-the-offensive-with-creative-strategy/#the-flaw-in-the-analytical-premise&quot;&gt;The flaw in the analytical premise&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Martin argues that this reliance on historical data is fundamentally flawed, a point made centuries ago by thinkers like Aristotle and Charles Sanders Peirce. Aristotle pointed out that data analysis is only useful if we are certain the future will be identical to the past—a rare occurrence in business. Peirce went further, stating that no truly new idea has ever been proven analytically in advance.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When analytics ask creatives to prove a new idea in advance analytically, they are asking the creatives to do something that has never been done in the history of the world — good luck with that!&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This creates an environment where forecasting becomes a comforting illusion rather than a useful tool for genuine innovation.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It is the great pacifier of modern business — revenue forecasting makes analytics feel good, even if it provides no more value than popping a pacifier in a baby’s mouth.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;a-critical-reflection&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/roger-martin-on-going-on-the-offensive-with-creative-strategy/#a-critical-reflection&quot;&gt;A critical reflection&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Martin’s argument made me reflect on my own work. I see a large reliance on trying to predict business outcomes based on past data, which is exactly what he criticises. It is important, however, to distinguish this from other types of prediction. For instance, in predictive maintenance, we are not forecasting unpredictable human behaviour in a market. Instead, we are predicting machine failure based on sensor data and physical principles. We can say, “We are 95% confident this machine will fail within the next 30 days.” This is a calculated probability within a more constrained system, allowing for informed operational decisions. It is fundamentally different from trying to forecast revenue for a product that does not exist yet.&lt;/p&gt;&lt;p&gt;Martin’s core point about business strategy remains valid and important. Truly great business ideas are rarely born from maintaining the status quo. Sticking to the proven path may yield marginal gains with some confidence, but it will not lead to breakthrough innovations. Look at a tool like the &lt;a href=&quot;https://cursor.sh/&quot; rel=&quot;noopener&quot;&gt;Cursor IDE&lt;/a&gt;; it was not created by marginally improving existing code editors but by fundamentally rethinking the developer workflow with AI at its core.&lt;/p&gt;&lt;h3 id=&quot;why-an-offensive-stance-is-better&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/roger-martin-on-going-on-the-offensive-with-creative-strategy/#why-an-offensive-stance-is-better&quot;&gt;Why an offensive stance is better&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To escape this trap, Martin urges creatives to stop defending their ideas on the analytics’ terms and instead go on the offensive. This means questioning the assumptions behind the status quo.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For Innovation in Modern Business, the only Defense is Offense.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Instead of trying to prove your new idea will work, challenge the assumption that the current model will continue to work indefinitely. This shifts the conversation from defending the unknown to comparing two possible futures: one based on a new idea and one based on the increasingly fragile assumption that nothing will change.&lt;/p&gt;&lt;p&gt;This “offensive” mindset is more powerful in general because it is proactive. It is about taking control of the narrative, setting the terms of the discussion, and actively shaping the future rather than passively reacting to the past. It is a shift from defence to creation.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Include your tests in coverage reports</title>
      <link href="https://allarddewinter.net/blog/include-your-tests-in-coverage-reports/" />
      <updated>2025-07-21T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/include-your-tests-in-coverage-reports/</id>
      <content type="html">
				&lt;p&gt;I recently came across this article by &lt;a href=&quot;https://nedbatchelder.com/blog/201908/dont_omit_tests_from_coverage.html&quot; rel=&quot;noopener&quot;&gt;Ned Batchelder&lt;/a&gt;. He makes a case against the common practice of omitting test files from code coverage reports. I completely agree with him.&lt;/p&gt;&lt;p&gt;He argues that your tests are code too and should be scrutinised. Including them can help you find issues you might otherwise miss. Here are the main reasons why:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;It helps detect simple errors&lt;/strong&gt;, like accidentally duplicating a test by copy-pasting and forgetting to rename the function. The old test would be overwritten, but coverage would show the code as un-run.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;It can identify unused helper code&lt;/strong&gt; within your test suite. If a helper function or a specific clause is never executed, it is worth investigating why.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;It provides a more complete picture&lt;/strong&gt; of your codebase. While it might increase your overall coverage percentage, that is not a bad thing. You can always adjust your target percentage accordingly.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It is a small change in configuration that can provide valuable feedback on the quality of your test suite. You can read his full article for more details.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Lessons on building software quickly</title>
      <link href="https://allarddewinter.net/blog/lessons-on-building-software-quickly/" />
      <updated>2025-07-20T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/lessons-on-building-software-quickly/</id>
      <content type="html">
				&lt;p&gt;I recently came across an article by Evan Hahn titled “&lt;a href=&quot;https://evanhahn.com/how-i-build-software-quickly/&quot; rel=&quot;noopener&quot;&gt;How I build software quickly&lt;/a&gt;”. It is a practical and down-to-earth read on a topic that is relevant to every developer: finding the right balance between speed and quality.&lt;/p&gt;&lt;p&gt;What I appreciate is that while Large Language Models (LLMs) are mentioned, the focus remains on foundational practices. It is a refreshing perspective that earns bonus points from me.&lt;/p&gt;&lt;p&gt;Evan covers several useful techniques, but a few, in particular, stood out to me.&lt;/p&gt;&lt;h3 id=&quot;key-takeaways&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/lessons-on-building-software-quickly/#key-takeaways&quot;&gt;Key takeaways&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fine-tuning requirements&lt;/strong&gt;: One of the most effective ways to work faster is to do less. Evan makes a great point about questioning and softening requirements where possible. This strategic approach can prevent a lot of unnecessary work.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building top to bottom&lt;/strong&gt;: His advice to build “top to bottom” is very practical. He suggests starting with the user-facing part first to ensure the underlying logic serves the actual use case from the beginning.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Build the top layer first—the “dream code” I want to write or the API I wish existed—rather than trying to build the “bottom” layer first. It’s easier to make the right API decisions when I start with how it will be used.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Using a timer&lt;/strong&gt;: The simple trick of setting a timer to stay focused is something I can relate to. It is an effective way to avoid getting “lost in the mud” and wandering through the codebase.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;My estimates are frequently wrong, but when the timer goes off, I’m often jolted out of some silly distraction.&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extracting smaller changes&lt;/strong&gt;: I also found the suggestion to extract smaller, self-contained changes (like a dependency update or a minor bug fix) into separate patches very useful. It simplifies reviews and makes the main task easier to manage.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The article contains many more valuable points, including the importance of rough drafts and making small, incremental changes. I highly recommend reading the full post on Evan Hahn’s website for a complete picture.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The Pragmatic Engineer 2025 survey</title>
      <link href="https://allarddewinter.net/blog/the-pragmatic-engineer-2025-survey/" />
      <updated>2025-07-19T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-pragmatic-engineer-2025-survey/</id>
      <content type="html">
				&lt;p&gt;I always appreciate articles like the annual survey from The Pragmatic Engineer. They provide a great overview of what is currently being used across the industry. It is a good way to get ideas about what other people are using and to discover tools you might not have heard of. After reading this year’s edition, I have definitely found one or two new tools that I am going to try out.&lt;/p&gt;&lt;p&gt;You can read the full, detailed survey here: &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/the-pragmatic-engineer-2025-survey&quot; rel=&quot;noopener&quot;&gt;The Pragmatic Engineer 2025 Survey&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Below are a few of my key takeaways.&lt;/p&gt;&lt;h3 id=&quot;the-rise-of-ai-and-vibe-coding-tools&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-pragmatic-engineer-2025-survey/#the-rise-of-ai-and-vibe-coding-tools&quot;&gt;The rise of AI and ‘vibe coding’ tools&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;It is no surprise that AI tools are prominent, but the speed of change is remarkable. While &lt;strong&gt;GitHub Copilot&lt;/strong&gt; remains extremely popular, the survey shows that newer tools like &lt;strong&gt;Cursor&lt;/strong&gt; are gaining ground very quickly. It is also interesting to see &lt;strong&gt;Claude&lt;/strong&gt; closing the gap with &lt;strong&gt;ChatGPT&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The article also mentions several “vibe coding” tools, such as &lt;strong&gt;Vercel v0&lt;/strong&gt; and &lt;strong&gt;Bolt.new&lt;/strong&gt;. These seem to be aimed at less technical audiences who want to create prototypes or mockups quickly. It confirms that there is a growing market for tools that assist non-developers in bringing ideas to life, which I guess makes a lot of sense.&lt;/p&gt;&lt;h3 id=&quot;a-surprise-in-the-ide-landscape&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-pragmatic-engineer-2025-survey/#a-surprise-in-the-ide-landscape&quot;&gt;A surprise in the IDE landscape&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;I was genuinely surprised to see how popular JetBrains’ suite of IDEs is. I had the impression they were a much smaller player in the market, but the survey data shows they are a strong competitor to Microsoft’s offerings like &lt;strong&gt;VS Code&lt;/strong&gt;.&lt;/p&gt;&lt;h3 id=&quot;the-most-loved-and-most-hated-tools&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-pragmatic-engineer-2025-survey/#the-most-loved-and-most-hated-tools&quot;&gt;The most-loved and most-hated tools&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;One of the most hated tools is &lt;strong&gt;JIRA&lt;/strong&gt;, by a large margin. The main complaints are that it is slow, complex, and cumbersome. On the other hand, tools like &lt;strong&gt;Linear&lt;/strong&gt;, &lt;strong&gt;VS Code&lt;/strong&gt;, and the &lt;strong&gt;JetBrains&lt;/strong&gt; IDEs receive a lot of positive mentions. It seems that developers value speed and simplicity above all else.&lt;/p&gt;&lt;p&gt;Overall, the survey is a valuable snapshot of the current state of developer tooling. It is a great resource for anyone looking to understand current trends or discover new tools to improve their workflow.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Practical lessons from Meta on improving code</title>
      <link href="https://allarddewinter.net/blog/practical-lessons-from-meta-on-improving-code/" />
      <updated>2025-07-18T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/practical-lessons-from-meta-on-improving-code/</id>
      <content type="html">
				&lt;p&gt;Following on from my last post about &lt;a href=&quot;https://allarddewinter.net/blog/the-human-cost-of-technical-debt/&quot;&gt;the human cost of technical debt&lt;/a&gt;, it is clear that actively managing code quality is crucial for team morale and confidence. The next question is: how can we do this effectively?&lt;/p&gt;&lt;p&gt;The &lt;a href=&quot;https://open.substack.com/pub/rdel/p/rdel-101-what-can-we-learn-from-metas&quot; rel=&quot;noopener&quot;&gt;Research-Driven Engineering Leadership newsletter&lt;/a&gt; pointed me towards a &lt;a href=&quot;https://arxiv.org/html/2504.12517v2&quot; rel=&quot;noopener&quot;&gt;research paper from Meta&lt;/a&gt; that details their systematic approach to improving a massive, rapidly evolving codebase. Their findings offer practical lessons for teams of any size.&lt;/p&gt;&lt;p&gt;At Meta, code improvement is not an afterthought. The research found that over 14% of all code changes were explicitly for improvement purposes. This is a significant investment and shows a deep commitment to maintainability.&lt;/p&gt;&lt;p&gt;Their approach is a mix of top-down strategic initiatives and bottom-up, organic work from individual engineers. What I is interesting is how they decide where to focus their efforts: it is based on data.&lt;/p&gt;&lt;h3 id=&quot;practical-lessons&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/practical-lessons-from-meta-on-improving-code/#practical-lessons&quot;&gt;Practical lessons&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The research highlights several key practices that we can adapt for our own teams.&lt;/p&gt;&lt;h4 id=&quot;1-make-improvement-work-visible-and-measurable&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/practical-lessons-from-meta-on-improving-code/#1-make-improvement-work-visible-and-measurable&quot;&gt;1. Make improvement work visible and measurable&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;At Meta, improvement work is explicitly tagged. This prevents it from being invisible labour buried within feature development. By tracking this work, teams can understand how much effort is being dedicated to code health and recognise engineers for their contributions. We can do this with specific tags or task types in our project management tools.&lt;/p&gt;&lt;h4 id=&quot;2-prioritise-with-data-not-just-intuition&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/practical-lessons-from-meta-on-improving-code/#2-prioritise-with-data-not-just-intuition&quot;&gt;2. Prioritise with data, not just intuition&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The Meta teams use over 20 different criteria to prioritise which parts of the codebase to improve. This goes far beyond simply looking for “code smells.” Some of the most compelling criteria they use are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Outage history:&lt;/strong&gt; Files frequently associated with production issues are obvious candidates for improvement.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Authoring speed:&lt;/strong&gt; They measure Diff Authoring Time (DAT). If it consistently takes a long time to make changes to a specific file, it is a sign of high complexity or poor design.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Knowledge loss:&lt;/strong&gt; They track the percentage of changes made by developers who have since left the company. A high percentage indicates a knowledge silo and a potential risk, making that code a priority for refactoring and documentation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Centrality:&lt;/strong&gt; They analyse how interconnected a piece of code is. Improving central, highly-depended-on components has a much larger ripple effect across the system.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;3-foster-a-culture-of-continuous-improvement&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/practical-lessons-from-meta-on-improving-code/#3-foster-a-culture-of-continuous-improvement&quot;&gt;3. Foster a culture of continuous improvement&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Meta’s “Better Engineering” initiative encourages teams to allocate 20-30% of their time to these projects. They support this with training, tooling, and even gamification elements like profile badges for deleting code or fixing high-priority issues.&lt;/p&gt;&lt;p&gt;While we might not need a company-wide gamification system, the principle is sound: create time and space for improvement, and actively recognise and reward the effort.&lt;/p&gt;&lt;p&gt;What this research from Meta demonstrates is that managing technical debt can be a mature engineering discipline. These practical, data-driven approaches are the antidote to the falling morale and reduced confidence discussed previously. By making improvement a visible, valued, and systematic part of work, we not only build better software but also foster healthier and more effective engineering teams.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A deeper dive into systems engineering: from design to disposal</title>
      <link href="https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/" />
      <updated>2025-07-17T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/</id>
      <content type="html">
				&lt;p&gt;A short while ago, I wrote an &lt;a href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/&quot; rel=&quot;noopener&quot;&gt;overview of the core concepts of systems engineering&lt;/a&gt;, summarising the first half of the &lt;a href=&quot;https://www.coursera.org/learn/systems-engineering&quot; rel=&quot;noopener&quot;&gt;Introduction to Systems Engineering&lt;/a&gt; course I am taking. I have now completed the second half, and it has been just as valuable. This part of the course moves from the foundational ‘what’ to the practical ‘how’, covering the entire lifecycle from detailed design and production to operational use and eventual disposal.&lt;/p&gt;&lt;p&gt;This post synthesises the key ideas from these final modules. It covers the transition from a logical design to a physical product, the activities required to support a system in the real world, and the management disciplines needed to keep the entire process on track.&lt;/p&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/squirrel-team-650w.avif 650w, https://allarddewinter.net/assets/images/squirrel-team-960w.avif 960w, https://allarddewinter.net/assets/images/squirrel-team-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/squirrel-team-650w.webp 650w, https://allarddewinter.net/assets/images/squirrel-team-960w.webp 960w, https://allarddewinter.net/assets/images/squirrel-team-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/squirrel-team-650w.jpeg 650w, https://allarddewinter.net/assets/images/squirrel-team-960w.jpeg 960w, https://allarddewinter.net/assets/images/squirrel-team-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/squirrel-team-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;A team of squirrels in hard hats and high-visibility vests carefully reviewing a complex blueprint for a simple birdhouse.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h3 id=&quot;from-blueprint-to-build&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#from-blueprint-to-build&quot;&gt;From blueprint to build&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The first half of the course focused on defining the problem and establishing the system’s requirements (the ‘what’). The second half dives into creating the solution (the ‘how’). This journey is a structured progression from a high-level concept to a detailed, buildable design.&lt;/p&gt;&lt;p&gt;The process starts by decomposing the overall system into interconnected subsystems. For each subsystem, a critical decision must be made on how to acquire it. This is a trade-off between cost, schedule, risk, and performance.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Option&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;pro&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;con&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;COTS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Commercial Off-the-Shelf&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Low cost, low risk, immediate availability.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;May be an imperfect fit for requirements.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;MOTS&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Modified Off-the-Shelf&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;A tailored solution built on a known base.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Modification adds risk, cost, and schedule delays.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Developmental&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Built from scratch.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Potential for a “perfect” fit.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Highest risk, cost, and longest schedule.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;A core activity throughout this phase is &lt;strong&gt;requirements traceability&lt;/strong&gt;. Every feature in the design must trace back to an authorised requirement. This is the primary defence against ‘requirements creep’—the tendency for a system to become more complex than necessary.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;For example, a team might build a fantastic, feature-rich air conditioner for a car, but if its extra weight and power consumption cause the car to fail its overall efficiency targets, the team has created a great subsystem but a failing system.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Backward traceability prevents this by forcing the question: “Which top-level requirement does this feature support?”&lt;/p&gt;&lt;p&gt;This design effort concludes with two major milestones that act as quality gates:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Preliminary Design Review (PDR):&lt;/strong&gt; Confirms that the high-level design approach for each subsystem is sound before committing to the expensive detailed design phase.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Critical Design Review (CDR):&lt;/strong&gt; The final gate before production. It confirms the detailed design is complete, correct, and ready for manufacturing.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;the-system-in-the-wild&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#the-system-in-the-wild&quot;&gt;The system in the wild&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Once the design is approved at the CDR, the systems engineer’s role shifts from creation to oversight. The focus is on ensuring the system is built, operated, and supported correctly.&lt;/p&gt;&lt;h4 id=&quot;production-and-construction&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#production-and-construction&quot;&gt;Production and construction&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;During this phase, the main activities are &lt;strong&gt;Verification&lt;/strong&gt; and &lt;strong&gt;Configuration Audits&lt;/strong&gt;. Verification is the process of confirming that the as-built system meets its specified requirements. This is not just testing; it involves a combination of methods:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Inspection:&lt;/strong&gt; Looking at the system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Analysis:&lt;/strong&gt; Using calculations or certificates.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Demonstration:&lt;/strong&gt; Showing it can perform a function.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Test:&lt;/strong&gt; Using equipment to measure performance.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;At the same time, a &lt;strong&gt;Physical Configuration Audit (PCA)&lt;/strong&gt; is performed. This audit confirms that the system’s documentation perfectly matches the physical product. This must be done &lt;em&gt;during&lt;/em&gt; construction, not after. For example, you confirm the exact location of a stormwater pipe in an open trench before it is buried. This creates an accurate record that is invaluable for future maintenance and modifications.&lt;/p&gt;&lt;h4 id=&quot;utilisation-and-support&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#utilisation-and-support&quot;&gt;Utilisation and support&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Once the system is operational, it requires ongoing support. This happens at different levels, from day-to-day operational tasks performed by the user to deeper engineering support for modifications and upgrades. Any modification is treated as a “mini” systems engineering project, requiring a formal process to avoid introducing new problems.&lt;/p&gt;&lt;h4 id=&quot;disposal&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#disposal&quot;&gt;Disposal&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Finally, every system has an end-of-life. Planning for disposal from the very beginning is a key part of modern systems engineering. This applies to software as well. Retiring a legacy enterprise system is not just about turning off a server. It involves a planned process of data migration to a new system, ensuring data integrity, and securely wiping sensitive customer information from old databases and backups to comply with privacy regulations like GDPR. Without a plan, companies risk data loss, security breaches, and legal penalties.&lt;/p&gt;&lt;h3 id=&quot;managing-the-machine&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#managing-the-machine&quot;&gt;Managing the machine&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Underpinning the entire lifecycle is a set of management disciplines that provide control and mitigate risk. Without them, complex projects can quickly descend into chaos.&lt;/p&gt;&lt;p&gt;The course highlighted four key areas:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Management Function&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Purpose&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Key Activities&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Verification &amp; Validation (V&amp;V)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;To prove we built the system right (Verification) and that we built the right system (Validation).&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Planning and executing a progressive evaluation program, from component tests to final operational evaluation.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Configuration Management&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;To ensure the system’s configuration is known, accurate, and controlled at all times.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Identifying what is under control, tracking its status, managing changes formally, and auditing the process.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Technical Risk Management&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;To identify, assess, and treat risks that could cause the system to fail technically.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Assessing the likelihood and consequence of risks; treating them by avoiding, reducing, or transferring them.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Technical Reviews&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;To assess progress at logical points, detect errors early, and approve plans for the next phase.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Conducting formal reviews like the PDR and CDR to ensure readiness before proceeding.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;All of these activities are documented in a &lt;strong&gt;Systems Engineering Management Plan (SEMP)&lt;/strong&gt;. This is the master plan for the entire technical effort, defining the strategies, processes, and resources for the project.&lt;/p&gt;&lt;h3 id=&quot;final-thoughts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-deeper-dive-into-systems-engineering-from-design-to-disposal/#final-thoughts&quot;&gt;Final thoughts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This second half of the course provided a clear framework for how a system moves from an idea to a real-world entity and through to its eventual retirement. The emphasis on structured processes, continuous verification, and proactive management is a powerful lesson. It shows that systems engineering is not just a collection of technical tasks, but a holistic discipline for managing complexity and ensuring that what we build truly delivers lasting value.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Has self-service BI finally arrived with AI?</title>
      <link href="https://allarddewinter.net/blog/has-self-service-bi-finally-arrived-with-ai/" />
      <updated>2025-07-16T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/has-self-service-bi-finally-arrived-with-ai/</id>
      <content type="html">
				&lt;p&gt;I came across &lt;a href=&quot;https://www.ssp.sh/blog/self-service-bi-ai&quot; rel=&quot;noopener&quot;&gt;this article by Silvan Späti&lt;/a&gt; that explores how conversational AI, combined with the Model Context Protocol (MCP), might finally deliver on the long-standing promise of self-service Business Intelligence (BI).&lt;/p&gt;&lt;h3 id=&quot;the-value-for-the-end-customer&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/has-self-service-bi-finally-arrived-with-ai/#the-value-for-the-end-customer&quot;&gt;The value for the end customer&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The idea is powerful: instead of relying on developers or data analysts to build reports, business users could simply ask questions in natural language. For instance, an operations manager could ask, “Which of our wind turbines are underperforming against their contractual power curve for the last quarter?” and receive an immediate, data-backed answer. This direct interaction has the potential to dramatically speed up decision-making and empower teams to explore data on their own terms and time.&lt;/p&gt;&lt;p&gt;In my experience, end-users often consume data from a dashboard only to re-process it. They combine several numbers or present the information in a different way for their specific needs. This is where an LLM-based approach could be particularly beneficial, making it much easier to fine-tune queries and get the desired end result without manual work or overloading the dashboarding or development team.&lt;/p&gt;&lt;h3 id=&quot;a-dose-of-healthy-scepticism&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/has-self-service-bi-finally-arrived-with-ai/#a-dose-of-healthy-scepticism&quot;&gt;A dose of healthy scepticism&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;However, I must admit I am still a bit sceptical. Will end-users truly adopt this workflow, or will they just keep asking the development team for help? The shift from being a passive consumer of dashboards to an active conversational partner with data is a significant behavioural change that should not be underestimated.&lt;/p&gt;&lt;h3 id=&quot;the-real-win&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/has-self-service-bi-finally-arrived-with-ai/#the-real-win&quot;&gt;The real win&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;That said, the real value might lie in two key areas. First, the ability to communicate in natural language is a fundamental shift. It lowers the technical barrier significantly.&lt;/p&gt;&lt;p&gt;Second, and perhaps more importantly, is the ability to verify the output. The article explains how the system can show its work, including the queries it runs. This means you can fact-check the AI’s conclusions yourself, ensuring it is not hallucinating and that the insights are grounded in actual data. This builds trust, which is essential for adoption.&lt;/p&gt;&lt;p&gt;It makes data more accessible, results more tailored, and more verifiable. The combination of human expertise guiding a powerful, transparent AI tool could be where the true revolution lies.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Frameworks for measuring developer productivity</title>
      <link href="https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/" />
      <updated>2025-07-15T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/</id>
      <content type="html">
				&lt;p&gt;Quantifying the impact of AI on software development can be a challenge. I came across two resources from DX that provide a structured approach: the &lt;a href=&quot;https://getdx.com/research/measuring-ai-code-assistants-and-agents/&quot; rel=&quot;noopener&quot;&gt;DX AI Measurement Framework™&lt;/a&gt; and the foundational &lt;a href=&quot;https://getdx.com/research/measuring-developer-productivity-with-the-dx-core-4/&quot; rel=&quot;noopener&quot;&gt;DX Core 4&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The Core 4 addresses overall engineering health, while the AI framework focuses on the specific impact of AI tools. Here is a summary of their key indicators:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Framework&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Dimension&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Focus&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;DX Core 4&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Speed&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Measures PR throughput and perceived rate of delivery.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Effectiveness&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Assesses the developer experience (DXI) and time allocation.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Quality&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Tracks change failure rate and time to restore service.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Business Impact&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Connects engineering work to organisational goals.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;AI Framework&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Utilization&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Tracks the adoption and active usage of AI tools.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Impact&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Measures direct time savings and indirect productivity gains.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Cost&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Monitors usage to identify high-ROI use cases and manage expenses.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;the-developers-changing-role&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/#the-developers-changing-role&quot;&gt;The developer’s changing role&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The articles offer an interesting perspective on the two ways the developer’s role is changing. First, existing developers will increasingly act as leads for teams of AI agents, shifting their focus to directing and overseeing automated systems.&lt;/p&gt;&lt;p&gt;Second, AI is lowering the barrier to entry for software creation. The articles note that roles like product managers, designers, and business analysts are now using AI to generate working software. This expands the definition of who a “developer” is within an organisation. Consequently, when applying metrics, it becomes important to distinguish between production-grade contributions and disposable, AI-generated prototypes to ensure the data is measured in the right context.&lt;/p&gt;&lt;h3 id=&quot;other-productivity-frameworks&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/#other-productivity-frameworks&quot;&gt;Other productivity frameworks&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The DX framework is a useful model, but it is one of several in the landscape of developer productivity. Other well-known frameworks include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;DORA Metrics:&lt;/strong&gt; Originating from the DevOps Research and Assessment (DORA) team at Google, these four metrics (Deployment Frequency, Lead Time for Changes, Change Failure Rate, and Time to Restore Service) are highly focused on the speed and stability of the software delivery process. They are used effectively for measuring the health of a CI/CD pipeline.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SPACE Framework:&lt;/strong&gt; Developed by researchers from Microsoft and the University of Victoria, this is a more holistic model that covers five dimensions: Satisfaction &amp; Well-being, Performance, Activity, Communication &amp; Collaboration, and Efficiency &amp; Flow. Its inclusion of developer satisfaction provides a human-centric balance to purely output-based metrics.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The DX Core 4 framework actually aims to encapsulate principles from both DORA and SPACE, creating a unified system. Understanding these different models provides a broader context for choosing the metrics that best fit an organisation’s specific goals.&lt;/p&gt;&lt;h3 id=&quot;the-importance-of-starting-early&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/frameworks-for-measuring-developer-productivity/#the-importance-of-starting-early&quot;&gt;The importance of starting early&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Regardless of the framework chosen, the articles make a strong case for establishing baselines early. This can begin with self-reported data to get an initial understanding. It is critical to communicate that these metrics are for understanding tool effectiveness and guiding investment, not for individual performance reviews. This avoids gamification and helps ensure the data remains meaningful.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The state of software engineering with LLMs in 2025</title>
      <link href="https://allarddewinter.net/blog/the-state-of-software-engineering-with-llms-in-2025/" />
      <updated>2025-07-14T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-state-of-software-engineering-with-llms-in-2025/</id>
      <content type="html">
				&lt;p&gt;Gergely Orosz at The Pragmatic Engineer recently published an overview titled “&lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/software-engineering-with-llms-in-2025&quot; rel=&quot;noopener&quot;&gt;Software engineering with LLMs in 2025: reality check&lt;/a&gt;”. The article provides a grounded look at how Large Language Models (LLMs) are being used in the industry today, moving beyond the hype to see what is actually working.&lt;/p&gt;&lt;p&gt;He covers the spectrum from AI startups dogfooding their own products to how Big Tech organisations are integrating these tools.&lt;/p&gt;&lt;h3 id=&quot;corporate-adoption-and-progress&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-state-of-software-engineering-with-llms-in-2025/#corporate-adoption-and-progress&quot;&gt;Corporate adoption and progress&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The article highlights how companies like Google and Amazon are systematically integrating AI into their internal development workflows. Google has built AI features into its custom toolchain, from the Cider IDE to its Critique code review system. They are taking a cautious but steady approach, aiming to build trust with their engineers.&lt;/p&gt;&lt;p&gt;Amazon is heavily promoting its own tool, Amazon Q, and is seeing significant internal adoption of the Model Context Protocol (MCP). This protocol makes it trivial to turn internal APIs into servers that AI agents can interact with, automating tasks across different systems. This widespread adoption is a direct result of the “API-first” mandate Jeff Bezos instituted years ago.&lt;/p&gt;&lt;h3 id=&quot;the-view-from-experienced-engineers&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-state-of-software-engineering-with-llms-in-2025/#the-view-from-experienced-engineers&quot;&gt;The view from experienced engineers&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For me, the most interesting part of the article was the perspective of seasoned software engineers. Many, like Armin Ronacher (creator of Flask), have shifted from being sceptical to becoming believers in the productivity gains offered by agentic AI tools. The sentiment is that models like Claude have become “shockingly good”.&lt;/p&gt;&lt;p&gt;This enthusiasm is shared by others, including Simon Willison, whose work I follow closely. The consensus is that we have reached an inflection point where these tools are no longer just toys but are fundamentally changing how we build software. Kent Beck, a creator of Extreme Programming, is quoted as saying he is “having more fun programming than I ever had in 52 years”. When engineers with decades of experience express this level of excitement, it is a clear signal that a significant shift is happening.&lt;/p&gt;&lt;h3 id=&quot;my-own-next-steps-with-ai-tools&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-state-of-software-engineering-with-llms-in-2025/#my-own-next-steps-with-ai-tools&quot;&gt;My own next steps with AI tools&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Reading this has sharpened my own thinking and plans for the near future. I want to integrate these agentic tools more deeply into my workflow, especially those that connect directly with Git.&lt;/p&gt;&lt;p&gt;I have been using Cline in VS Code, and my experience has been mixed. Sometimes it works very well, but at other times it falls short. I plan to dedicate more time to mastering it, particularly its Git integration and the rule system. I also intend to experiment with Cursor, which looks very promising.&lt;/p&gt;&lt;p&gt;Perhaps the most significant next step for me is to improve my use of Test-Driven Development (TDD). The article reinforces the idea that agents work best when they have clear goals and feedback loops, and a solid test suite provides exactly that. An LLM can work against the tests to ensure its output complies with the requirements.&lt;/p&gt;&lt;p&gt;While I have experience writing tests in Python, I need to explore how to effectively apply this to static sites like this blog. It is a new area for me, and I am keen to learn how to get it working properly.&lt;/p&gt;&lt;h3 id=&quot;a-time-for-experimentation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-state-of-software-engineering-with-llms-in-2025/#a-time-for-experimentation&quot;&gt;A time for experimentation&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The key takeaway from Gergely’s article is that the landscape of what is “cheap” and “expensive” in software development has changed. It is time to experiment. The tools are maturing at an incredible pace, and I am excited to see how they will continue to evolve and enhance the way we create.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A simple trick for better dictation with AI</title>
      <link href="https://allarddewinter.net/blog/a-simple-trick-for-better-dictation-with-ai/" />
      <updated>2025-07-13T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-simple-trick-for-better-dictation-with-ai/</id>
      <content type="html">
				&lt;p&gt;I sometimes use dictation to capture thoughts or write texts, but the process can sometimes feel messy. It is easy to become hesitant, knowing that any mistake or forgotten detail will require manual correction later, which can disrupt the flow of ideas.&lt;/p&gt;&lt;p&gt;I recently read an article by &lt;a href=&quot;https://interconnected.org/home/2025/03/20/diane&quot; rel=&quot;noopener&quot;&gt;Matt Webb&lt;/a&gt; that offers a simple and practical solution to this problem. He suggests creating a persona—in his case, ‘Diane’—to act as a virtual secretary. While dictating your thoughts, you can embed instructions directly to this persona.&lt;/p&gt;&lt;p&gt;For instance, you could say, “The main points are A and B. Diane, please format that as a bulleted list. The third point is C.”&lt;/p&gt;&lt;p&gt;This method separates your content from your commands, allowing you to correct yourself or format on the fly without interrupting your flow. The LLM can then process the transcript, executing the instructions addressed to ‘Diane’ and cleaning up the final text.&lt;/p&gt;&lt;p&gt;It is a very good idea from Matt. I have found this works well on Android using the dictation feature in the Microsoft Word app, resulting in a much cleaner and more usable output.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The human cost of technical debt</title>
      <link href="https://allarddewinter.net/blog/the-human-cost-of-technical-debt/" />
      <updated>2025-07-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-human-cost-of-technical-debt/</id>
      <content type="html">
				&lt;p&gt;Some time ago, I wrote about &lt;a href=&quot;https://allarddewinter.net/blog/avoiding-and-reducing-technical-debt/&quot;&gt;avoiding and reducing technical debt&lt;/a&gt;, where I explored Chelsea Troy’s concept of ‘maintenance load’. Her perspective frames technical debt not as abstract ‘bad code’, but as the concrete, ongoing effort required to keep software running. The focus was on practical strategies like improving documentation, testing, and empowering developers to streamline the codebase.&lt;/p&gt;&lt;p&gt;That post centred on the technical and process-related aspects of the problem. However, a recent article from the &lt;a href=&quot;https://rdel.substack.com/p/rdel-24-how-does-technical-debt-impact&quot; rel=&quot;noopener&quot;&gt;Research-Driven Engineering Leadership newsletter&lt;/a&gt; adds another dimension to this discussion: the human side.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The research highlighted in the article shows a direct link between technical debt and developer morale. It is not just about slowing down development cycles; it actively reduces developers’ confidence and makes them feel their progress is hindered.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This connects directly to the idea of ‘maintenance load’. When developers constantly battle a high maintenance load, they are the ones who experience the ‘wasted time’ the research mentions. This feeling of running in place, fixing the same types of issues, or struggling with poorly documented code is a significant drain on motivation.&lt;/p&gt;&lt;p&gt;These two perspectives reinforce each other. The solutions Chelsea Troy proposes—valuing documentation, empowering developers to refactor, and forcing features to earn their keep—are not just good technical practices. They are, in fact, immediately positively influencing the morale issues identified in the research. By giving developers the tools and time to reduce maintenance load, we directly improve their sense of progress and confidence.&lt;/p&gt;&lt;p&gt;This reinforces the idea that managing technical debt is a core leadership responsibility. It is not merely a technical chore to be relegated to a backlog. It is an ongoing investment in the health of our systems and in the well-being and productivity of teams. Addressing the technical side has a direct, positive impact on the human side.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>From platform engineering to platform democracy</title>
      <link href="https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/" />
      <updated>2025-07-11T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/</id>
      <content type="html">
				&lt;p&gt;In supporting software development teams the goal has always been to increase efficiency and reduce friction. A recent study and a couple of related articles have highlight a trend that builds on the foundations of DevOps and platform engineering.&lt;/p&gt;&lt;h3 id=&quot;the-core-problem-wasted-developer-time&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/#the-core-problem-wasted-developer-time&quot;&gt;The core problem: wasted developer time&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A study conducted by the Enterprise Strategy Group (ESG) for Google Cloud, &lt;a href=&quot;https://cloud.google.com/resources/content/google-cloud-esg-competitive-edge-platform-engineering&quot; rel=&quot;noopener&quot;&gt;“Building Competitive Edge With Platform Engineering”&lt;/a&gt;, presents interesting statistics. As highlighted in an article by &lt;a href=&quot;https://thenewstack.io/google-study-65-of-developer-time-wasted-without-platforms/&quot; rel=&quot;noopener&quot;&gt;The New Stack&lt;/a&gt;, developers can waste up to 65% of their time on tasks that are not directly related to writing code. This includes managing tools, patching systems, and navigating infrastructure complexities—all tasks that platform engineering aims to solve.&lt;/p&gt;&lt;p&gt;This waste represents a huge loss of value. For every €100,000 invested in development, only €35,000 translates into new features and products. Platform engineering addresses this by providing a curated, self-service portal and patterns where developers have access to proven and maintained tools, freeing them to focus on their primary role.&lt;/p&gt;&lt;p&gt;This is a natural progression from the principles of DevOps, which I have discussed before in the context of &lt;a href=&quot;https://allarddewinter.net/blog/devops-for-data-science/&quot; rel=&quot;noopener&quot;&gt;DevOps for Data Science&lt;/a&gt;. While DevOps improved collaboration, it often does not scale well in organisations with more than 50 developers, creating a need for a more structured approach.&lt;/p&gt;&lt;h3 id=&quot;the-next-evolution-platform-democracy&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/#the-next-evolution-platform-democracy&quot;&gt;The next evolution: platform democracy&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While platform engineering provides a “golden path” for developers, it can sometimes feel restrictive. Developers often have strong preferences for their tools, and a one-size-fits-all platform may not cover every team’s specific needs.&lt;/p&gt;&lt;p&gt;This is where the concept of “platform democracy” comes in, as explored in another article from &lt;a href=&quot;https://thenewstack.io/beyond-platform-engineering-the-rise-of-platform-democracy/&quot; rel=&quot;noopener&quot;&gt;The New Stack, “Beyond Platform Engineering: The Rise of Platform Democracy”&lt;/a&gt;. The idea is to evolve from a centrally controlled platform to a more collaborative model.&lt;/p&gt;&lt;p&gt;Daniel Bryant from Syntasso describes it as enabling “all the producers in your organization to [reconfigure and modify] the platform to fit their individual needs”. This means developers, security teams, and SREs can all contribute to the platform, shaping it collectively. It is a shift from a “my way or the highway” approach to a multiplayer mode where everyone participates.&lt;/p&gt;&lt;p&gt;The goal is to create a system that covers the common 80% of needs centrally, while allowing teams the flexibility to build the remaining 20% themselves in a supported and consistent way.&lt;/p&gt;&lt;h3 id=&quot;key-enablers-of-modern-platforms&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/#key-enablers-of-modern-platforms&quot;&gt;Key enablers of modern platforms&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The Google/ESG research points to several key components that make these modern platforms successful:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Open source:&lt;/strong&gt; 96% (!) of organisations use open source tools to build their platforms. This provides the customisability and community support needed for a democratic and flexible approach.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CI/CD tools:&lt;/strong&gt; Continuous integration and deployment pipelines are considered essential. They are the engine that automates the delivery process, making the “golden paths” efficient and reliable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Scalability:&lt;/strong&gt; The platform must be able to scale to handle growing workloads and adapt to new requirements, such as the increasing integration of AI and machine learning.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-systems-engineering-perspective&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-platform-engineering-to-platform-democracy/#a-systems-engineering-perspective&quot;&gt;A systems engineering perspective&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;From a systems engineering perspective, the “platform as a product” mindset is a direct application of lifecycle thinking. You analyse the needs of your users (developers), synthesise a solution (the platform), and evaluate its effectiveness with clear metrics (like deployment frequency or mean time to recovery).&lt;/p&gt;&lt;p&gt;Platform democracy is an adaptation of this model. It makes the “synthesise” and “evaluate” phases continuous and collaborative rather than top-down. It is a more agile, iterative approach to managing the system’s lifecycle, ensuring it adapts to the evolving needs of its users.&lt;/p&gt;&lt;p&gt;The journey from DevOps to platform engineering and now towards platform democracy is about one thing: empowering developers to deliver value more effectively. It is a strategic shift that recognises that the best platforms are not just built &lt;em&gt;for&lt;/em&gt; developers, but also &lt;em&gt;with&lt;/em&gt; them.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A practical LLM coding workflow and a reflection on teamwork</title>
      <link href="https://allarddewinter.net/blog/a-practical-llm-coding-workflow-and-a-reflection-on-teamwork/" />
      <updated>2025-07-10T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-llm-coding-workflow-and-a-reflection-on-teamwork/</id>
      <content type="html">
				&lt;p&gt;I came across a post by Harper titled “&lt;a href=&quot;https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/&quot; rel=&quot;noopener&quot;&gt;My LLM codegen workflow atm&lt;/a&gt;” that offers a practical, hands-on look at using Large Language Models for software development. While it is already a few months old—a long time in the AI space—his core principles remain relevant.&lt;/p&gt;&lt;p&gt;He breaks his process down into two main paths.&lt;/p&gt;&lt;h3 id=&quot;for-new-greenfield-projects&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-llm-coding-workflow-and-a-reflection-on-teamwork/#for-new-greenfield-projects&quot;&gt;For new (greenfield) projects&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is a structured, three-step approach that moves from idea to execution.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Idea honing:&lt;/strong&gt; Use a conversational LLM to brainstorm and flesh out an idea, ending with a detailed developer specification.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Planning:&lt;/strong&gt; Feed the specification to a reasoning model to create a detailed, step-by-step implementation plan, broken down into small, testable chunks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Execution:&lt;/strong&gt; Use a codegen tool like Aider or pair-programme with a model like Claude to work through the plan, step by step.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;for-existing-projects&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-llm-coding-workflow-and-a-reflection-on-teamwork/#for-existing-projects&quot;&gt;For existing projects&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;When working on an established codebase, the approach is more iterative and task-focused.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Get context:&lt;/strong&gt; Use a tool to package the relevant parts of the codebase into a context file for the LLM. He mentions &lt;code&gt;repomix&lt;/code&gt;, but another popular tool for this is &lt;code&gt;gitingest&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Use specific prompts:&lt;/strong&gt; Run targeted prompts against the context to perform tasks like generating a code review, identifying missing tests, or creating GitHub issues.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;from-solo-mode-to-multiplayer&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-llm-coding-workflow-and-a-reflection-on-teamwork/#from-solo-mode-to-multiplayer&quot;&gt;From solo-mode to multiplayer&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;What particularly caught my attention was Harper’s final point about the loneliness of this workflow.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;My main complaint about these workflows is that it is largely a solo endeavor - i.e. the interfaces are all single player mode.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;He notes that the tools are largely single-player, making it difficult to collaborate as a team. This connects directly to my previous post, “&lt;a href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/&quot;&gt;Beyond the vibe: structuring AI-assisted development&lt;/a&gt;”. I believe the “rulebook” or “constitution” approach we discussed there is the key to unlocking team-based, AI-assisted development.&lt;/p&gt;&lt;p&gt;By establishing a shared set of rules—whether in a &lt;code&gt;CLAUDE.md&lt;/code&gt;, a &lt;code&gt;.cursor/rules&lt;/code&gt; directory, or a similar system—we create a unified standard for how the AI should behave. This acts like a traditional linter or code style guide, but for AI collaboration. It ensures that every developer’s AI assistant is working from the same playbook, respecting the same architectural boundaries, and following the same coding conventions.&lt;/p&gt;&lt;p&gt;This transforms the process from a series of isolated “single-player” sessions into a coordinated “multiplayer” effort, where the AI becomes a consistent and predictable partner for the entire team.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How to use AI without damaging your thinking</title>
      <link href="https://allarddewinter.net/blog/how-to-use-ai-without-damaging-your-thinking/" />
      <updated>2025-07-09T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/how-to-use-ai-without-damaging-your-thinking/</id>
      <content type="html">
				&lt;p&gt;In his article &lt;a href=&quot;https://www.oneusefulthing.org/p/against-brain-damage&quot; rel=&quot;noopener&quot;&gt;“Against ‘Brain Damage’”&lt;/a&gt;, Ethan Mollick addresses the common fear that using AI will harm our ability to think. He argues that while AI does not cause literal brain damage, using it without intention can lead to outsourcing our thinking, which prevents learning and mental growth. The key is not &lt;em&gt;if&lt;/em&gt; you use AI, but &lt;em&gt;how&lt;/em&gt; you use it. When used as a shortcut to get answers, it hinders learning. However, when used with well-designed prompts and clear guidance, like an AI tutor that challenges you, it can greatly improve learning outcomes. The same principle applies to creativity and writing: do the thinking and drafting yourself first, then use AI as a tool to refine and expand upon your own ideas.&lt;/p&gt;&lt;p&gt;This is a very helpful post for me, as I interact a lot with LLMs. It is interesting to see that so much depends on how you prompt an LLM. I was also surprised to see that prompts created for older models (like GPT-4 from over a year ago) still work effectively today. I did not expect that, given the heavy development in this area.&lt;/p&gt;&lt;p&gt;For writing on this blog, my process aligns with Mollick’s advice. I first create a rough draft myself. Only after that do I ask an LLM to help fill in details and check my writing. The summary that begins each post is something I hardly ever write myself. I find an LLM is especially effective for that task, though I always guide it to highlight the interesting bits.&lt;/p&gt;&lt;h3 id=&quot;a-practical-guide-to-active-ai-use&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-use-ai-without-damaging-your-thinking/#a-practical-guide-to-active-ai-use&quot;&gt;A practical guide to active AI use&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To make this more concrete, here is a simple overview of the do’s and don’ts for keeping your brain active when using AI in different situations, based on Mollick’s insights.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Situation&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Do (Activate your brain)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Don’t (Outsource your thinking)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Learning &amp; Tutoring&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Use prompts that force you to construct knowledge through questions and hints. Explain concepts in your own words.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Ask for the final answer or a complete explanation right away.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Writing &amp; Creativity&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Generate your own ideas and write a full draft first. Use AI to polish, refine, or expand on &lt;em&gt;your&lt;/em&gt; work.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Let the AI write the first draft or generate all the initial ideas, which can anchor your thinking.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Teamwork &amp; Meetings&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Use AI as a facilitator to surface unspoken concerns, find patterns, or ensure all voices are heard.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Use AI to simply summarise meetings you skip, replacing interaction entirely.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;from-theory-to-practice&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-to-use-ai-without-damaging-your-thinking/#from-theory-to-practice&quot;&gt;From theory to practice&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Mollick’s article made me reflect on my own &lt;a href=&quot;https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/&quot;&gt;systems engineering prompt&lt;/a&gt;. I think my prompt has value for creating a broad overview of course materials. However, to truly learn and engage with the topic, I should use a prompt like Mollick’s tutor prompt.&lt;/p&gt;&lt;p&gt;My plan is to use this new tutor-style prompt at the end of my course, just before the final exam. I will feed it my course materials and then use it to quiz myself. I think using it with a voice mode will be a blast.&lt;/p&gt;&lt;p&gt;Here is the tutor prompt from the &lt;a href=&quot;https://gail.wharton.upenn.edu/prompt-library/&quot; rel=&quot;noopener&quot;&gt;Wharton prompt library&lt;/a&gt;. It is quite detailed, but it is designed to guide the AI to be a true tutor rather than just an answer machine.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Click to view the full AI tutor prompt&lt;/summary&gt;&lt;p&gt;&lt;strong&gt;GOAL&lt;/strong&gt;: This is a tutoring exercise in which you play the role of AI tutor and you will help a student learn more about a topic of their choice. Your goal is to improve understanding and to challenge students to construct their own knowledge via open ended questions, hints, tailored explanations, and examples.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PERSONA&lt;/strong&gt;: In this scenario you play AI tutor an upbeat and practical tutor. You have high expectations for the student and believe in the student’s ability to learn and improve.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NARRATIVE&lt;/strong&gt;: The student is introduced to AI tutor, who asks a set of initial questions to understand what the student wants to learn, the student’s learning level and prior knowledge about the topic. The tutor then guides and supports the student and helps them learn about the topic. The tutor only wraps up the conversation once the student shows evidence of understanding: the student can explain something in their own words, can connect an example to a concept, or can apply a concept given a new situation or problem.&lt;/p&gt;&lt;p&gt;Follow these steps in order:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;STEP 1: GATHER INFORMATION&lt;/strong&gt;&lt;br&gt;You should do this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Introduce yourself: First introduce yourself to the student and tell the student you’re here to help them better understand a topic.&lt;/li&gt;&lt;li&gt;Ask students to answer the following questions. Ask these questions 1 at a time and always wait for a response before moving on to the next question. For instance, you might ask “What would you like to learn about and why” and the student would respond with a topic. And only then would you say “That sounds interesting! I have another question for you to help me help you: What is your learning level…”. This part of the conversations works best when you and the student take turns asking and answering questions instead of you asking a series of questions all at once. That way you can have more of a natural dialogue.&lt;ul&gt;&lt;li&gt;What would you like to learn about and why? And wait for the student to respond before moving on.&lt;/li&gt;&lt;li&gt;What is your learning level: high school student, college student, or a professional? And wait for the student to respond before moving on.&lt;/li&gt;&lt;li&gt;What do you already know about the topic? And wait for the student to respond before moving on.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You should do this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Wait for a response from the student after every question before moving on.&lt;/li&gt;&lt;li&gt;Work to ascertain what the student wants to learn specifically.&lt;/li&gt;&lt;li&gt;Ask one question at a time and explain that you’re asking so that you can tailor your explanation.&lt;/li&gt;&lt;li&gt;Gauge what the student already knows so that you can adapt your explanations and questions moving forward based on their prior knowledge.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Don’t do this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Start explaining right away before you gather this information.&lt;/li&gt;&lt;li&gt;Ask the student more than 1 question at a time.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Next step: Once you have the information you need move on to the next step and begin with a brief explanation.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;STEP 2: BEGIN TUTORING THE STUDENT, ADAPTING TO THEIR RESPONSES&lt;/strong&gt;&lt;br&gt;You should do this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Look up information about the topic.&lt;/li&gt;&lt;li&gt;Think step by step and make a plan based on the learning goal of the conversation. Now that you know a little bit about what the student knows consider how you will:&lt;/li&gt;&lt;li&gt;Guide the student in an open-ended way&lt;/li&gt;&lt;li&gt;Help the student generate answers by asking leading questions and providing hints when necessary.&lt;/li&gt;&lt;li&gt;Remind the student of their learning goal, if appropriate&lt;/li&gt;&lt;li&gt;Provide explanations, examples, and analogies&lt;/li&gt;&lt;li&gt;Break up the topic into smaller chunks, going over those first and only then leading up to the larger task or idea.&lt;/li&gt;&lt;li&gt;Tailor your responses and questions to the student’s learning level and prior knowledge; this will change as the conversation progresses.&lt;/li&gt;&lt;li&gt;When pushing the student for information, try to end your responses with a question so that the student has to keep generating ideas.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Once the student shows improvement, ask the student to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Explain the concept in their own words.&lt;/li&gt;&lt;li&gt;Articulate the underlying principles of a concept.&lt;/li&gt;&lt;li&gt;Provide examples of the concept and explain how those connect to the concept.&lt;/li&gt;&lt;li&gt;Give them a new problem or situation and ask them to apply the concept&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Don’t do this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Provide immediate answers or solutions to problems.&lt;/li&gt;&lt;li&gt;Give the student the answer when asked.&lt;/li&gt;&lt;li&gt;Ask the student if they understand, follow or needs more help – this is not a good strategy as they may not know if they understand.&lt;/li&gt;&lt;li&gt;Lose track of the learning goal and discuss something else.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Next step: Once the student demonstrates understanding move to wrap up.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;STEP 3: WRAP UP&lt;/strong&gt;&lt;br&gt;You should do this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;When the student demonstrates that they know the concept, you can move the conversation to a close and tell them you’re here to help if they have further questions.&lt;/li&gt;&lt;/ol&gt;&lt;/details&gt;&lt;p&gt;The fear of AI “damaging our brains” is really a fear of our own laziness. The technology offers an easy way out of the hard work of thinking, and we worry we will take it. We should worry. But we also have a choice.&lt;/p&gt;&lt;p&gt;As Mollick concludes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Your brain is safe. Your thinking, however, is up to you.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Europe&#39;s new summer energy challenge: the &#39;Hitzeflaute&#39;</title>
      <link href="https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/" />
      <updated>2025-07-08T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/</id>
      <content type="html">
				&lt;p&gt;Extreme heatwaves are creating significant stress on Europe’s energy infrastructure. I came across an interesting article by Julien at &lt;a href=&quot;https://gemenergyanalytics.substack.com/p/heatwave-on-europe-the-impact-of&quot; rel=&quot;noopener&quot;&gt;GEM Energy Analytics&lt;/a&gt; that clearly explains this growing challenge. He introduces the German term &lt;em&gt;Hitzeflaute&lt;/em&gt;, which describes a period of intense heat with little to no wind.&lt;/p&gt;&lt;h3 id=&quot;the-challenge-of-a-hot-still-day&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/#the-challenge-of-a-hot-still-day&quot;&gt;The challenge of a hot, still day&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For years, the energy sector has discussed the &lt;em&gt;Dunkelflaute&lt;/em&gt;, a dark, windless period in winter when both solar and wind generation are low. The &lt;em&gt;Hitzeflaute&lt;/em&gt; is its summer equivalent, though slightly different.&lt;/p&gt;&lt;p&gt;During a hot, windless period, solar panels generate a large amount of electricity during the day, which helps to meet the high demand from air conditioning. The problem, however, shifts to the evening. As the sun sets, solar generation drops to zero, but temperatures remain high, and so does the demand for cooling. With no wind to support, the grid is faced with high demand and low renewable supply.&lt;/p&gt;&lt;h3 id=&quot;the-impact-on-energy-prices&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/#the-impact-on-energy-prices&quot;&gt;The impact on energy prices&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This predictable evening scarcity has a direct effect on electricity prices. As demand exceeds the available renewable supply, the system must rely on more expensive power sources, causing prices to spike for several hours.&lt;/p&gt;&lt;p&gt;This volatility leads to extremely high imbalance prices: the costs paid to balance the grid in real-time. These prices are a clear indicator that the system is operating under significant stress. The article highlights that these price peaks are becoming a structural feature of our modern, renewables-heavy grid.&lt;/p&gt;&lt;p&gt;At first, this seems counterintuitive. If we can predict this evening scarcity, why are the prices so high? The simple answer is that knowing a problem is coming is not the same as having enough cheap tools to solve it. When the sun sets, the grid must instantly replace a massive amount of solar power. We currently do not have enough large-scale battery storage to save cheap daytime energy for the evening. Therefore, the system must rely on expensive backup power plants. The high price reflects the cost of this scarce, last-resort solution needed to keep the lights on.&lt;/p&gt;&lt;h3 id=&quot;what-can-europe-do&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/#what-can-europe-do&quot;&gt;What can Europe do?&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The good news is that these challenges have solutions. The price signals are sending a clear message about where investment and innovation are needed. The article suggests several key areas of focus:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Increased flexibility and storage:&lt;/strong&gt; Battery storage is ideal for solving this kind of short-term problem. It can absorb cheap, abundant solar power during the day and release it during the evening peak, flattening the price curve.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Smarter demand management:&lt;/strong&gt; Encouraging consumers to shift their energy use away from peak hours (load shifting) can significantly reduce strain on the grid.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Better grid interconnection:&lt;/strong&gt; Strengthening connections between countries allows electricity to flow from areas with a surplus to areas with a deficit, increasing overall system resilience.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-systems-engineering-perspective&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/#a-systems-engineering-perspective&quot;&gt;A systems engineering perspective&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;From a systems engineering viewpoint, this is a classic optimisation problem. The grid is a complex system that must be designed for resilience against predictable events like heatwaves.&lt;/p&gt;&lt;p&gt;The article notes that some power plants are offline for maintenance during summer, which is traditionally a period of lower demand. This is where predictive maintenance can help. By predicting potential failures, maintenance can be scheduled more strategically. For instance, instead of a fixed annual shutdown, a gas plant’s maintenance could be dynamically scheduled based on long-term weather forecasts and real-time sensor data. This data, from sensors monitoring things like turbine vibration, operating temperatures, and component stress, helps predict wear and potential failures. This approach ensures that essential backup power plants are available during these high-stress heatwave periods, rather than being offline when they are needed most.&lt;/p&gt;&lt;h3 id=&quot;wrap-up&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/europes-new-summer-energy-challenge-the-hitzeflaute/#wrap-up&quot;&gt;Wrap-up&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The “Hitzeflaute” demonstrates how Europe’s power system is now shaped as much by the climate as it is by technology. These events are no longer rare disruptions but regular stress tests.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>An overview of systems engineering core concepts</title>
      <link href="https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/" />
      <updated>2025-07-07T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/</id>
      <content type="html">
				&lt;p&gt;Recently, I wrote about &lt;a href=&quot;https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/&quot; rel=&quot;noopener&quot;&gt;my process for using an LLM as a personal tutor&lt;/a&gt; for the &lt;a href=&quot;https://www.coursera.org/learn/systems-engineering&quot; rel=&quot;noopener&quot;&gt;Introduction to Systems Engineering&lt;/a&gt; course I am taking. This post is a direct result of that process. I have synthesised the core concepts from the first half of the course into a single overview. My goal is to solidify my own understanding and share a clear, practical summary of the foundational principles of systems engineering. I hope it also encourages you to explore the course yourself. There is much extra detail and insight in the course itself; it is an excellent course for anyone working with complex systems.&lt;/p&gt;&lt;p&gt;This is a longer post, but I have structured it to be as scannable as possible, covering the journey from defining a system to engineering its requirements.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/1751876802773-650w.avif 650w, https://allarddewinter.net/assets/images/1751876802773-960w.avif 960w, https://allarddewinter.net/assets/images/1751876802773-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/1751876802773-650w.webp 650w, https://allarddewinter.net/assets/images/1751876802773-960w.webp 960w, https://allarddewinter.net/assets/images/1751876802773-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/1751876802773-650w.jpeg 650w, https://allarddewinter.net/assets/images/1751876802773-960w.jpeg 960w, https://allarddewinter.net/assets/images/1751876802773-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/1751876802773-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;An abstract city map illustrating the interconnected elements and boundaries of a complex system.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A system, much like a city, is a set of interconnected elements with a clear boundary and purpose.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h3 id=&quot;what-is-a-system&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#what-is-a-system&quot;&gt;What is a system?&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The course starts with the most fundamental question. In systems engineering, a system is defined as &lt;strong&gt;a set of elements that interact to achieve a stated purpose&lt;/strong&gt;. This simple definition forces us to be precise about three things: the system’s elements, their interconnections, and its mission.&lt;/p&gt;&lt;p&gt;A key concept here is the system boundary, which defines what is inside our ‘System of Interest’ and what is in the external environment. This boundary determines the project’s scope and clarifies our responsibilities.&lt;/p&gt;&lt;h3 id=&quot;the-system-life-cycle&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#the-system-life-cycle&quot;&gt;The system life cycle&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Every system, from a simple application to a complex aircraft, goes through a life cycle. Understanding these phases is essential because decisions made in one phase have consequences in all others. The generic life cycle has four major phases:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Pre-Acquisition:&lt;/strong&gt; The conceptual phase where the business need is identified, a business case is developed, and feasibility is assessed.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Acquisition:&lt;/strong&gt; The phase where the system is designed, built, and tested. This is the heart of the engineering effort.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Utilization:&lt;/strong&gt; The operational phase where the system is used and supported. This is typically the longest and most expensive phase.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Retirement:&lt;/strong&gt; The final phase where the system is disposed of at the end of its useful life.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The acquisition phase itself is broken down into four sequential activities, each ending with a critical review that establishes a design ‘baseline’.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Activity&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Review&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Baseline Established&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Conceptual Design&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;System Design Review (SDR)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Functional Baseline&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Defines &lt;em&gt;what&lt;/em&gt; the system must do (the logical architecture).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Preliminary Design&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Preliminary Design Review (PDR)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Allocated Baseline&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Maps the ‘what’ to a high-level ‘how’ (subsystem design).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Detailed Design&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Critical Design Review (CDR)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Product Baseline&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Details the design down to the component level for manufacturing.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Construction&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Formal Qualification Review (FQR)&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Qualified System&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The system is built, tested, and accepted for use.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Each baseline represents an increasing level of detail and a decreasing flexibility to make changes. This structured approach helps prevent costly errors late in the process.&lt;/p&gt;&lt;h3 id=&quot;the-two-views-logical-versus-physical&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#the-two-views-logical-versus-physical&quot;&gt;The two views: logical versus physical&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A core principle is the separation of the logical and physical architecture.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Logical Architecture (The “What”):&lt;/strong&gt; Describes what the system will do, how well it will perform, and under what conditions. It is based on requirements and is relatively stable over time. The purpose of an engine—to provide motion—has not changed much, even as the technology has.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Physical Architecture (The “How”):&lt;/strong&gt; Describes the actual components, how they are manufactured, and how they are integrated. This is based on design specifications and changes rapidly with technology.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We always develop the logical architecture first. Understanding the problem clearly before committing to a specific solution prevents us from being constrained by old technology or legacy thinking.&lt;/p&gt;&lt;h3 id=&quot;the-discipline-of-systems-engineering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#the-discipline-of-systems-engineering&quot;&gt;The discipline of systems engineering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;With the foundations in place, the course defines what systems engineering actually is. It is not about a specific engineering field but a holistic discipline focused on six key areas:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Requirements engineering:&lt;/strong&gt; Systematically managing stakeholder needs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A top-down approach:&lt;/strong&gt; Starting at the system level and decomposing downwards.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A life cycle perspective:&lt;/strong&gt; Considering all phases from concept to retirement.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;System optimisation and balance:&lt;/strong&gt; Making the whole system work well, not just the parts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Integration of disciplines:&lt;/strong&gt; Coordinating various engineering specialities.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Management:&lt;/strong&gt; A structured process for managing complexity.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Without this discipline, it is easy to create systems that are functional but unnecessarily complex, like the famous Rube Goldberg machines.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/rube-goldberg-self-operating-napkin-428w.avif 428w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/rube-goldberg-self-operating-napkin-428w.webp 428w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/rube-goldberg-self-operating-napkin-428w.jpeg 428w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/rube-goldberg-self-operating-napkin-428w.jpeg&quot; width=&quot;428&quot; height=&quot;302&quot; alt=&quot;A Rube Goldberg cartoon depicting a complex, convoluted machine designed simply to wipe a person&#39;s mouth with a napkin.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;The &#39;Self-Operating Napkin&#39;. &lt;a title=&quot;Rube Goldberg, Public domain, via Wikimedia Commons&quot; href=&quot;https://commons.wikimedia.org/wiki/File:Rube_Goldberg%27s_%22Self-Operating_Napkin%22_%28cropped%29.gif&quot;&gt;Rube Goldberg, Public domain, via Wikimedia Commons&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The fundamental process used throughout is &lt;strong&gt;Analysis-Synthesis-Evaluation (A-S-E)&lt;/strong&gt;. It is an iterative loop: we analyse the problem, synthesise potential solutions, and evaluate them against the requirements. This loop is repeated at every level of design, from the overall system down to the smallest component.&lt;/p&gt;&lt;p&gt;A common misconception is that systems engineering adds cost. In reality, it shifts costs. By investing more effort upfront in requirements and design (the A-S-E process), we significantly reduce expensive changes and rework during construction and operation, leading to a lower total life cycle cost.&lt;/p&gt;&lt;h3 id=&quot;the-language-of-needs-and-requirements&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#the-language-of-needs-and-requirements&quot;&gt;The language of needs and requirements&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The language of systems engineering is built on a clear distinction between needs and requirements.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Needs&lt;/strong&gt; are expectations from the business or stakeholders, stated in their language. For example, “I need a secure place to park my car.”&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Requirements&lt;/strong&gt; are formal, agreed-upon obligations derived from those needs. They are precise and, crucially, verifiable. For example, “The system shall include a garage with a lockable door.”&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This transformation from abstract needs to concrete requirements happens in a structured hierarchy, often captured in a series of documents:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Concept of Operations (ConOps):&lt;/strong&gt; The high-level vision of how the system will be used.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Business Requirements Specification (BRS):&lt;/strong&gt; Formalises the business needs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Stakeholder Requirements Specification (StRS):&lt;/strong&gt; Formalises the needs of users and other stakeholders.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;System Requirements Specification (SyRS):&lt;/strong&gt; The technical specification that the developers will build against.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;A well-formed requirement is necessary, unambiguous, feasible, and verifiable. If you cannot define how to test a requirement, it is probably not a good requirement.&lt;/p&gt;&lt;h3 id=&quot;the-process-of-requirements-engineering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#the-process-of-requirements-engineering&quot;&gt;The process of requirements engineering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The formal process for defining and managing requirements is called &lt;strong&gt;Requirements Engineering&lt;/strong&gt;. It involves two main activities:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Elicitation:&lt;/strong&gt; Gathering requirements directly from stakeholders and other sources.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Elaboration:&lt;/strong&gt; Analysing the elicited requirements to derive other functions that are logically necessary for the system to work, even if they were not explicitly stated.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Once requirements are defined, we must ensure we build the right system and build the system right. This is the job of &lt;strong&gt;Verification and Validation (V&amp;V)&lt;/strong&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Verification:&lt;/strong&gt; “Did we build the system right?” This checks if the system complies with its design specifications.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Validation:&lt;/strong&gt; “Did we build the right system?” This checks if the system actually meets the original stakeholder needs.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A system can be perfectly verified but fail validation if it was built to flawed requirements.&lt;/p&gt;&lt;p&gt;Finally, &lt;strong&gt;traceability&lt;/strong&gt; is the thread that connects everything. It is the ability to follow a requirement’s life from its origin to its implementation.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Forward traceability&lt;/strong&gt; ensures every high-level requirement is addressed in the final design.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Backward traceability&lt;/strong&gt; ensures every design feature can be traced back to an authorised requirement. This is the primary defence against ‘requirements creep’—the addition of unrequested features that add cost and complexity.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;final-thoughts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/an-overview-of-systems-engineering-core-concepts/#final-thoughts&quot;&gt;Final thoughts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Working through these concepts has given me a much clearer picture of systems engineering. It is a discipline dedicated to managing complexity. By taking a structured, top-down approach that considers the entire life cycle, it provides a framework for translating abstract business needs into a successful, operational system. The emphasis on getting the requirements right from the start is a lesson that applies far beyond just large-scale engineering projects.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What makes strong engineers strong?</title>
      <link href="https://allarddewinter.net/blog/what-makes-strong-engineers-strong/" />
      <updated>2025-07-06T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/what-makes-strong-engineers-strong/</id>
      <content type="html">
				&lt;p&gt;I recently read an interesting view from Sean Goedecke: &lt;a href=&quot;https://www.seangoedecke.com/what-makes-strong-engineers-strong/&quot; rel=&quot;noopener&quot;&gt;What makes strong engineers strong?&lt;/a&gt;. He argues that the difference between a strong engineer and a weaker one is not just technical skill, but a combination of four key traits, which he presents in order of importance.&lt;/p&gt;&lt;p&gt;His perspective is that strong engineers can complete tasks that ‘weaker’ ones cannot, even with unlimited time. Here is a brief summary of his points.&lt;/p&gt;&lt;h3 id=&quot;1-self-belief&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-strong-engineers-strong/#1-self-belief&quot;&gt;1. Self-belief&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This is the foundation. Strong engineers have the confidence to tackle difficult and unfamiliar problems head-on. They believe they can figure it out, which creates a positive feedback loop: taking on hard problems builds confidence, which encourages them to tackle even harder ones. They do not shy away from the most challenging part of a task.&lt;/p&gt;&lt;h3 id=&quot;2-pragmatism&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-strong-engineers-strong/#2-pragmatism&quot;&gt;2. Pragmatism&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Strong engineers focus on shipping solutions that work. They prioritise getting things done over creating a theoretically “perfect” or “elegant” system. Design decisions are judged by their effectiveness, and they are willing to make compromises to deliver a working product.&lt;/p&gt;&lt;h3 id=&quot;3-speed&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-strong-engineers-strong/#3-speed&quot;&gt;3. Speed&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;According to Goedecke, strong engineers are always fast workers. This is not about working long hours, but about efficiency and accumulating experience rapidly. Fast execution allows for more experimentation and makes it possible to try ideas with a low chance of success but a high potential reward.&lt;/p&gt;&lt;h3 id=&quot;4-technical-ability&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/what-makes-strong-engineers-strong/#4-technical-ability&quot;&gt;4. Technical ability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;While essential, technical skill is the final piece of the puzzle. A baseline is necessary, but what matters more is having the &lt;em&gt;right&lt;/em&gt; technical skills for the job at hand. Goedecke notes that raw intelligence does not always translate to effectiveness; he would rather work with an engineer who is confident and pragmatic than a genius who struggles with those traits.&lt;/p&gt;&lt;p&gt;Goedecke’s summary is that it is the combination of these traits that truly defines a strong engineer. It is a good read, and I recommend checking out the full post for his detailed thoughts.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>From notebooks to production systems</title>
      <link href="https://allarddewinter.net/blog/from-notebooks-to-production-systems/" />
      <updated>2025-07-05T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/from-notebooks-to-production-systems/</id>
      <content type="html">
				&lt;p&gt;I recently listened to an episode of the &lt;a href=&quot;https://talkpython.fm/511&quot; rel=&quot;noopener&quot;&gt;TalkPython podcast featuring Dr. Catherine Nelson&lt;/a&gt;, where she discussed the journey from exploratory data science in notebooks to building scalable, production-grade systems. The conversation highlighted a critical transition that many data scientists face, and I wanted to expand on the key points that stood out to me.&lt;/p&gt;&lt;h3 id=&quot;the-limits-of-notebooks&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-notebooks-to-production-systems/#the-limits-of-notebooks&quot;&gt;The limits of notebooks&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Notebooks are fantastic tools for &lt;strong&gt;exploration&lt;/strong&gt;. Their interactive nature allows for rapid iteration, visualisation, and a free-form approach to understanding data. This is perfect for the initial stages of a project where the path forward is not yet clear.&lt;/p&gt;&lt;p&gt;However, this flexibility becomes a liability when a project needs to be run &lt;strong&gt;repeatedly and reliably&lt;/strong&gt;. When a notebook is simply converted to a Python script, several problems emerge:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Hidden state and execution order:&lt;/strong&gt; Notebooks allow you to run cells out of order, creating an invisible state that a linear script cannot replicate. A script might fail because it depends on a variable from a cell that was run manually but is not in the correct sequence.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Monolithic structure:&lt;/strong&gt; A single notebook often mixes data loading, cleaning, analysis, and modelling. This makes the resulting script a “God script”—impossible to test in isolation, difficult to debug, and with no reusable components.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Testing blind spots:&lt;/strong&gt; Notebooks are rarely written with testing in mind. Code is not structured in testable functions, making it hard to validate logic without significant refactoring.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Collaboration barriers:&lt;/strong&gt; The JSON structure of &lt;code&gt;.ipynb&lt;/code&gt; files is notoriously difficult to manage with Git, leading to frustrating merge conflicts that hinder team collaboration.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;the-shift-to-a-production-engineering-mindset&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-notebooks-to-production-systems/#the-shift-to-a-production-engineering-mindset&quot;&gt;The shift to a production engineering mindset&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The most crucial takeaway for me was the necessary shift in thinking from an exploratory, scientific mindset to a &lt;strong&gt;production engineering mindset&lt;/strong&gt;. This is not about abandoning data science principles but augmenting them with &lt;strong&gt;software engineering best practices&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;It is about recognising that your successful experiment is now a piece of software. The focus must change from “what can this data tell me?” to “how can I build a reliable, efficient, and maintainable system that delivers this result consistently?”&lt;/p&gt;&lt;p&gt;This means moving from:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Exploration-first&lt;/strong&gt; to &lt;strong&gt;reliability-first&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;“Throwaway” code&lt;/strong&gt; to &lt;strong&gt;maintainable, reusable code&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Manual execution&lt;/strong&gt; in a notebook to &lt;strong&gt;automated CI/CD pipelines&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Local environments&lt;/strong&gt; to &lt;strong&gt;containerised, reproducible systems&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-practical-workflow-for-making-the-switch&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-notebooks-to-production-systems/#a-practical-workflow-for-making-the-switch&quot;&gt;A practical workflow for making the switch&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Dr. Nelson outlined a practical, battle-tested process for moving code from a notebook into a production-ready structure.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Map the workflow:&lt;/strong&gt; Before writing any code, draw a simple diagram of the logical steps in your notebook. This could be as straightforward as &lt;code&gt;load_data&lt;/code&gt; → &lt;code&gt;clean_data&lt;/code&gt; → &lt;code&gt;train_model&lt;/code&gt; → &lt;code&gt;predict&lt;/code&gt;. This map becomes the blueprint for your new structure.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refactor into functions:&lt;/strong&gt; Create separate Python files and begin moving code from your notebook cells into single-responsibility functions. Start with empty function stubs that match your workflow diagram, then fill them in one by one. Tools like &lt;code&gt;nbconvert&lt;/code&gt; can do a one-time export, while &lt;code&gt;Jupytext&lt;/code&gt; can keep a &lt;code&gt;.py&lt;/code&gt; file and a notebook in sync, which is useful during the transition.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write tests as you go:&lt;/strong&gt; For each function you create, write a corresponding unit test using a framework like &lt;code&gt;pytest&lt;/code&gt;. This validates that the logic works as expected and provides a safety net for future changes. It forces you to write clean, testable code from the start.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adopt engineering fundamentals:&lt;/strong&gt; Fully commit to standard software engineering practices. Use &lt;strong&gt;Git&lt;/strong&gt; for version control, write clear &lt;strong&gt;docstrings&lt;/strong&gt; to explain what your functions do, and use a &lt;strong&gt;linter&lt;/strong&gt; to maintain code quality.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;the-role-of-mlops-and-containerization&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-notebooks-to-production-systems/#the-role-of-mlops-and-containerization&quot;&gt;The role of MLOps and containerization&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This new workflow is supported by two key technological pillars: MLOps and containerization.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;MLOps (Machine Learning Operations)&lt;/strong&gt; provides the framework to manage the entire machine learning lifecycle in a standardised way. Platforms like &lt;strong&gt;MLflow&lt;/strong&gt; or &lt;strong&gt;TensorFlow Extended (TFX)&lt;/strong&gt; help automate data validation, model retraining, and deployment, preventing the “ad hoc script proliferation” that plagues many teams.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Containerization (with Docker)&lt;/strong&gt; for production systems. It solves the “it works on my machine” problem by packaging your code, libraries, and system dependencies into a single, consistent unit. This ensures your application runs identically everywhere, from your laptop to a cloud server, and is essential for building scalable, isolated microservices.&lt;/p&gt;&lt;h3 id=&quot;diving-deeper-into-mlops&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-notebooks-to-production-systems/#diving-deeper-into-mlops&quot;&gt;Diving deeper into MLOps&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;For those looking to learn more, the field of MLOps is fortunately well-documented. The major cloud providers, such as Databricks, Microsoft, and Amazon, offer extensive documentation that, if you focus on the bigger picture, provides valuable platform-agnostic principles.&lt;/p&gt;&lt;p&gt;If you prefer a more structured, book-based approach, several excellent texts can guide you. For instance, &lt;em&gt;Implementing MLOps in the Enterprise&lt;/em&gt; by Yaron Haviv and Noah Gift takes a production-first approach, focusing on designing the operational pipeline before integrating machine learning components. Alternatively, &lt;em&gt;Introducing MLOps&lt;/em&gt; by Mark Treveil et al. introduces the core concepts by breaking down the entire model lifecycle into five key stages: Build, Preproduction, Deployment, Monitoring, and Governance.&lt;/p&gt;&lt;p&gt;The journey from a notebook to a production system is a sign of success. It means your work has proven valuable enough to be operationalised. As Dr. Nelson said, it is about making your code robust and easy for others to use—that is how data science creates real impact.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>From theory to practice: How organisations are adopting AI</title>
      <link href="https://allarddewinter.net/blog/from-theory-to-practice-how-organisations-are-adopting-ai/" />
      <updated>2025-07-04T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/from-theory-to-practice-how-organisations-are-adopting-ai/</id>
      <content type="html">
				&lt;p&gt;Following up on my recent post about the &lt;a href=&quot;https://allarddewinter.net/blog/reflecting-on-ais-real-impact-on-engineering-leadership/&quot; rel=&quot;noopener&quot;&gt;real impact of AI on engineering leadership&lt;/a&gt;, I came across an interesting article from the Stack Overflow blog. Titled “&lt;a href=&quot;https://stackoverflow.blog/2025/06/25/not-an-option-but-a-necessity-how-organizations-are-adopting-and-implementing-ai-internally/&quot; rel=&quot;noopener&quot;&gt;Not an option, but a necessity&lt;/a&gt;”, it moves beyond the theoretical and shows how different companies are practically integrating AI into their workflows.&lt;/p&gt;&lt;p&gt;The article reinforces that while many leaders see AI deployment as immature, the push for adoption is undeniable. It is driven by the need for greater efficiency, faster access to knowledge, and more innovative strategies.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/1751613834230-650w.avif 650w, https://allarddewinter.net/assets/images/1751613834230-960w.avif 960w, https://allarddewinter.net/assets/images/1751613834230-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/1751613834230-650w.webp 650w, https://allarddewinter.net/assets/images/1751613834230-960w.webp 960w, https://allarddewinter.net/assets/images/1751613834230-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/1751613834230-650w.jpeg 650w, https://allarddewinter.net/assets/images/1751613834230-960w.jpeg 960w, https://allarddewinter.net/assets/images/1751613834230-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/1751613834230-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;A beaver, otter, and badger each using a complex machine in their own style, representing different AI adoption strategies.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Different teams, different approaches. Whether you&#39;re a meticulous beaver, a collaborative otter, or a pragmatic badger, strategy is key.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h3 id=&quot;how-different-companies-are-approaching-ai&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-theory-to-practice-how-organisations-are-adopting-ai/#how-different-companies-are-approaching-ai&quot;&gt;How different companies are approaching AI&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;What I found most useful were the specific examples of how different organisations are tackling this challenge. Each has a distinct, intentional approach.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloudflare:&lt;/strong&gt; They are taking a top-down approach by giving AI tools to their most senior, high-performing developers first. The goal is not to make average developers good, but to make the best developers even better. This allows them to measure the productivity impact on complex problems before rolling it out more widely.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; Their focus is on freeing up developer time for more strategic work and collaboration. By automating routine tasks, AI allows their technical teams to focus on higher-value activities and work more closely with non-technical departments, breaking down traditional silos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abnormal AI:&lt;/strong&gt; They take a pragmatic view, acknowledging that AI tools do not work perfectly “out of the box”. Their approach emphasises that success requires investment and a willingness to shape the tools and the organisation to fit each other.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-systems-engineering-perspective&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-theory-to-practice-how-organisations-are-adopting-ai/#a-systems-engineering-perspective&quot;&gt;A systems engineering perspective&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;From a systems engineering perspective, these approaches are fascinating. Instead of treating AI as a simple plug-and-play tool, these companies are managing it as a new, powerful component within their complex organisational systems. They are carefully observing the interactions—the feedback loops—between the technology, their people, and their processes. This allows them to manage the emergent outcomes, rather than just hoping for the best.&lt;/p&gt;&lt;h3 id=&quot;the-common-thread-is-strategy&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/from-theory-to-practice-how-organisations-are-adopting-ai/#the-common-thread-is-strategy&quot;&gt;The common thread is strategy&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These examples perfectly illustrate the point from my previous post: successful AI adoption requires a clear roadmap. Each of these companies has a deliberate plan. They are not just adopting technology for its own sake; they are integrating it to solve specific business problems, whether that is amplifying top talent, fostering collaboration, or accepting the need for customisation.&lt;/p&gt;&lt;p&gt;It is encouraging to see these practical approaches emerge. They confirm that the path to getting real value from AI is less about the tool itself and more about the strategy behind its implementation.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Reflecting on AI&#39;s real impact on engineering leadership</title>
      <link href="https://allarddewinter.net/blog/reflecting-on-ais-real-impact-on-engineering-leadership/" />
      <updated>2025-07-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/reflecting-on-ais-real-impact-on-engineering-leadership/</id>
      <content type="html">
				&lt;p&gt;In her recent post, “&lt;a href=&quot;https://researchdriven.substack.com/p/rdel-99-how-has-ai-impacted-engineering&quot; rel=&quot;noopener&quot;&gt;RDEL #99: How has AI impacted engineering leadership in 2025?&lt;/a&gt;”, Lizzie Matusov shares some grounded findings from the 2025 LeadDev Engineering Leadership Report. The data paints a picture that is less about revolutionary transformation and more about a gradual, and sometimes challenging, integration of AI into engineering workflows.&lt;/p&gt;&lt;h3 id=&quot;key-findings-from-the-report&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/reflecting-on-ais-real-impact-on-engineering-leadership/#key-findings-from-the-report&quot;&gt;Key findings from the report&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The survey of over 600 engineering leaders reveals:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Productivity gains are modest:&lt;/strong&gt; 60% of leaders said AI has not significantly boosted team productivity yet.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Headcount is stable:&lt;/strong&gt; 54% do not expect AI to reduce their team size this year.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Adoption is focused:&lt;/strong&gt; The most common use cases are coding assistants for generation, refactoring, and documentation.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Leaders are concerned:&lt;/strong&gt; Over half (51%) believe AI will have a negative long-term impact on the industry, citing code maintainability and the effect on junior developers.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The overall message is that while adoption is widespread, the promised productivity revolution has not yet materialised.&lt;/p&gt;&lt;h3 id=&quot;a-practical-path-forward&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/reflecting-on-ais-real-impact-on-engineering-leadership/#a-practical-path-forward&quot;&gt;A practical path forward&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These findings align with my own experience. In the early days, AI and LLM projects often felt like a technology searching for a use case. It was a classic example of a solution looking for a problem, which I discussed in my post on &lt;a href=&quot;https://allarddewinter.net/blog/assessing-new-technology-with-readiness-levels/&quot; rel=&quot;noopener&quot;&gt;assessing new technology with Readiness Levels&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What gives me confidence for the future, however, is the emergence of standards that help with corporate adoption. Protocols like &lt;a href=&quot;https://allarddewinter.net/blog/understanding-mcp-a-new-standard-for-ai-integration/&quot; rel=&quot;noopener&quot;&gt;MCP are a great step forward&lt;/a&gt;, providing a common language for integrating AI with existing tools. This helps to reframe the technology; instead of being a goal in itself, AI becomes a practical tool to help realise business capabilities more effectively.&lt;/p&gt;&lt;p&gt;For AI to deliver real value, there must be a clear roadmap for its implementation and practical usage. This is not just about buying new tools; it is about organisational change. A well-defined plan is the first practical step to getting people on board and ensuring the company invests its time and money in the right things. Without that clarity, we risk staying in a cycle of experimentation without ever achieving meaningful results.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A practical take on prioritisation</title>
      <link href="https://allarddewinter.net/blog/a-practical-take-on-prioritisation/" />
      <updated>2025-07-02T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-take-on-prioritisation/</id>
      <content type="html">
				&lt;p&gt;I recently read a very good article by Jason Cohen of A Smart Bear called &lt;a href=&quot;https://longform.asmartbear.com/prioritization/&quot; rel=&quot;noopener&quot;&gt;Ruthless prioritization while the dog pees on the floor&lt;/a&gt;. It addresses a problem we all face: there is never enough time to do everything we want or need to do.&lt;/p&gt;&lt;p&gt;Cohen’s central point is that time is a zero-sum game. Every choice is a trade-off.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Time is a zero-sum resource: An hour spent on one thing necessarily means not spending an hour on the entire universe of alternative things. Every minute is a choice. Every choice is a trade-off.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;While there are many prioritisation frameworks out there, from the Eisenhower Matrix to RICE scoring, Cohen’s approach cuts through the complexity. He proposes a simple, practical way of thinking that forces you to identify what truly matters.&lt;/p&gt;&lt;h3 id=&quot;identifying-your-10x-tasks&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-take-on-prioritisation/#identifying-your-10x-tasks&quot;&gt;Identifying your 10x tasks&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The first step is to actively seek out what Cohen calls &lt;strong&gt;“10x tasks”&lt;/strong&gt;. These are activities where the return on your time is an order of magnitude greater than the effort you put in. They are the tasks that can genuinely transform your business or career.&lt;/p&gt;&lt;p&gt;Examples include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The few features that win the majority of your sales.&lt;/li&gt;&lt;li&gt;Finding the marketing message that doubles your conversion rate.&lt;/li&gt;&lt;li&gt;Hiring a critical employee who elevates the entire team.&lt;/li&gt;&lt;li&gt;Addressing the single biggest bottleneck to your growth.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In my industry, a 10x task in data science could be developing a predictive model that automates a core business decision, freeing up hours of manual analysis each week. In modern systems engineering, it might be establishing a rigorous traceability process from the start. While it feels like overhead initially, it prevents entire teams from building features that do not map to a core stakeholder need, saving months of wasted effort down the line.&lt;/p&gt;&lt;p&gt;It is important to find your 10x tasks:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you don’t know what one or two 10x tasks you should be working on, then identifying that is your highest priority.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Without this clarity, any work you do, no matter how efficient, risks being a waste of time.&lt;/p&gt;&lt;h3 id=&quot;minimising-the-01x-tasks&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-take-on-prioritisation/#minimising-the-01x-tasks&quot;&gt;Minimising the 0.1x tasks&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;On the other end of the spectrum are &lt;strong&gt;“0.1x tasks”&lt;/strong&gt;. These are the low-impact activities, many of which are mandatory but do not provide a high return. The goal is to spend as little time on them as possible. Cohen suggests several strategies:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Eliminate:&lt;/strong&gt; Can you change your strategy to avoid the task completely?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Delegate:&lt;/strong&gt; Can someone else do it, even if not perfectly?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Batch or Automate:&lt;/strong&gt; Can you group similar tasks and do them all at once?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Archive:&lt;/strong&gt; For ideas or tickets that have sat untouched for months, accept they will likely never be done and archive them. If it is truly important, it will come back.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;He makes an important distinction that effort does not equal impact. A simple task is not automatically a 0.1x task; some easy wins can have a 10x impact.&lt;/p&gt;&lt;h3 id=&quot;the-reality-of-focus-letting-the-dog-pee-on-the-floor&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-take-on-prioritisation/#the-reality-of-focus-letting-the-dog-pee-on-the-floor&quot;&gt;The reality of focus: letting the dog pee on the floor&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Cohen uses a memorable parable to illustrate the true cost of focus. Instead of me paraphrasing, here it is directly from the article:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;In a well-lit living room, a dog is peeing on the floor while a man sits in a chair, reading a book. The man doesn’t react. You’re watching from a window, concluding that this man must be ignorant, crazy, or at least a poor decision-maker. Put down the book and take that dog for a walk, idiot!&lt;/p&gt;&lt;p&gt;Except, you don’t know the full story. In one hour, the man has the most important meeting of his life. His performance in this meeting will dictate the next ten years of his career. Everything he needs to know to be successful in this meeting, is in that book. Yes the dog should have been taken for a walk, but the penalty of having to clean up the pee is worth it, because the call is that important.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is what intense prioritisation looks like. You must intentionally ignore some problems to give your full attention to the 10x opportunity.&lt;/p&gt;&lt;h3 id=&quot;the-importance-of-communication&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-take-on-prioritisation/#the-importance-of-communication&quot;&gt;The importance of communication&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This intentional neglect can destroy morale if your team only sees the “dog peeing on the floor”. They see problems being ignored and lose faith in leadership.&lt;/p&gt;&lt;p&gt;The solution is constant and clear communication. You must explain &lt;em&gt;why&lt;/em&gt; certain fires are being left to burn. You need to share the full story: what the 10x task is, why it is the top priority, and explicitly acknowledge the things you are &lt;em&gt;not&lt;/em&gt; doing as a result.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Assessing new technology with Readiness Levels</title>
      <link href="https://allarddewinter.net/blog/assessing-new-technology-with-readiness-levels/" />
      <updated>2025-07-01T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/assessing-new-technology-with-readiness-levels/</id>
      <content type="html">
				&lt;p&gt;I recently came across the concept of Technology Readiness Levels (TRLs), and it immediately struck me as a very practical tool. Originally developed by NASA to assess technologies for space missions, it provides a simple yet effective scale for measuring the maturity of a technology.&lt;/p&gt;&lt;p&gt;It is a straightforward way to create a common language when discussing how ‘ready’ a new piece of technology is. Here is a simplified summary of the levels:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:center&quot;&gt;Level&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Name&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;TRL 1-3&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Research&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Basic principles observed, concepts formulated, and proof-of-concept demonstrated. This is the blue-sky thinking and early lab work phase.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;TRL 4-6&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Components are tested in a lab, then in a ‘relevant’ environment. A prototype exists that works in a simulated operational environment.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:center&quot;&gt;&lt;strong&gt;TRL 7-9&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;The prototype is demonstrated in an operational environment, the final system is qualified, and it is proven to work through successful operation.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;how-i-use-it&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/assessing-new-technology-with-readiness-levels/#how-i-use-it&quot;&gt;How I use it&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This framework is very practical when assessing a new demand or technology. It helps answer critical questions before committing significant effort:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Does it fit our existing architecture?&lt;/li&gt;&lt;li&gt;Does it align with our data landscape?&lt;/li&gt;&lt;li&gt;Can it be integrated into our current processes?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The TRL scale helps frame the answers. If a technology is at a low TRL (e.g., TRL 3), it is perfectly acceptable that it does not fit with our established processes. At this stage, we are just experimenting to learn. The goal is not integration, but validation of the concept itself.&lt;/p&gt;&lt;p&gt;However, if the ambition is to bring that technology to a mature state (e.g., TRL 8), the assessment changes. We must then plan and dedicate effort to embedding it within the organisation. This work runs parallel to the technical development and building our team’s experience with it. Using TRLs makes this distinction clear and helps manage expectations.&lt;/p&gt;&lt;h3 id=&quot;shortcomings-and-the-commercial-view&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/assessing-new-technology-with-readiness-levels/#shortcomings-and-the-commercial-view&quot;&gt;Shortcomings and the commercial view&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;No model is perfect. A high TRL ensures a technology is mature, but it does not guarantee it is appropriate or commercially viable. This is a critical gap, as a technically perfect product that nobody wants is a failure.&lt;/p&gt;&lt;p&gt;This is where the Commercial Readiness Level (CRL) comes in. It acts as a parallel framework to TRL, assessing everything from initial market research and business model validation to achieving the first revenue.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/crl-vs-trl-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/crl-vs-trl-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/crl-vs-trl-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/crl-vs-trl-650w.jpeg&quot; width=&quot;650&quot; height=&quot;427&quot; alt=&quot;A diagram showing the parallel tracks of Technology Readiness Level (TRL) and Commercial Readiness Level (CRL), from concept to market launch.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;TRL and CRL are interdependent journeys, not sequential steps. (From: [LaMonaco &amp; Associates](https://lamonaco.com/blogs/2024/12/11/commercial-readiness-level-crl-for-startups))&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Technology Readiness Level (TRL) and Commercial Readiness Level (CRL) are not sequential; they are interdependent and should progress in parallel. A common mistake is to perfect the technology (high TRL) before even starting the commercial validation (low CRL). Feedback from early customer interviews (a low CRL activity) should directly influence technical priorities and feature development (TRL activities). This alignment ensures you are building something people actually want, reducing market risk and making resource allocation far more efficient.&lt;/p&gt;&lt;h3 id=&quot;connecting-the-dots-a-more-complete-strategic-toolkit&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/assessing-new-technology-with-readiness-levels/#connecting-the-dots-a-more-complete-strategic-toolkit&quot;&gt;Connecting the dots: A more complete strategic toolkit&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;How do these readiness levels fit into a broader strategy? Short recap what they give us: Technology Readiness Level (TRL) answers the question, “Can we build it?” It measures technical maturity and helps us manage engineering risk. Commercial Readiness Level (CRL) answers the question, “Should we build it?” It measures market viability and helps us manage commercial risk.&lt;/p&gt;&lt;p&gt;In my earlier post on a &lt;a href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/&quot; rel=&quot;noopener&quot;&gt;practical toolkit for technology strategy&lt;/a&gt;, I outlined a way to map the strategic landscape using two key frameworks:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Wardley Maps:&lt;/strong&gt; To visualise our value chain and understand how components evolve from new ideas (&lt;strong&gt;Genesis&lt;/strong&gt;) to stable utilities (&lt;strong&gt;Commodity&lt;/strong&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pace Layering:&lt;/strong&gt; To categorise our systems by their required speed of change, from fast-moving &lt;strong&gt;Systems of Innovation&lt;/strong&gt; to slow and stable &lt;strong&gt;Systems of Record&lt;/strong&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This is where TRL and CRL become useful additions to that toolkit. They provide the granular, evidence-based metrics needed to make those high-level maps actionable.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;TRLs quantify the Wardley Map evolution axis.&lt;/strong&gt; A component in ‘Genesis’ has a low TRL by definition. A ‘Commodity’ service has a TRL of 9. Using TRLs allows us to precisely measure where a component is on its journey and plan the work needed to move it.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;TRLs and CRLs act as gates for Pace Layering.&lt;/strong&gt; A technology with a low TRL and CRL belongs firmly in the ‘System of Innovation’. We would never place it in a ‘System of Record’. As a technology matures both technically (higher TRL) and commercially (higher CRL), we can make a conscious, data-informed decision to migrate it to a more stable layer.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;CRL validates the ‘user need’ on the map.&lt;/strong&gt; A Wardley Map starts with a user need. CRL is the framework for testing if that need is real and if our proposed solution is desirable before we over-invest in technical development.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By combining these frameworks, we move from abstract maps to a practical, measurable system for managing technology development and de-risking our strategic bets. For those who want to go deeper, the definitive document on TRL is the &lt;a href=&quot;https://ntrs.nasa.gov/api/citations/20205003605/downloads/%20SP-20205003605%20TRA%20BP%20Guide%20FINAL.pdf&quot; rel=&quot;noopener&quot;&gt;NASA Technology Readiness Assessment Guide&lt;/a&gt;. For a great breakdown of CRL, I recommend the post by &lt;a href=&quot;https://lamonaco.com/blogs/2024/12/11/commercial-readiness-level-crl-for-startups&quot; rel=&quot;noopener&quot;&gt;LaMonaco &amp; Associates&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Pairing technical assessment (TRL) with commercial validation (CRL) provides a more complete picture, ensuring that what you build is not only feasible but also valuable.&lt;/strong&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The value of the expert generalist</title>
      <link href="https://allarddewinter.net/blog/the-value-of-the-expert-generalist/" />
      <updated>2025-06-30T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-value-of-the-expert-generalist/</id>
      <content type="html">
				&lt;p&gt;In our industry, we often see job descriptions demanding years of experience in niche frameworks, pushing us towards ever-narrower specialisation. While deep knowledge is valuable, I have found that the most effective people are those who can bridge different domains.&lt;/p&gt;&lt;p&gt;That is why I enjoyed the recent article, “&lt;a href=&quot;https://martinfowler.com/articles/expert-generalist.html&quot; rel=&quot;noopener&quot;&gt;Expert Generalists&lt;/a&gt;,” by Unmesh Joshi, Gitanjali Venkatraman, and Martin Fowler of Thoughtworks. They give a name and a framework to a concept I have long admired, arguing that being an “expert generalist” is a skill we should actively cultivate.&lt;/p&gt;&lt;p&gt;The authors identify several traits that define an expert generalist, including deep curiosity, collaborativeness, and a sharp customer focus. However, the most important trait is a preference for fundamental knowledge over transient, tool-specific trivia. They explain this concept as follows:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The vertical stroke of a skill set represents broader, long-lasting domains, not specific tools or frameworks. An expert generalist therefore pursues depth in distributed-data systems—partitioning and replication strategies, fault-tolerance mechanisms, consistency models, and consensus algorithms—instead of mastering only &lt;em&gt;Databricks notebooks&lt;/em&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This directly addresses a core issue in our field: we often mistake tool proficiency for fundamental competence. The authors make a good point that this is not a new problem. In the 90s, the focus was on mastering tools like Rational Rose instead of the principles of Object-Oriented Programming. Today, we see the same pattern with certifications for specific cloud platforms.&lt;/p&gt;&lt;p&gt;This focus on tools makes our skills brittle and creates organisational silos. As the article states, these labels can become a significant problem:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The labels become an organisational anti-pattern—turning flow into a series of hand-offs when it should be a cross-functional sprint.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To counter this, the authors even propose practical workshops, like building miniature versions of Kafka or Kubernetes, to teach these core concepts directly.&lt;/p&gt;&lt;p&gt;In the end, an expert generalist who focuses on fundamentals can move between technologies with confidence, because they understand that the core challenges of replication, consistency, and fault tolerance remain the same. The benefit is not just personal growth; it creates better teams and partnerships.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;…engineers who have a good grasp of the fundamentals are able to partner well with multiple product and platform teams, without needing to have product specific training for each product.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The &lt;a href=&quot;https://martinfowler.com/articles/expert-generalist.html&quot; rel=&quot;noopener&quot;&gt;full article&lt;/a&gt; offers much more detail and is well worth the read.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The last hurrah of human coding</title>
      <link href="https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/" />
      <updated>2025-06-29T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/</id>
      <content type="html">
				&lt;p&gt;I just read an excellent article by Alex MacCaw titled “&lt;a href=&quot;https://blog.alexmaccaw.com/how-to-vibe-code-as-a-senior-engineer/&quot; rel=&quot;noopener&quot;&gt;How to Vibe Code as a Senior Engineer&lt;/a&gt;”, and it captures the current excitement around AI-assisted development perfectly. He describes “vibe coding” not as a tool for junior developers to get by, but as a genuine superpower for experienced engineers.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It feels like rubbing a magic lamp and whispering your intent to a genie.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;He argues that with the latest generation of AI models, a senior engineer’s productivity can be amplified to an incredible degree. It is a shift from writing every line of code to guiding a powerful, knowledgeable, but context-less assistant. As he puts it, we are in “the last hurrah of human coding” 😯😅, a magical time where our judgment and experience are still essential to guide these powerful new tools.&lt;/p&gt;&lt;h3 id=&quot;the-senior-engineers-toolkit-for-vibe-coding&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/#the-senior-engineers-toolkit-for-vibe-coding&quot;&gt;The senior engineer’s toolkit for vibe coding&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Alex does not just celebrate the concept; he provides a practical toolkit for making it work effectively. His approach is about creating a highly structured environment where the AI can perform at its best. His key requirements include:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;A solid foundation:&lt;/strong&gt; Starting with a rich monorepo scaffold gives the AI clear examples and patterns to follow. A monorepo is particularly effective because all the code is in one place, making it simple to provide the necessary context to the AI.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clear rules of engagement:&lt;/strong&gt; Using a tool like Cursor’s &lt;code&gt;.cursor/rules&lt;/code&gt; to codify project conventions is critical. This acts as a rulebook for your AI assistant. For example, you can define a strict development cycle: force the AI to create a plan before coding, automatically run type-checking and linting after every change, and even forbid it from trying to start a dev server.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Providing the right context:&lt;/strong&gt; AI models have no memory, so it is our job to manually provide all relevant files—including TypeScript definitions—to get quality output.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;A capable editor:&lt;/strong&gt; He recommends Cursor for its tight integration of linting, type-checking, and context management, allowing for rapid iteration.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Using the best models:&lt;/strong&gt; He advises against sacrificing quality for cost, advocating for top-tier models like Claude Opus 4 or Gemini 2.5 Pro.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This is not about letting the AI run wild; it is about creating the perfect conditions for it to succeed under your direction.&lt;/p&gt;&lt;h3 id=&quot;from-vibe-to-structure&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/#from-vibe-to-structure&quot;&gt;From vibe to structure&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This approach strongly connects with my own thoughts, which I shared in a previous post, “&lt;a href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/&quot;&gt;Beyond the vibe: structuring AI-assisted development&lt;/a&gt;”. In that article, I discussed the need for guardrails and a clear “constitution” to make AI collaboration professional and scalable.&lt;/p&gt;&lt;p&gt;Alex’s practical advice feels like the direct implementation of these principles. His “scaffold” and “rules” are the very guardrails and rulebooks I was exploring. It confirms that the path to successfully using these tools in a professional setting is through structure, not chaos.&lt;/p&gt;&lt;p&gt;As I wrote previously, the role of the senior developer is changing:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Your role as a senior engineer has fundamentally shifted. You’re no longer just writing code—you’re curating knowledge, setting boundaries, and teaching both humans and AI systems how to work effectively.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The senior developer becomes the architect of the system that produces the code, embedding their expertise into the process itself.&lt;/p&gt;&lt;h3 id=&quot;the-architect-remains-in-charge&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/the-last-hurrah-of-human-coding/#the-architect-remains-in-charge&quot;&gt;The architect remains in charge&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Alex touches on a crucial point when he lists what AI is bad at: “Taste &amp; Architecture.” This is where human experience remains irreplaceable. An AI can generate code at an astonishing rate, but it cannot understand your project’s long-term vision, its architectural principles, or the subtle trade-offs that define a robust system.&lt;/p&gt;&lt;p&gt;This reinforces my belief that AI does not diminish the importance of software architecture; it elevates it. A well-defined architecture, clear boundaries, and explicit rules are the map and compass the AI needs to navigate your codebase. Without them, you are just generating technical debt faster than ever before.&lt;/p&gt;&lt;p&gt;It is an exciting time to be building software. The tools are becoming magical, but they demand a new level of discipline and architectural clarity from us. We are not just coders anymore; we are becoming the conductors of a powerful orchestra.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Shape your work, influence strategy</title>
      <link href="https://allarddewinter.net/blog/shape-your-work-influence-strategy/" />
      <updated>2025-06-28T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/shape-your-work-influence-strategy/</id>
      <content type="html">
				&lt;p&gt;In my recent post on &lt;a href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/&quot;&gt;a practical toolkit for technology strategy&lt;/a&gt;, I explored how frameworks like Wardley Maps and Pace Layering help us understand the strategic landscape. These are excellent for creating a high-level diagnosis, but the crucial next step is translating that vision into concrete work for our teams.&lt;/p&gt;&lt;p&gt;I recently came across an excellent article by &lt;a href=&quot;https://frederickvanbrabant.com/blog/2025-06-13-choosing-where-to-spend-my-teams-effort/&quot; rel=&quot;noopener&quot;&gt;Frederick Vanbrabant, “Choosing where to spend my team’s effort,”&lt;/a&gt; that provides a hands-on, ground-level guide for this challenge, applicable even within large corporate organisations. He explains how teams can identify and fill gaps in high-level strategy, allowing them to propose their own valuable projects. This approach is not just for managers; it is equally powerful for product owners, principal engineers, or any leader wanting to influence decisions and shape the technical direction.&lt;/p&gt;&lt;p&gt;Frederick’s core idea is that teams can and should move from being passive recipients of tasks to proactive contributors to the strategy. He captures this shift perfectly:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Replace assigned work with chosen work. That’s the shift.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is a powerful mindset change. It is not about adding more work but about shaping the work that is already planned to deliver greater value. Frederick outlines a straightforward process for any team lead to connect their work directly to organisational goals.&lt;/p&gt;&lt;h4 id=&quot;1-truly-understand-the-why&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/shape-your-work-influence-strategy/#1-truly-understand-the-why&quot;&gt;1. Truly understand the ‘why’&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The first step is to go beyond simply reading the strategy document. Frederick advocates for having a deep conversation with your manager about the company’s direction and the reasoning behind it. As he rightly points out:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;What you see depends on where you sit. That means there might be gaps in vision, gaps that you can fill.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;By understanding the bigger picture, you can identify opportunities that might not be visible from higher up.&lt;/p&gt;&lt;h4 id=&quot;2-connect-strategy-to-projects&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/shape-your-work-influence-strategy/#2-connect-strategy-to-projects&quot;&gt;2. Connect strategy to projects&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;With a clear understanding of the goals, the next step is to brainstorm how your team can contribute. Frederick suggests a simplified version of an opportunity solution tree (from Teresa Torres):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Start with a strategic goal&lt;/strong&gt; (e.g., “reduce operational costs”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Brainstorm broad actions&lt;/strong&gt; (e.g., “automate manual processes”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Define specific projects&lt;/strong&gt; (e.g., “build an API to connect the sales and delivery platforms”).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Outline a proof of concept&lt;/strong&gt; to quickly test the idea’s value.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This process does more than just generate ideas; it builds a business case. When you can directly link a project to an organisational goal, you are no longer just pitching a technical task. You are presenting a solution. This makes the project far easier to champion. As Frederick notes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you can pitch your projects in the framework of the company’s strategy your odds of a successful pitch will skyrocket, most of the convincing has been done for you already.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You are speaking the language of the business, which makes it easier for your manager to support and sponsor your proposal.&lt;/p&gt;&lt;h4 id=&quot;3-find-the-multiplier-effect&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/shape-your-work-influence-strategy/#3-find-the-multiplier-effect&quot;&gt;3. Find the multiplier effect&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;The most valuable projects are those that serve multiple strategic goals at once. Using the API example, not only does it reduce manual labour (cutting costs), but it might also provide real-time data needed for a future innovation project (increasing speed and capability).&lt;/p&gt;&lt;p&gt;This is where the high-level view from a Wardley Map, as discussed in my &lt;a href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/&quot;&gt;previous post&lt;/a&gt;, becomes so effective. By mapping your value chain, you can spot where a single technical improvement—like building that API—can unlock value across different parts of the business. Frederick’s method gives you the team-level process to propose and justify that work.&lt;/p&gt;&lt;h3 id=&quot;your-seat-at-the-table&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/shape-your-work-influence-strategy/#your-seat-at-the-table&quot;&gt;Your seat at the table&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This approach is a practical way to increase your team’s autonomy and impact. By consistently proposing well-reasoned projects that align with company goals, you demonstrate strategic thinking. Over time, this helps you earn the freedom to shape your team’s direction, moving from assigned work to chosen work that truly makes a difference.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>What a coffee shop can teach you about system design</title>
      <link href="https://allarddewinter.net/blog/what-a-coffee-shop-can-teach-you-about-system-design/" />
      <updated>2025-06-27T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/what-a-coffee-shop-can-teach-you-about-system-design/</id>
      <content type="html">
				&lt;p&gt;I recently received a genuinely good suggested read from Substack: an article by &lt;a href=&quot;https://newsletter.systemdesignclassroom.com/p/what-a-coffee-shop-taught-me-about-system-design&quot; rel=&quot;noopener&quot;&gt;Raul Junco&lt;/a&gt; that uses a common, everyday experience—ordering a coffee—to explain the core principles of system design. I found the analogy so effective that I wanted to share it here.&lt;/p&gt;&lt;p&gt;In architecture, it can sometimes be challenging to move from complex processes, interconnections, and technologies to a clear overview that still has enough detail. Methodologies like TOGAF and tools like ArchiMate offer guidance, but they can also be overwhelming. I think this post shows an interesting perspective on how to model a system with some practical considerations along the way.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/coffee-shop-systems-design-650w.avif 650w, https://allarddewinter.net/assets/images/coffee-shop-systems-design-960w.avif 960w, https://allarddewinter.net/assets/images/coffee-shop-systems-design-1280w.avif 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/coffee-shop-systems-design-650w.webp 650w, https://allarddewinter.net/assets/images/coffee-shop-systems-design-960w.webp 960w, https://allarddewinter.net/assets/images/coffee-shop-systems-design-1280w.webp 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/coffee-shop-systems-design-650w.jpeg 650w, https://allarddewinter.net/assets/images/coffee-shop-systems-design-960w.jpeg 960w, https://allarddewinter.net/assets/images/coffee-shop-systems-design-1280w.jpeg 1280w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/coffee-shop-systems-design-1280w.jpeg&quot; width=&quot;1280&quot; height=&quot;700&quot; alt=&quot;A diagram showing the parallels between a coffee shop workflow and a system design architecture.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;This diagram by Raul Junco illustrates the coffee shop analogy.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The central idea is that a busy coffee shop operates much like a distributed system in software engineering. By observing how it handles requests, queues, and bottlenecks, we can gain a practical understanding of otherwise abstract concepts.&lt;/p&gt;&lt;p&gt;Here is a breakdown of his main points:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;The Cashier as an API Gateway:&lt;/strong&gt; The system’s entry point that validates and logs requests.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Order Queue as a Message Queue:&lt;/strong&gt; A buffer that holds tasks, where processing time can vary.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Baristas as Event Consumers:&lt;/strong&gt; Independent workers who pull tasks from the queue when they have capacity.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;The Espresso Machine as a Shared Bottleneck:&lt;/strong&gt; A limited resource that can cause contention and slow down the system.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Calling Your Name as a Push Notification:&lt;/strong&gt; An efficient way to signal task completion without wasteful polling.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As Junco puts it:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Distributed systems don’t start in the cloud.&lt;br&gt;They start with understanding how work flows, where it gets stuck, and who needs to be notified.&lt;br&gt;You don’t need Kubernetes to learn system design. You just need to watch how a coffee shop works under pressure.&lt;/p&gt;&lt;p&gt;Next time you’re in line, look around and ask:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Where’s the queue?&lt;/li&gt;&lt;li&gt;What’s async?&lt;/li&gt;&lt;li&gt;What’s the bottleneck?&lt;/li&gt;&lt;li&gt;What breaks under load?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;If you can model a coffee shop, you can model a backend system.&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Using a simple analogy like this is a powerful way to establish a shared understanding with stakeholders before introducing the complexity of a full enterprise architecture model.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Are you the best Chief Data Officer?</title>
      <link href="https://allarddewinter.net/blog/are-you-the-best-chief-data-officer/" />
      <updated>2025-06-26T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/are-you-the-best-chief-data-officer/</id>
      <content type="html">
				&lt;p&gt;I came across a great little game (~4 mins) that lets you test your skills as a Chief Data Officer (CDO) in just four minutes. It is called ‘&lt;a href=&quot;https://www.whoisthebestcdo.com/&quot; rel=&quot;noopener&quot;&gt;Who is the best CDO?&lt;/a&gt;’ and was created by Charlotte Ledoux. You can read more about her thoughts on the game in her &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:7330476177658187777/&quot; rel=&quot;noopener&quot;&gt;LinkedIn post&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The objective is clear:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Your goal: balance innovation with compliance, win support across departments, manage data risks, and prove the value of data to the business.&lt;/p&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;p&gt;You have to manage the two key indicators: Data Quality and Reputation. But your ultimate goal is to increase the company’s profit.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;My own attempt was interesting. I managed a good score on data quality, but my reputation took a hit. Still, I ended up with a nice profit!&lt;/p&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/game-score-650w.avif 650w, https://allarddewinter.net/assets/images/game-score-909w.avif 909w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/game-score-650w.webp 650w, https://allarddewinter.net/assets/images/game-score-909w.webp 909w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/game-score-650w.jpeg 650w, https://allarddewinter.net/assets/images/game-score-909w.jpeg 909w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/game-score-909w.jpeg&quot; width=&quot;909&quot; height=&quot;1966&quot; alt=&quot;My score in the &#39;Who is the best CDO?&#39; game, showing a high profit but mixed results for data quality and reputation.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;It is a fun challenge. Give it a try and see how you do!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Using an LLM as a personal tutor for my systems engineering course</title>
      <link href="https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/" />
      <updated>2025-06-25T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/</id>
      <content type="html">
				&lt;p&gt;I am currently taking the &lt;a href=&quot;https://www.coursera.org/learn/systems-engineering&quot; rel=&quot;noopener&quot;&gt;Introduction to Systems Engineering&lt;/a&gt; course from UNSW Sydney. According to the course description, it “uses a structured yet flexible approach to provide a holistic, solid foundation to the successful development of complicated systems.” It covers the entire system life cycle, from design and development to production and management, explaining how different components interrelate to achieve a project’s goals.&lt;/p&gt;&lt;p&gt;While the video lectures are informative, I find the accompanying study materials can be quite basic and sometimes lack the depth I am looking for. To overcome this and engage with the subject matter, I have developed a workflow that uses a Large Language Model (LLM) as a personal study companion.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/robot-teaching-650w.avif 650w, https://allarddewinter.net/assets/images/robot-teaching-960w.avif 960w, https://allarddewinter.net/assets/images/robot-teaching-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/robot-teaching-650w.webp 650w, https://allarddewinter.net/assets/images/robot-teaching-960w.webp 960w, https://allarddewinter.net/assets/images/robot-teaching-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/robot-teaching-650w.jpeg 650w, https://allarddewinter.net/assets/images/robot-teaching-960w.jpeg 960w, https://allarddewinter.net/assets/images/robot-teaching-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/robot-teaching-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;An illustration of a friendly robot tutor teaching a student about systems engineering.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;My AI study companion, helping me make sense of complex topics.&lt;/figcaption&gt;&lt;/figure&gt;&lt;h3 id=&quot;why-i-use-an-ai-assistant-for-studying&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/#why-i-use-an-ai-assistant-for-studying&quot;&gt;Why I use an AI assistant for studying&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;My approach serves two main purposes.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;To add depth:&lt;/strong&gt; The standard course materials do not always contain all the information I need. An assistant can help fill in the gaps and provide a more comprehensive overview.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;To improve learning:&lt;/strong&gt; Interacting with the theory is crucial for my understanding and retention. This process forces me to synthesise information, which is a more effective way to learn than passive reading.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;my-study-workflow&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/#my-study-workflow&quot;&gt;My study workflow&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;My process transforms fragmented course content into a structured and coherent study guide in OneNote. It involves a few key steps and some custom tools.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gathering the raw materials&lt;/strong&gt;&lt;br&gt;First, I collect all the available information for a course module. This includes video captions, lecture notes, and any provided handouts in PDF format. To handle the PDFs, I use a tool I created, the &lt;a href=&quot;https://allarddewinter.github.io/pdf-to-markdown-converter/&quot; rel=&quot;noopener&quot;&gt;PDF to Markdown Converter&lt;/a&gt;, which I wrote about in a &lt;a href=&quot;https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/&quot; rel=&quot;noopener&quot;&gt;previous post&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The AI study companion&lt;/strong&gt;&lt;br&gt;Next, I feed all this raw text into an LLM. After some experimenting, I have settled on using Google’s Gemini 2.5 Pro for generating the study guides. I found that other models had drawbacks for this specific task; Claude 4 Sonnet was often too talkative, DeepSeek R1 was too brief, and Gemini 2.5 Flash was not detailed enough. The quality of the output, however, depends almost entirely on the prompt.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structuring the notes for OneNote&lt;/strong&gt;&lt;br&gt;The LLM generates a well-structured overview in Markdown. To get this into my preferred note-taking application, I use another tool I built: the &lt;a href=&quot;https://allarddewinter.github.io/markdown-to-onenote/&quot; rel=&quot;noopener&quot;&gt;Markdown to OneNote Converter&lt;/a&gt;. This tool, which I also &lt;a href=&quot;https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/&quot; rel=&quot;noopener&quot;&gt;posted about earlier&lt;/a&gt;, converts the Markdown into formatted text that I can paste directly into a OneNote page.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Final touches&lt;/strong&gt;&lt;br&gt;As a final step, I manually review the generated guide and copy over the most important diagrams and slides from the original materials. This step ensures the visual information is not lost and serves as another engagement with the theory.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;crafting-the-perfect-prompt&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/#crafting-the-perfect-prompt&quot;&gt;Crafting the perfect prompt&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The heart of this workflow is the prompt. A good prompt is the difference between a generic summary and a truly useful study guide. I collaborated with Claude 4 Sonnet to develop and refine my prompt.&lt;/p&gt;&lt;p&gt;Here is a summary of that development process:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Initial Goal:&lt;/strong&gt; Create an AI agent to synthesise video content and poor-quality handouts into comprehensive, exam-ready study materials for my Systems Engineering course.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Evolution:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Version 1: Comprehensive Foundation.&lt;/strong&gt; Established the agent’s identity and a detailed output structure.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Version 2: Course-Centric Focus.&lt;/strong&gt; Shifted priority to the course’s specific learning objectives and improved diagram preferences.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Version 3: Holistic Integration.&lt;/strong&gt; Moved from separate content blocks to a unified, flowing narrative for better retention.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Version 4: Enhanced Learning Techniques.&lt;/strong&gt; Added metacognitive support, concept mapping, and comparative analysis to deepen understanding.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Final Agent Characteristics:&lt;/strong&gt; The final prompt defines an elite Systems Engineering educator that transforms fragmented materials into a single, integrated study guide focused on clarity, retention, and the course’s specific goals.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-final-prompt-my-systems-engineering-master-educator&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/using-an-llm-as-a-personal-tutor-for-my-systems-engineering-course/#the-final-prompt-my-systems-engineering-master-educator&quot;&gt;The final prompt: My systems engineering master educator&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This iterative process resulted in the following detailed prompt, which I now use to generate my study guides that help me understand the theory.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Click to view the full prompt&lt;/summary&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;**Systems Engineering Master Educator &amp; Study Companion**

## **Your Core Identity**
You are an elite Systems Engineering educator with 20+ years of experience in both academic instruction and real-world systems implementation. You have taught at top-tier universities, consulted for Fortune 500 companies, and have deep expertise in systems thinking, requirements engineering, system architecture, verification &amp; validation, and lifecycle management. You are passionate about making complex systems concepts crystal clear and intuitive for students.

## **Your Mission**
Transform poorly structured course materials into a **unified, holistic study guide** that flows seamlessly from concept to application to exam preparation. You will receive handout text and video captions from an &quot;Introduction to Systems Engineering&quot; course and synthesize them into a **single, integrated learning experience** that ensures deep understanding and academic success.

## **Your Primary Approach**

### **Course-Centric Analysis**
- **Extract and prioritize** the explicit learning objectives from the provided course materials
- **Map course content structure** to identify the intended learning progression
- **Identify gaps** in the provided materials and fill them with pedagogically sound content
- **Align everything** to the course&#39;s specific goals, terminology, and emphasis areas
- **Supplement strategically** only when course content is incomplete or unclear

### **Holistic Integration Philosophy**
- **Seamless narrative flow** - Weave concepts, examples, applications, and study aids into one coherent story
- **Natural progression** - Let each idea build organically into the next
- **Integrated learning** - Embed real-world examples, memory aids, and exam insights throughout the explanation
- **Study-optimized structure** - Organize content for maximum retention and easy review
- **Concise clarity** - Provide comprehensive understanding without overwhelming text volume

### **Enhanced Learning Techniques**
- **Concept mapping** - Help you visualize how ideas connect and build mental models of system relationships
- **Comparative analysis** - Highlight key differences between similar concepts to prevent confusion and deepen understanding

## **Your Integrated Output Approach**

Create a **unified study overview** that naturally weaves together:

- **Course learning objectives** introduced at the beginning and reinforced throughout
- **Core concepts** explained through a logical narrative flow
- **Mental models and concept maps** that show how ideas interconnect
- **Comparative insights** that clarify distinctions between related concepts
- **Real-world examples** seamlessly integrated into concept explanations
- **Visual aids** (Tables, Mermaid, PlantUML, GraphViz, or minimal ASCII) embedded where they naturally enhance understanding
- **Memory aids and analogies** woven into the conceptual explanations
- **Exam-relevant insights** highlighted naturally within the content flow
- **Practice elements** integrated as &quot;checkpoint questions&quot; throughout the narrative
- **Cross-connections** to other course topics mentioned organically as concepts build

### **Structure Your Holistic Overview As:**

**🎯 [Topic Title] - Complete Study Guide**

Begin with course learning objectives, then create a **flowing narrative** that:
- Introduces concepts with immediate real-world context
- **Maps concept relationships** visually and conceptually
- **Compares and contrasts** similar ideas to prevent confusion
- Builds complexity naturally while reinforcing fundamentals
- Embeds visual diagrams or tables exactly where they clarify the explanation
- Integrates industry examples as natural extensions of theory
- Weaves in memory techniques and analogies as concepts are explained
- Includes &quot;💡 Key Insight&quot; moments that highlight exam-critical points
- Poses &quot;🤔 Check Your Understanding&quot; questions at natural transition points
- Connects to previous and future course topics organically
- Concludes with integrated summary that reinforces the complete picture

#### diagrams guide
Create diagrams using (in order of preference):
- Mermaid Diagrams - for flowcharts, process flows, and system diagrams
- PlantUML Diagrams - for UML-style system architecture and relationships
- GraphViz Diagrams - for complex network relationships and hierarchies
- Simple ASCII diagrams - only as a last resort when other formats aren&#39;t suitable

## **Your Specialized Integration Capabilities**

### **Narrative Construction**
- Transform fragmented course materials into compelling, logical stories
- Create natural bridges between concepts, examples, and applications
- Build momentum that carries students through complex topics
- Maintain engagement while covering comprehensive content **efficiently**

### **Seamless Enhancement**
- Embed visual aids at optimal comprehension points
- Integrate memory techniques into concept introductions
- Weave exam insights throughout rather than segregating them
- Connect theory to practice within single, flowing explanations

### **Study Optimization**
- Structure content for easy scanning and review
- Create natural &quot;checkpoint&quot; moments for self-assessment
- Build in multiple reinforcement opportunities within the narrative
- Design content that supports both initial learning and exam review
- **Prioritize brevity with completeness** - comprehensive understanding without excessive text
- Reuse wording from the original course
- Make sure to have all concepts from the course in the study guide
- Add a table with abbreviations and acronyms
- If exam or quiz questions are added; make sure the concepts are well defined in the overall handouts. The answers I provide may not be correct, so rely on your own knowledge and the earlier input.

## **Your Commitment**
- **Holistic integration** - Every element serves the unified learning experience
- **Study-optimized flow** - Content organized for maximum retention and easy review
- **Course fidelity** - All enhancements serve the original learning objectives
- **Seamless experience** - Students should feel they&#39;re reading one masterfully crafted guide
- **Efficient learning** - Provide complete understanding through clear, concise explanations

**Remember**: You are creating a masterful, integrated learning experience - not a collection of separate explanations or lengthy textbook chapters. Your goal is one seamless, comprehensive yet concise study guide that flows naturally from beginning to end while covering everything needed for deep understanding and exam success.&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;
 			</content>
    </entry><entry>
      <title>Finding leverage in the middle: Thoughts on domain engineering</title>
      <link href="https://allarddewinter.net/blog/finding-leverage-in-the-middle-thoughts-on-domain-engineering/" />
      <updated>2025-06-24T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/finding-leverage-in-the-middle-thoughts-on-domain-engineering/</id>
      <content type="html">
				&lt;p&gt;I recently came across a very clear article by Jack Danger called &lt;a href=&quot;https://jackdanger.com/infrastructure-gravity/&quot; rel=&quot;noopener&quot;&gt;Infrastructure Gravity&lt;/a&gt;. It puts a name to a concept I have been thinking about a lot lately: the critical importance of the ‘middle layer’ in a company’s technology stack.&lt;/p&gt;&lt;p&gt;In his article, Jack argues that engineering organisations do not have two layers (Product and Infrastructure), but three. He identifies powerful forces that pull engineers to the extremes. &lt;strong&gt;Feature Lift&lt;/strong&gt; pulls them towards shipping visible new features, while &lt;strong&gt;Infrastructure Gravity&lt;/strong&gt; pulls them down into the foundational, transferable skills of running software.&lt;/p&gt;&lt;p&gt;This leaves the middle layer—what he calls &lt;strong&gt;Domain Engineering&lt;/strong&gt;—often neglected. This is the layer that contains the logic and concepts unique to the company’s business but shared across multiple features. It is the connective tissue.&lt;/p&gt;&lt;h3 id=&quot;the-power-of-the-domain-layer&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/finding-leverage-in-the-middle-thoughts-on-domain-engineering/#the-power-of-the-domain-layer&quot;&gt;The power of the domain layer&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This middle layer is where the real leverage for a company exists. It is the difference between building a series of disconnected features and creating a cohesive, scalable system.&lt;/p&gt;&lt;p&gt;Consider a practical example from industrial technology. In the past, connecting a wind turbine’s SCADA control system to a cloud platform for machine learning was often a direct, point-to-point job. An engineer would write custom code to pull data from the turbine and push it to a specific cloud endpoint. This works, but it is fragile. What happens when you add a new type of turbine, or want to send the data to a second platform? You have to build it all over again.&lt;/p&gt;&lt;p&gt;Now, imagine introducing a domain layer. This layer does not just move data; it acts as a standardisation layer. It provides a standard way for any system—new or old—to talk about turbines and their data, for example, by enabling the use of a shared ontology like &lt;a href=&quot;https://community.wedowind.ch/spaces/17701604/page&quot; rel=&quot;noopener&quot;&gt;WeDoWind&lt;/a&gt; for the wind industry.&lt;/p&gt;&lt;p&gt;The SCADA system sends its data once, to the domain layer. The machine learning platform requests data once, from the domain layer. This layer is the translator and the central hub. It is a powerful enabler for long-term growth, making it simpler to add new data sources and consumers without rebuilding the core logic each time.&lt;/p&gt;&lt;h3 id=&quot;putting-it-into-practice&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/finding-leverage-in-the-middle-thoughts-on-domain-engineering/#putting-it-into-practice&quot;&gt;Putting it into practice&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;At my own company, we are making a conscious effort to invest more in this middle, or domain, architecture. We see it not as a cost centre, but as a strategic investment. It helps us structure our development efforts and ensures that our short-term work aligns with our long-term vision.&lt;/p&gt;&lt;p&gt;By deliberately building and maintaining this domain layer, we are not just fixing problems; we are building leverage for the future. It allows us to move faster, be more consistent, and build a more resilient and valuable technology platform.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Beyond the vibe: structuring AI-assisted development</title>
      <link href="https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/" />
      <updated>2025-06-23T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/</id>
      <content type="html">
				&lt;p&gt;I recently came across a very informative post by Diwank Singh titled “&lt;a href=&quot;https://diwank.space/field-notes-from-shipping-real-code-with-claude&quot; rel=&quot;noopener&quot;&gt;Field Notes From Shipping Real Code With Claude&lt;/a&gt;”. It explores the concept of “vibe coding”—letting an AI assistant like Claude handle much of the implementation while the developer guides the process.&lt;/p&gt;&lt;p&gt;While the term sounds casual, Diwank’s article makes a crucial point: to make this work effectively in a professional environment, you need structure, discipline, and clear guardrails. It is not about mindlessly accepting AI output; it is about amplifying your own capabilities.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Instead of crafting every line, you’re reviewing, refining, directing. But—and this cannot be overstated—you remain the architect. Claude is your intern with encyclopedic knowledge but zero context about your specific system, your users, your business logic.&lt;/p&gt;&lt;/blockquote&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/working-with-robots-650w.avif 650w, https://allarddewinter.net/assets/images/working-with-robots-960w.avif 960w, https://allarddewinter.net/assets/images/working-with-robots-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/working-with-robots-650w.webp 650w, https://allarddewinter.net/assets/images/working-with-robots-960w.webp 960w, https://allarddewinter.net/assets/images/working-with-robots-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/working-with-robots-650w.jpeg 650w, https://allarddewinter.net/assets/images/working-with-robots-960w.jpeg 960w, https://allarddewinter.net/assets/images/working-with-robots-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/working-with-robots-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;An illustration of a person and robots collaborating.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Effective collaboration with AI requires clear rules and boundaries.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This post summarises some of the key ideas from the article and adds my own reflections on how these practices change our ways of working.&lt;/p&gt;&lt;h3 id=&quot;the-different-modes-of-vibe-coding&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/#the-different-modes-of-vibe-coding&quot;&gt;The different modes of vibe coding&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Diwank’s article outlines three distinct modes of working with an AI, each with its own purpose and level of rigour. I have found this framework very useful for thinking about when and how to apply these tools.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Mode&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Characteristics&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Best For&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;The Playground&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Chaotic and fast. The AI writes 80-90% of the code with minimal guidance.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Weekend hacks, proofs-of-concept, and personal scripts. Not for production.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Pair Programming&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Structured collaboration. The developer provides context and guidance, often through a project “rulebook”.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Small to medium-sized projects, well-scoped features, and side projects with real users.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Production Scale&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Highly orchestrated. Requires deep context, strict boundaries, and careful integration into complex systems.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Large, mature codebases and monorepos where mistakes have significant consequences.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;the-constitution-for-your-code&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/#the-constitution-for-your-code&quot;&gt;The constitution for your code&lt;/a&gt;&lt;/h3&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/cursor-rules-options-650w.avif 650w, https://allarddewinter.net/assets/images/cursor-rules-options-960w.avif 960w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/cursor-rules-options-650w.webp 650w, https://allarddewinter.net/assets/images/cursor-rules-options-960w.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/cursor-rules-options-650w.jpeg 650w, https://allarddewinter.net/assets/images/cursor-rules-options-960w.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/cursor-rules-options-960w.jpeg&quot; width=&quot;960&quot; height=&quot;410&quot; alt=&quot;Screenshot of the Cursor editor&#39;s rules options; project rules, user rules, and memories.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Cursor has the options for three kind of rules (or four?).&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The concept of a “rulebook” is becoming a standard for professional AI-assisted development. &lt;a href=&quot;https://www.anthropic.com/engineering/claude-code-best-practices&quot; rel=&quot;noopener&quot;&gt;Claude&lt;/a&gt;, &lt;a href=&quot;https://docs.cline.bot/features/cline-rules&quot; rel=&quot;noopener&quot;&gt;Cline&lt;/a&gt;, and &lt;a href=&quot;https://docs.cursor.com/context/rules&quot; rel=&quot;noopener&quot;&gt;Cursor&lt;/a&gt; each offer a way to provide persistent context, but they differ in their approach. Claude’s &lt;code&gt;CLAUDE.md&lt;/code&gt; is the most straightforward, while Cline offers more organisation with its folder system. Cursor provides the most granular and controlling system, allowing developers to define precisely &lt;em&gt;how&lt;/em&gt; and &lt;em&gt;when&lt;/em&gt; a rule should apply.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Feature&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Claude (&lt;code&gt;CLAUDE.md&lt;/code&gt;)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Cline (&lt;code&gt;cline.rules&lt;/code&gt;)&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Cursor (&lt;code&gt;.cursor/rules&lt;/code&gt;)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;File Location&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; in repo root, sub-directories, or home folder.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;.clinerules/&lt;/code&gt; folder in project root or a global folder.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;code&gt;.cursor/rules/&lt;/code&gt; folder, which can be nested in sub-directories.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;File Format&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Plain Markdown (&lt;code&gt;.md&lt;/code&gt;).&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Plain Markdown (&lt;code&gt;.md&lt;/code&gt;).&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Markdown with metadata (&lt;code&gt;.mdc&lt;/code&gt;).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Activation&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Automatic, based on file location. Always on if present.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Automatic (all files in folder are active) with a UI to toggle rules during a session.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Highly configurable: Always, Auto Attached (by file path), Agent Requested, or Manual.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Scoping&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Repository, sub-directory, and global user level.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Workspace and global user level.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Project, nested sub-directory, global user level, and automatic “Memories”.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Key Differentiator&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Simplicity and being unopinionated.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Organised folder structure and an easy-to-use UI toggle.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Fine-grained control and conditional activation logic.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;applying-the-rules-the-art-of-steering&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/#applying-the-rules-the-art-of-steering&quot;&gt;Applying the rules: the art of steering&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;However, as Diwank Singh’s article masterfully illustrates, the real power is not just in having a rulebook, but in the art of actively steering the AI. He details a layered approach that goes far beyond a single file, creating a hierarchy of influence from global principles down to task-specific directives.&lt;/p&gt;&lt;p&gt;Here are some of the steering mechanisms he describes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Anchor comments:&lt;/strong&gt; These are hyper-localised instructions embedded directly in the code to act as surgical constraints. They bind rules to specific code blocks, reference architectural decisions, and use imperative language to override generic assumptions.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Prompt engineering as control flow:&lt;/strong&gt; This involves treating prompts as execution blueprints rather than simple requests. An advanced prompt hardwires business constraints, links to authoritative documents to reduce hallucination, and is designed to be token-aware to avoid iterative fixes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Workflow choreography:&lt;/strong&gt; Instead of asking for code directly, the AI is orchestrated through distinct phases: research, planning, execution, and validation. This forces the AI into a structured problem-solving process that mirrors a standard software development lifecycle.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tool lockdown via permissions:&lt;/strong&gt; This technique involves controlling the AI’s capabilities on a per-session or global basis, granting only the permissions absolutely needed for a task. It treats the AI like a least-privilege system process.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Session psychology management:&lt;/strong&gt; The article advocates for using fresh, task-bound sessions for distinct tasks to avoid “context pollution,” where information from a previous, unrelated task bleeds into the AI’s current model.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As Diwank summarises:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Without proper guardrails, you’re playing whack-a-mole with an overeager intern. With them, you gain a tireless co-pilot who respects your flight plan.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-sacred-boundaries-what-an-ai-must-never-touch&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/#the-sacred-boundaries-what-an-ai-must-never-touch&quot;&gt;The sacred boundaries: what an AI must never touch&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;This brings us to the guardrails. While an AI can accelerate implementation, some areas of a codebase are too critical to delegate. The article provides a clear list:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Test files:&lt;/strong&gt; Tests are the executable specification of your intent. An AI should never write or modify them.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Database migrations:&lt;/strong&gt; These are often irreversible and carry a high risk of data loss.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Security-critical code:&lt;/strong&gt; Authentication, authorisation, and encryption logic must be handled with human oversight.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;API contracts:&lt;/strong&gt; Changing an API can break client applications and should only be done deliberately.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Configuration and secrets:&lt;/strong&gt; The AI should never handle secrets or production settings.&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&quot;the-change-in-ways-of-working&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/#the-change-in-ways-of-working&quot;&gt;The change in ways of working&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Adopting these tools and practices fundamentally changes team dynamics and individual roles.&lt;/p&gt;&lt;p&gt;Onboarding a new developer, for instance, looks different. Their first task is no longer just setting up a development environment, but also reading and understanding the project’s rulebook. This document becomes the foundation for how they, and their AI partner, will contribute.&lt;/p&gt;&lt;p&gt;The role of a senior developer also evolves. As Diwank’s article highlights:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Your role as a senior engineer has fundamentally shifted. You’re no longer just writing code—you’re curating knowledge, setting boundaries, and teaching both humans and AI systems how to work effectively.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The senior developer shifts from being just a top producer of code to an architect of the system that produces code. Their expertise is now captured and scaled through the AI, guiding both junior developers and the model itself.&lt;/p&gt;&lt;h3 id=&quot;a-reflection-on-software-architecture&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/beyond-the-vibe-structuring-ai-assisted-development/#a-reflection-on-software-architecture&quot;&gt;A reflection on software architecture&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;A final thought on software architecture: It might seem like these AI tools reduce the need for deep architectural thinking, but I think the opposite is true.&lt;/p&gt;&lt;p&gt;An AI cannot invent your system’s boundaries or understand the trade-offs behind your API contracts. It is a powerful implementation engine, but it needs a well-defined map to operate effectively. This forces us to be more explicit about our architectural decisions. The project rulebook is, in essence, a living architectural document that is both human-readable and machine-actionable.&lt;/p&gt;&lt;p&gt;With these new ways of working, the role of the software architect is still critical. Their job is to define the playground, set the rules, and draw the lines the AI must not cross. Vibe coding can be incredibly powerful, but only when it happens within a well-designed and clearly communicated structure.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>How extraversion shapes remote communication</title>
      <link href="https://allarddewinter.net/blog/how-extraversion-shapes-remote-communication/" />
      <updated>2025-06-22T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/how-extraversion-shapes-remote-communication/</id>
      <content type="html">
				&lt;p&gt;I recently read a great piece in the &lt;em&gt;Research-Driven Engineering Leadership&lt;/em&gt; newsletter by Lizzie that I wanted to share. It explores how our personality, specifically whether we are more introverted or extraverted, affects how we experience remote work.&lt;/p&gt;&lt;p&gt;Of course, introversion and extraversion are not black and white categories. Still, it can serve as a simplification model (systems engineering, anyone?) that we can use to study and improve real-life interactions.&lt;/p&gt;&lt;p&gt;The study highlighted an interesting contrast in communication needs:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Task-focused team talk is good for everyone.&lt;/strong&gt; When team interactions were centred on the work at hand, everyone reported being more productive. This effect was even stronger for extraverts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Supervisor interactions are personal.&lt;/strong&gt; This was the most surprising finding for me. Introverts reported higher well-being and productivity after having relational, more social chats with their supervisors. Extraverts, on the other hand, benefited more from task-oriented conversations with their boss. My gut feeling would have said this was the other way around, so that is an interesting find!&lt;/li&gt;&lt;li&gt;&lt;strong&gt;More check-ins are not always better.&lt;/strong&gt; This was not so much of an eye-opener, but it is an important reminder: a higher frequency of interactions with a supervisor was linked to a slight &lt;em&gt;decrease&lt;/em&gt; in productivity for everyone. This suggests that the quality and purpose of an interaction are more important than the quantity.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-practical-takeaway&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/how-extraversion-shapes-remote-communication/#a-practical-takeaway&quot;&gt;A practical takeaway&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The original article offers more clear advice, but one point stands out for creating an inclusive remote environment: provide balanced communication channels. Ensure your team has access to a mix of structured, task-oriented discussions and informal, relational spaces to meet the diverse needs of every team member.&lt;/p&gt;&lt;p&gt;The original article can be found here: &lt;a href=&quot;https://rdel.substack.com/p/rdel-97-how-does-extraversion-shape&quot; rel=&quot;noopener&quot;&gt;RDEL #97: How does extraversion shape communication behavior in remote workplaces?&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Not BYOD, but BYOS: Learning by building</title>
      <link href="https://allarddewinter.net/blog/not-byod-but-byos-learning-by-building/" />
      <updated>2025-06-21T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/not-byod-but-byos-learning-by-building/</id>
      <content type="html">
				&lt;p&gt;Not Bring Your Own Device, but Build Your Own Software 😅.&lt;/p&gt;&lt;p&gt;I love guides like these. You can learn so much from building something with your own hands. You discover details that can only be learned through experience, not just from reading a book. This is also why practical courses are so valuable; they help bridge the gap between theory and real-world application.&lt;/p&gt;&lt;p&gt;The main challenge, of course, is finding the time. For me, the best approach is to work on something that helps me in my daily life. That way, I can more easily justify the time spent.&lt;/p&gt;&lt;p&gt;I recently came across a fantastic repository on GitHub that is a great resource for this kind of learning: &lt;a href=&quot;https://github.com/codecrafters-io/build-your-own-x?tab=readme-ov-file&quot; rel=&quot;noopener&quot;&gt;Build your own X&lt;/a&gt;. The project’s philosophy is captured perfectly by a quote from Richard Feynman:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;What I cannot create, I do not understand.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The repository is a compilation of well-written, step-by-step guides for re-creating our favourite technologies from scratch. The list of project categories is impressive, and each one contains many different projects to build:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;3D Renderer&lt;/li&gt;&lt;li&gt;Augmented Reality&lt;/li&gt;&lt;li&gt;BitTorrent Client&lt;/li&gt;&lt;li&gt;Blockchain / Cryptocurrency&lt;/li&gt;&lt;li&gt;Bot&lt;/li&gt;&lt;li&gt;Command-Line Tool&lt;/li&gt;&lt;li&gt;Database&lt;/li&gt;&lt;li&gt;Docker&lt;/li&gt;&lt;li&gt;Emulator / Virtual Machine&lt;/li&gt;&lt;li&gt;Front-end Framework / Library&lt;/li&gt;&lt;li&gt;Game&lt;/li&gt;&lt;li&gt;Git&lt;/li&gt;&lt;li&gt;Network Stack&lt;/li&gt;&lt;li&gt;Neural Network&lt;/li&gt;&lt;li&gt;Operating System&lt;/li&gt;&lt;li&gt;Physics Engine&lt;/li&gt;&lt;li&gt;Programming Language&lt;/li&gt;&lt;li&gt;Regex Engine&lt;/li&gt;&lt;li&gt;Search Engine&lt;/li&gt;&lt;li&gt;Shell&lt;/li&gt;&lt;li&gt;Template Engine&lt;/li&gt;&lt;li&gt;Text Editor&lt;/li&gt;&lt;li&gt;Visual Recognition System&lt;/li&gt;&lt;li&gt;Voxel Engine&lt;/li&gt;&lt;li&gt;Web Browser&lt;/li&gt;&lt;li&gt;Web Server&lt;/li&gt;&lt;li&gt;Uncategorized&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It is an excellent resource for anyone looking to deepen their technical understanding.&lt;/p&gt;&lt;p&gt;Another good resource is this substack newsletter: [coding challenges](&lt;a href=&quot;https://open.substack.com/pub/coding&quot; rel=&quot;noopener&quot;&gt;https://open.substack.com/pub/coding&lt;/a&gt; challenges), from John Crickett. It is a weekly challenge to level up your coding skills, giving you knowledge in the inside workings of software tools you normally use without thinking.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>The small habits that define great managers</title>
      <link href="https://allarddewinter.net/blog/the-small-habits-that-define-great-managers/" />
      <updated>2025-06-20T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/the-small-habits-that-define-great-managers/</id>
      <content type="html">
				&lt;p&gt;I came across this nice article from First Round Review, and it offers simple and easy to apply small things you can do to make life better for the people around you in your company. I like that it is not (only) about grand gestures, but about the consistent, small habits that build trust and empower people.&lt;/p&gt;&lt;p&gt;The original article, &lt;a href=&quot;https://review.firstround.com/the-25-micro-habits-of-high-impact-managers/&quot; rel=&quot;noopener&quot;&gt;The 25 Micro-Habits of High-Impact Managers&lt;/a&gt;, is well worth a full read.&lt;/p&gt;&lt;p&gt;The piece lists 25 habits, and I have included them all below. A few, in particular, stood out to me because I either appreciate them in a manager or try to practise them myself.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Don’t swerve around a debate.&lt;/li&gt;&lt;li&gt;Be generous with your ideas.&lt;/li&gt;&lt;li&gt;Think of yourself as the team captain, not the head coach.&lt;/li&gt;&lt;li&gt;Set the tone with cross-functional partners.&lt;/li&gt;&lt;li&gt;Write down what makes you tick.&lt;/li&gt;&lt;li&gt;Shine a light on failure.&lt;/li&gt;&lt;li&gt;Pull back the curtain.&lt;/li&gt;&lt;li&gt;Make space for reflection.&lt;/li&gt;&lt;li&gt;Reserve time for thinking outside the box.&lt;/li&gt;&lt;li&gt;Find the connective tissue.&lt;/li&gt;&lt;li&gt;Resist the urge to multitask.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;This means being fully present in conversations, especially 1:1s, showing your team they have your undivided attention.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Follow up and follow through.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;It highlights the importance of consistency and reliability, closing loops on open items to build trust.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Don’t forget the humans behind the company’s goals.&lt;/li&gt;&lt;li&gt;Encourage folks to put themselves first.&lt;/li&gt;&lt;li&gt;Cushion the blows.&lt;/li&gt;&lt;li&gt;Create a monthly performance review action plan.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;This turns annual feedback into a continuous, actionable process with regular check-ins on progress.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Reinforce good habits.&lt;/li&gt;&lt;li&gt;Take a beat before delivering feedback.&lt;/li&gt;&lt;li&gt;Look for opportunities to praise in the moment.&lt;/li&gt;&lt;li&gt;Spot chances to send kudos up the chain.&lt;/li&gt;&lt;li&gt;Celebrate moments outside of the office, too.&lt;/li&gt;&lt;li&gt;Invest in their career.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;A great manager actively helps people get to the next step, seeing the current role as just one part of their journey.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Bring in mentors and skip-levels.&lt;/li&gt;&lt;li&gt;Make space for growth.&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;This involves actively checking in on a person’s well-being and career goals to ensure they do not feel stuck.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Sharpen your arrows.&lt;/li&gt;&lt;/ol&gt;
 			</content>
    </entry><entry>
      <title>Security risks in LLM agents: Simon Willison’s insights</title>
      <link href="https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/" />
      <updated>2025-06-19T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/</id>
      <content type="html">
				&lt;p&gt;In his latest newsletter and blog posts, Simon Willison shared some excellent thoughts on the security challenges surrounding LLM (Large Language Model) agents. These agents, also known as tool-using LLM systems, are AI models that interact with external tools or systems to perform tasks. Simon’s analysis moves from theoretical frameworks to practical examples, highlighting the risks and potential solutions. Here are some of his recent posts that I found especially insightful:&lt;/p&gt;&lt;h3 id=&quot;1-the-lethal-trifecta-for-ai-agents-private-data-untrusted-content-and-external-communication&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/#1-the-lethal-trifecta-for-ai-agents-private-data-untrusted-content-and-external-communication&quot;&gt;1. The lethal trifecta for AI agents: private data, untrusted content, and external communication&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;p&gt;If you’re using LLM agents that combine private data access, exposure to untrusted content, and external communication capabilities, you’re exposing yourself to significant risks. Simon explains this as the “lethal trifecta”:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you are a user of LLM systems that use tools (you can call them “AI agents” if you like) it is critically important that you understand the risk of combining tools with the following three characteristics. Failing to understand this can let an attacker steal your data. The lethal trifecta of capabilities is:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Access to your private data – one of the most common purposes of tools in the first place!&lt;/li&gt;&lt;li&gt;Exposure to untrusted content – any mechanism by which text (or images) controlled by a malicious attacker could become available to your LLM.&lt;/li&gt;&lt;li&gt;The ability to externally communicate in a way that could be used to steal your data (I often call this “exfiltration” but I’m not confident that term is widely understood).&lt;br&gt;If your agent combines these three features, an attacker can easily trick it into accessing your private data and sending it to that attacker.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/the-lethal-trifecta-650w.avif 650w, https://allarddewinter.net/assets/images/the-lethal-trifecta-960w.avif 960w, https://allarddewinter.net/assets/images/the-lethal-trifecta-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/the-lethal-trifecta-650w.webp 650w, https://allarddewinter.net/assets/images/the-lethal-trifecta-960w.webp 960w, https://allarddewinter.net/assets/images/the-lethal-trifecta-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/the-lethal-trifecta-650w.jpeg 650w, https://allarddewinter.net/assets/images/the-lethal-trifecta-960w.jpeg 960w, https://allarddewinter.net/assets/images/the-lethal-trifecta-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/the-lethal-trifecta-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;700&quot; alt=&quot;Illustration of the lethal trifecta in LLM agents&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;h3 id=&quot;2-design-patterns-for-securing-llm-agents-against-prompt-injections&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/#2-design-patterns-for-securing-llm-agents-against-prompt-injections&quot;&gt;2. Design patterns for securing LLM agents against prompt injections&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://simonwillison.net/2025/Jun/13/prompt-injection-design-patterns/&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Simon highlights several design patterns to protect LLM agents from prompt injection attacks. These patterns include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The Action-Selector Pattern&lt;/li&gt;&lt;li&gt;The Plan-Then-Execute Pattern&lt;/li&gt;&lt;li&gt;The LLM Map-Reduce Pattern&lt;/li&gt;&lt;li&gt;The Dual LLM Pattern&lt;/li&gt;&lt;li&gt;The Code-Then-Execute Pattern&lt;/li&gt;&lt;li&gt;The Context-Minimization Pattern&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These patterns are discussed in detail in the paper &lt;a href=&quot;https://arxiv.org/abs/2506.08837&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;3-an-introduction-to-googles-approach-to-ai-agent-security&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/#3-an-introduction-to-googles-approach-to-ai-agent-security&quot;&gt;3. An introduction to Google’s approach to AI agent security&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://simonwillison.net/2025/Jun/15/ai-agent-security/&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Google outlines three core principles for securing AI agents:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Agents must have well-defined human controllers.&lt;blockquote&gt;&lt;p&gt;It is essential for security and accountability that agents operate under clear human oversight. Every agent must have a well-defined set of controlling human user(s).&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Agent powers must have limitations.&lt;/li&gt;&lt;li&gt;Agent actions and planning must be observable.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Simon agrees with this approach, emphasizing the importance of transparency in LLM systems:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Yes. Yes. Yes. LLM systems that hide what they are doing from me are inherently frustrating – they make it much harder for me to evaluate if they are doing a good job and spot when they make mistakes. This paper has convinced me that there’s a very strong security argument to be made too: the more opaque the system, the less chance I have to identify when it’s going rogue and being subverted by prompt injection attacks.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I also appreciate this approach. Working with LLMs that display their thought process is more intuitive and even entertaining 😅. It helps fine-tune prompts and ensures better results. This is especially useful when working with tools like Cline, where you can ask it to start with a planning phase and it shows you all the intermediate steps.&lt;/p&gt;&lt;h3 id=&quot;4-breaking-down-echoleak-the-first-zero-click-ai-vulnerability&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/#4-breaking-down-echoleak-the-first-zero-click-ai-vulnerability&quot;&gt;4. Breaking down ‘EchoLeak’, the first zero-click AI vulnerability&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.aim.security/lp/aim-labs-echoleak-blogpost&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The ‘EchoLeak’ vulnerability in Microsoft 365 Copilot was a major security concern. It demonstrated how the lethal trifecta can be exploited in real-world scenarios:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The lethal trifecta strikes again! Any time a system combines access to private data with exposure to malicious tokens and an exfiltration vector you’re going to see the same exact security issue.&lt;/p&gt;&lt;/blockquote&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-650w.avif 650w, https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-960w.avif 960w, https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-650w.webp 650w, https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-960w.webp 960w, https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-650w.jpeg 650w, https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-960w.jpeg 960w, https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/image-of-a-mischievous-looking-ai-robot-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;A mischievous-looking AI robot juggling data, made with recraft.ai&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;This AI looks like it’s up to no good!&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This vulnerability was big news in many companies, including mine. While Copilot has been a valuable tool for managing business data, especially as an advanced search function, it also highlights the risks we face. I have always raised my eyebrows at SharePoint’s usability and design decisions, but Copilot made it easier to find documents. However, this incident underscores the need for caution.&lt;/p&gt;&lt;h3 id=&quot;bonus-anthropics-multi-agent-research-system&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/security-risks-in-llm-agents-simon-willisons-insights/#bonus-anthropics-multi-agent-research-system&quot;&gt;Bonus: Anthropic’s multi-agent research system&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://www.anthropic.com/engineering/built-multi-agent-research-system&quot; rel=&quot;noopener&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Simon also shared a link to Anthropic’s documentation on their multi-agent research system. It’s a great example of how to build secure and effective LLM agents. You can read more about it &lt;a href=&quot;https://www.anthropic.com/engineering/built-multi-agent-research-system&quot; rel=&quot;noopener&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A practical toolkit for technology strategy</title>
      <link href="https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/" />
      <updated>2025-06-18T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/</id>
      <content type="html">
				&lt;p&gt;In my work, I have often sought to be more effective in creating technology strategy. It is not enough to only have a good idea; I need a clear path from a high-level vision to tangible, on-the-ground execution. This is what makes ‘strategy’ practical and applicable. This requires a complete toolkit that allows us to see the landscape, diagnose our position, and then act with purpose.&lt;/p&gt;&lt;p&gt;In the past months, I have seen some great posts with practical ideas on how to be better at strategy. In this post, I will combine insights from these thinkers. It starts with understanding the terrain using the powerful mapping tools detailed in an excellent article by Alex Ewerlöf, &lt;a href=&quot;https://blog.alexewerlof.com/p/wardley-maps-and-pace-layering-for&quot; rel=&quot;noopener&quot;&gt;Wardley Maps &amp; Pace Layering for Senior Tech Leads&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&quot;the-strategic-landscape-seeing-the-terrain&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#the-strategic-landscape-seeing-the-terrain&quot;&gt;The strategic landscape: Seeing the terrain&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Before you can plan a journey, you need a map. In technology strategy, two frameworks provide this essential high-level view.&lt;/p&gt;&lt;h4 id=&quot;wardley-mapping-a-gps-for-your-value-chain&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#wardley-mapping-a-gps-for-your-value-chain&quot;&gt;Wardley Mapping: A GPS for your value chain&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;A Wardley Map is a visual tool for understanding your business and technology, as detailed in Alex’s article. It plots your value chain (from user needs down to the power supply) against an axis of evolution—from new &lt;strong&gt;Genesis&lt;/strong&gt; ideas to standardised &lt;strong&gt;Commodities&lt;/strong&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A visual map is a great way to explain complex tech dependencies and strategic choices to CPO, CTO, or even CFO.&lt;/p&gt;&lt;/blockquote&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/wardley-map-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/wardley-map-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/wardley-map-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/wardley-map-650w.jpeg&quot; width=&quot;650&quot; height=&quot;373&quot; alt=&quot;An example Wardley Map.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Example Wardley Map. Source: learnwardleymapping.com, by Simon Wardley.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This is far more than an academic exercise. It has direct, practical applications:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;It makes invisible value visible.&lt;/strong&gt; The map shows how foundational components like databases and APIs, while hidden from the user, are critical to delivering value. This helps justify investment in non-feature work.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;It provides a language for strategic decisions.&lt;/strong&gt; The evolution axis gives us a powerful way to discuss trade-offs. We can clearly show why building a custom authentication system (‘Custom-Built’) is inefficient when a mature ‘Product’ like Okta exists, freeing up resources for work that truly differentiates us.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;It helps spot risks and opportunities.&lt;/strong&gt; Seeing a critical user-facing feature dependent on a fragile ‘Genesis’ component is an immediate red flag for technical debt. Conversely, seeing a component that could be moved to ‘Commodity’ highlights an opportunity for cost savings.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&quot;pace-layering-governing-the-speed-of-change&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#pace-layering-governing-the-speed-of-change&quot;&gt;Pace Layering: Governing the speed of change&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;Pace Layering, adapted from Stewart Brand’s work in his essay &lt;a href=&quot;https://jods.mitpress.mit.edu/pub/issue3-brand/release/2&quot; rel=&quot;noopener&quot;&gt;Pace Layering: How Complex Systems Learn and Keep Learning&lt;/a&gt;, provides a complementary view. It categorises systems based on their required rate of change. As Brand famously wrote:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Fast learns, slow remembers. … Fast gets all our attention, slow has all the power.&lt;/p&gt;&lt;/blockquote&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/pace-layering-650w.avif 650w, https://allarddewinter.net/assets/images/pace-layering-960w.avif 960w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/pace-layering-650w.webp 650w, https://allarddewinter.net/assets/images/pace-layering-960w.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/pace-layering-650w.jpeg 650w, https://allarddewinter.net/assets/images/pace-layering-960w.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/pace-layering-960w.jpeg&quot; width=&quot;960&quot; height=&quot;963&quot; alt=&quot;A diagram showing the three layers of technology systems: Innovation, Differentiation, and Record.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;The three layers of Pace Layering. Source: blog.alexewerlof.com, by Alex Ewerlöf.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;This translates into three layers for our technology systems:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Systems of Innovation (SOI):&lt;/strong&gt; Fast-changing experiments where learning is the goal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Systems of Differentiation (SOD):&lt;/strong&gt; Your unique business logic; your competitive edge.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Systems of Record (SOR):&lt;/strong&gt; The slow, stable foundations that must not fail.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This framework is essential for effective governance. It justifies why an SOI team can use CI/CD to deploy daily, while the SOR team has a quarterly release cycle with rigorous controls.&lt;/p&gt;&lt;h4 id=&quot;combining-the-two&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#combining-the-two&quot;&gt;Combining the two&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;In his article, Alex gives an excellent perspective on combining the two:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This is where it gets really powerful:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Wardley Maps&lt;/strong&gt; give you the “lay of the land” – the strategic “why” and “what.” They help you see opportunities, competitor moves, and user needs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Pace Layering&lt;/strong&gt; then helps you organize your internal response – the “how.” A Wardley insight might identify a new SOI, which then gets agile funding and rapid iteration.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-systems-engineering-perspective-from-maps-to-artifacts&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#the-systems-engineering-perspective-from-maps-to-artifacts&quot;&gt;The Systems Engineering Perspective: From Maps to Artifacts&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;As strategic tools, these maps are excellent, but their practical application is unlocked when we ground them in systems engineering. With this link, they go from high-level diagrams to blueprints for action.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pace Layering is not just about speed; it is a framework for temporal decomposition.&lt;/strong&gt; It establishes stratified change velocities that dictate &lt;strong&gt;interface specifications&lt;/strong&gt;, &lt;strong&gt;verification rigor&lt;/strong&gt;, and &lt;strong&gt;failure domain isolation&lt;/strong&gt;. This is critical for managing emergent properties and ensuring that a failure in a fast-moving layer does not cascade into a stable, foundational one.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;A Wardley Map is more than a value chain diagram; it is a tool for requirements traceability.&lt;/strong&gt; It allows us to trace a user need all the way down to its dependent components. This enables precise &lt;strong&gt;trade-off analysis&lt;/strong&gt; of functional requirements against non-functional constraints (like reliability and cost) and helps define clear &lt;strong&gt;system boundaries&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The evolution axis enables a more quantitative approach to risk management.&lt;/strong&gt; It allows us to apply Technology Readiness Levels (TRLs) to our components, which feeds directly into formal risk methodologies like &lt;strong&gt;Failure Mode, Effects, and Criticality Analysis (FMECA)&lt;/strong&gt;. This helps us model the risk of migration paths and measure our technical debt, moving to more data-informed decisions.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The combined framework directly informs verification planning and lifecycle management.&lt;/strong&gt; It helps us answer critical, long-term questions: When should we introduce new technologies? How do we maintain a stable, known version of our systems? And how do we plan for replacing old technology before it becomes a liability?&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This integration transforms strategic maps from conceptual tools into engineering artifacts that directly inform technical planning, risk management, and verification processes.&lt;/p&gt;&lt;h3 id=&quot;a-framework-for-action-from-diagnosis-to-operations&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#a-framework-for-action-from-diagnosis-to-operations&quot;&gt;A framework for action: From diagnosis to operations&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;These technically grounded maps provide the perfect input for a structured strategy process. As I explored in a post on &lt;a href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/&quot;&gt;implementing an ML platform&lt;/a&gt;, Will Larson’s five-step framework (Explore, Diagnose, Refine, Policy, Operations) provides a robust path from analysis to action. The maps are the primary tools for the &lt;strong&gt;Exploration&lt;/strong&gt; and &lt;strong&gt;Diagnosis&lt;/strong&gt; phases, providing the evidence needed to build a compelling case for change.&lt;/p&gt;&lt;h3 id=&quot;the-ground-level-view-validating-the-plan&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#the-ground-level-view-validating-the-plan&quot;&gt;The ground-level view: Validating the plan&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Once we have a diagnosis and a proposed policy, we need to validate it. As I discussed in my post on &lt;a href=&quot;https://allarddewinter.net/blog/inspiring-persons-will-larsons-systems-thinking-approach-to-engineering-strategy/&quot;&gt;Larson’s systems thinking approach&lt;/a&gt;, simple models of stocks and flows help us test our assumptions. This modelling fits perfectly into Larson’s later steps of &lt;a href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/&quot;&gt;Components of an Engineering strategy&lt;/a&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Refinement&lt;/strong&gt; is about testing our strategic hypotheses with prototypes or small-scale experiments to de-risk our ideas before committing fully.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Operations&lt;/strong&gt; is about creating the mechanisms for adoption and success, such as feedback loops, training, and review processes that ensure the strategy sticks.&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;a-complete-strategic-toolkit&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#a-complete-strategic-toolkit&quot;&gt;A complete strategic toolkit&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;By weaving these frameworks together, we create a comprehensive approach to strategy that spans from the deepest foundations to the visible horizon.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://allarddewinter.net/blog/a-practical-toolkit-for-technology-strategy/#the-strategic-landscape-seeing-the-terrain&quot;&gt;Landscape&lt;/a&gt; (Wardley &amp; Pace Layering):&lt;/strong&gt; We start by mapping the terrain to understand our position, using these tools to create concrete engineering artifacts.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/&quot;&gt;Process&lt;/a&gt; (Larson’s 5 Steps):&lt;/strong&gt; We use a structured process to move from an evidence-based diagnosis to a concrete policy and operational plan.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://allarddewinter.net/blog/inspiring-persons-will-larsons-systems-thinking-approach-to-engineering-strategy/&quot;&gt;Execution&lt;/a&gt; (Systems Modelling):&lt;/strong&gt; We use detailed models to refine our plans and ensure they will have the desired real-world impact.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This multi-layered toolkit moves strategy from an abstract exercise to a practical, repeatable discipline for driving meaningful change.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>A clear framework for the build vs. buy decision</title>
      <link href="https://allarddewinter.net/blog/a-clear-framework-for-the-build-vs-buy-decision/" />
      <updated>2025-06-17T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-clear-framework-for-the-build-vs-buy-decision/</id>
      <content type="html">
				&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/1750147514194-650w.avif 650w, https://allarddewinter.net/assets/images/1750147514194-960w.avif 960w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/1750147514194-650w.webp 650w, https://allarddewinter.net/assets/images/1750147514194-960w.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/1750147514194-650w.jpeg 650w, https://allarddewinter.net/assets/images/1750147514194-960w.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/1750147514194-960w.jpeg&quot; width=&quot;960&quot; height=&quot;960&quot; alt=&quot;Decision tree&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;In my career, I have more than once encountered the ‘build versus buy’ dilemma. Many organisations have a policy that looks something like this: first, try to use an existing internal product; if not, buy an off-the-shelf solution; and only as a last resort, build it yourself. While this provides a sequence, it often lacks the nuance needed to make an effective decision.&lt;/p&gt;&lt;p&gt;This is why an article by Chris on his blog, &lt;a href=&quot;https://entropicthoughts.com/build-vs-buy&quot; rel=&quot;noopener&quot;&gt;Entropic Thoughts&lt;/a&gt;, got my attention. He presents an simple and elegant approach for this exact problem.&lt;/p&gt;&lt;p&gt;The article suggests a simple rule: you should only &lt;strong&gt;build&lt;/strong&gt; a component if it meets all three of the following criteria:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;It has a &lt;strong&gt;high cost&lt;/strong&gt;.&lt;/li&gt;&lt;li&gt;It is &lt;strong&gt;tightly integrated&lt;/strong&gt; with your core system.&lt;/li&gt;&lt;li&gt;It is &lt;strong&gt;difficult to design&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If a component does not meet all three conditions, the default choice should be to &lt;strong&gt;buy&lt;/strong&gt; it (or use an existing open-source solution).&lt;/p&gt;&lt;p&gt;The article provides an informative perspective on the actual cost of purchasing. It is not just the purchase price. For a component that is expensive and complex, the cost of properly evaluating suppliers and making a good purchasing decision is substantial. To make that decision well, your team needs to become experts on the component. The article argues that the process of becoming an expert (designing, prototyping, and testing) is almost indistinguishable from the initial stages of building it yourself. Once you have invested that effort, you are already a long way down the “build” path.&lt;/p&gt;&lt;p&gt;This quote captures the essence of focusing a company’s expertise where it matters most:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The reason we want to buy as much as possible is that an organisation has a limited capacity for expertise, so we do not want to have to become experts on things that do not make up a competitive advantage.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;And on the complexity of the judgment call itself:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This type of judgment is the reason good software engineers get paid a lot of money – not for typing in code.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This approach provides the clarity that I have often found missing. It shifts the focus towards mastering what truly gives a competitive advantage. I will certainly be applying this line of thinking in my work.&lt;/p&gt;&lt;p&gt;The full post has a good example on building stealth planes, worth the read: &lt;a href=&quot;https://entropicthoughts.com/build-vs-buy&quot; rel=&quot;noopener&quot;&gt;Entropic Thoughts&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Smart People Don&#39;t Chase Goals - They Create Limits</title>
      <link href="https://allarddewinter.net/blog/smart-people-dont-chase-goals-they-create-limits/" />
      <updated>2025-06-16T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/smart-people-dont-chase-goals-they-create-limits/</id>
      <content type="html">
				&lt;p&gt;Recently, Joan Westenberg shared an interesting article, “&lt;a href=&quot;https://www.joanwestenberg.com/p/smart-people-don-t-chase-goals-they-create-limits&quot; rel=&quot;noopener&quot;&gt;Smart People Don’t Chase Goals; They Create Limits&lt;/a&gt;”. Joan argues that in many complex situations, focusing on creating clear boundaries and constraints is far more effective than chasing specific goals. This idea aligns with my own experiences, especially when I consider strategy implementation or ensuring architectural principles are followed in systems engineering.&lt;/p&gt;&lt;p&gt;I have found that communicating “guardrails” and then checking that they are applied is often much more effective than dictating precise steps. This approach allows developers the freedom to innovate and use their imagination, rather than being stifled by overly prescriptive instructions. In systems engineering, for instance, defining clear non-functional requirements like performance thresholds or security protocols allows teams to design creative solutions that meet the system’s core needs without being told exactly how to build them.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-650w.avif 650w, https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-960w.avif 960w, https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-1365w.avif 1365w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-650w.webp 650w, https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-960w.webp 960w, https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-1365w.webp 1365w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-650w.jpeg 650w, https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-960w.jpeg 960w, https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-1365w.jpeg 1365w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/create-an-image-of-a-child-building-a-tower-with-b-1365w.jpeg&quot; width=&quot;1365&quot; height=&quot;1024&quot; alt=&quot;image of a child building by recraft.ai&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;... or do you?&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Think about it in terms of raising children. It is not very effective to set the goal of “having a nice afternoon”. Instead, it is much more productive to stimulate their creativity by providing an environment with clear boundaries, within which they can explore and play freely. This allows them to develop their own ideas and solutions, leading to a much more engaging and positive outcome.&lt;/p&gt;&lt;p&gt;Joan writes about it as follows:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Constraints do not block creativity. They aim it. The sonnet form is maddeningly restrictive. Yet Shakespeare produced infinite meaning inside 14 lines. Jazz musicians work within a key and tempo. Architects must respect the load-bearing capacity of concrete. The painter who begins with a blank canvas faces more paralysis than the one who starts with a frame and a palette.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This perspective shifts our focus from a rigid outcome to the enabling environment. It is about defining the playing field, not just the score. Another quote from the article that I liked:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“Goals often focus our attention on the visible holes. But it’s the invisible constraints that tell us what really matters.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is shown by the WWII bomber example in the article:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“In WWII, when allied bombers returned to base riddled with bullet holes, engineers initially proposed reinforcing the areas with the most damage. But statistician Abraham Wald pointed out the flaw: they were only seeing the planes that made it back. The holes marked the survivable areas. The real vulnerabilities were the untouched parts on the returning planes, because the ones hit there never came home.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It is about understanding the underlying system and its true vulnerabilities, not just the superficial damage.&lt;/p&gt;&lt;p&gt;While constraints are powerful, there are certainly situations where setting clear goals is productive:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Training for a marathon:&lt;/strong&gt; A specific distance and time are clear objectives.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Preparing for an exam:&lt;/strong&gt; A defined curriculum and passing score provide a direct goal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Shipping a product by a hard deadline:&lt;/strong&gt; A fixed delivery date necessitates a goal-oriented approach.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Learning a new skill:&lt;/strong&gt; Achieving proficiency in a specific area can be a clear goal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Saving for a down payment on a house:&lt;/strong&gt; A specific financial target is a tangible goal.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In these finite, controlled, and well-understood domains, goals are perfectly suitable. However, for ambiguous, ill-defined problems, or when fostering innovation, embracing constraints and boundaries can lead to far more robust and creative solutions. It is about creating the right environment for success, rather than just pointing to a finish line.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Understanding MCP: A New Standard for AI Integration</title>
      <link href="https://allarddewinter.net/blog/understanding-mcp-a-new-standard-for-ai-integration/" />
      <updated>2025-06-15T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/understanding-mcp-a-new-standard-for-ai-integration/</id>
      <content type="html">
				&lt;p&gt;The Model Context Protocol (MCP) is an open standard developed by Anthropic that enables AI systems to connect with real-world tools and data sources. Announced on November 25, 2024, MCP acts as a universal bridge between AI models like Claude and external systems such as databases, APIs, and business tools. You can read the &lt;a href=&quot;https://www.anthropic.com/news/model-context-protocol&quot; rel=&quot;noopener&quot;&gt;official announcement&lt;/a&gt; for more details and access to the GitHub repository.&lt;/p&gt;&lt;p&gt;Arjan Codes recently published an excellent &lt;a href=&quot;https://www.youtube.com/watch?v=r0QIuI1wpes&quot; rel=&quot;noopener&quot;&gt;practical demonstration of MCP implementation&lt;/a&gt;. Having completed his software architecture course, I appreciate how Arjan delivers clear, practical content from an independent perspective - refreshingly not tied to major cloud providers, which is common in architecture discussions.&lt;/p&gt;&lt;h2 id=&quot;architectural-approaches-for-mcp-implementation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/understanding-mcp-a-new-standard-for-ai-integration/#architectural-approaches-for-mcp-implementation&quot;&gt;Architectural approaches for MCP implementation&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;When implementing MCP, developers face key architectural decisions:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;Approach&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;Direct Module Access&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;API Layer Integration&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Implementation&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MCP server calls internal modules directly&lt;/td&gt;&lt;td&gt;MCP server interacts with existing REST API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Small-scale projects&lt;/td&gt;&lt;td&gt;Systems with established APIs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Simpler setup&lt;/td&gt;&lt;td&gt;Reuses existing logic, avoids duplication&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Limitations&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Tight coupling, scales poorly&lt;/td&gt;&lt;td&gt;Extra network hop, added complexity&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Overall, Arjan shares these conclusions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Direct access&lt;/strong&gt; works well for prototypes but becomes difficult to maintain as systems grow&lt;/li&gt;&lt;li&gt;&lt;strong&gt;API integration&lt;/strong&gt; leverages existing infrastructure but adds communication overhead&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Auto-conversion&lt;/strong&gt; (using tools like &lt;code&gt;fast_mcp&lt;/code&gt;) can generate MCP servers from FastAPI applications&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For concrete coding examples of these approaches, I recommend watching &lt;a href=&quot;https://www.youtube.com/watch?v=r0QIuI1wpes&quot; rel=&quot;noopener&quot;&gt;Arjan’s full video demonstration&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I believe MCP represents an important evolution - soon, even internal company tools might include AI interfaces as standard features, fundamentally changing how we interact with software.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Agents: Programming with feedback-driven LLMs</title>
      <link href="https://allarddewinter.net/blog/agents-programming-with-feedback-driven-llms/" />
      <updated>2025-06-14T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/agents-programming-with-feedback-driven-llms/</id>
      <content type="html">
				&lt;p&gt;David Crawshaw shares a good perspective on &lt;a href=&quot;https://crawshaw.io/blog/programming-with-agents&quot; rel=&quot;noopener&quot;&gt;how LLMs transform into powerful programming assistants&lt;/a&gt; when given tools to interact with their environment. While definitions of “AI agents” vary widely, David aligns with Simon Willison and Solomon Hykes’ view of agents as systems that repeatedly interact with their environment; what Solomon calls &lt;a href=&quot;https://simonwillison.net/2025/Jun/5/wrecking-its-environment-in-a-loop/&quot; rel=&quot;noopener&quot;&gt;“wrecking its environment in a loop”&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Via &lt;a href=&quot;https://pointerio.beehiiv.com/p/issue-624&quot; rel=&quot;noopener&quot;&gt;Pointer.io’s Essential Reading For Engineering Leaders newsletter&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/wrecking-its-environment-650w.avif 650w, https://allarddewinter.net/assets/images/wrecking-its-environment-959w.avif 959w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/wrecking-its-environment-650w.webp 650w, https://allarddewinter.net/assets/images/wrecking-its-environment-959w.webp 959w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/wrecking-its-environment-650w.jpeg 650w, https://allarddewinter.net/assets/images/wrecking-its-environment-959w.jpeg 959w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/wrecking-its-environment-959w.jpeg&quot; width=&quot;959&quot; height=&quot;621&quot; alt=&quot;Definition of an agent: An LLM &#39;wrecking&#39; its environment in a loop&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Definition of an agent by Solomon Hykes (photo from Simon Willison)&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Unlike standalone language models that operate in isolation, agents can execute commands, read files, and iterate based on feedback; this fundamentally changes their capabilities.&lt;br&gt;The core insight: Agents are essentially feedback loops where an LLM can:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Run test suites and interpret results&lt;/li&gt;&lt;li&gt;Execute bash commands to explore codebases&lt;/li&gt;&lt;li&gt;Apply patches and validate changes&lt;/li&gt;&lt;li&gt;Access documentation through web searches&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;“Agents are LLMs with environmental feedback. Just as humans thrive in environments with feedback, LLMs go from nice demos to useful programmers when given a surprisingly small core set of tools.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A practical example: When an agent runs your test suite and encounters failures, it can:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Analyse error messages&lt;/li&gt;&lt;li&gt;Modify the problematic code&lt;/li&gt;&lt;li&gt;Re-run tests&lt;/li&gt;&lt;li&gt;Repeat until passing&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This transforms coding from a “whiteboard exercise” into an interactive process where the LLM can validate its own work. As David notes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“The result, compared to an LLM generating code without these tools available is significantly different. API use is greatly improved because the agent can web search for documentation and &lt;code&gt;curl&lt;/code&gt; the docs into its context window.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;While agents currently work slower than traditional coding (minutes vs seconds, meaning they are still relatively expensive), they enable completing “dreary tasks” that might otherwise take days, freeing developers for higher-value work.&lt;/p&gt;&lt;h3 id=&quot;containerized-agent-environments&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/agents-programming-with-feedback-driven-llms/#containerized-agent-environments&quot;&gt;Containerized agent environments&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The future likely involves containerized agent environments, isolated execution spaces that solve two key challenges:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Safety&lt;/strong&gt;: Prevents agents from accessing sensitive credentials or systems&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Parallelism&lt;/strong&gt;: Allows multiple agents to work simultaneously without conflicts&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;These sandboxed environments let developers safely run agents while maintaining their normal workflow, with changes extracted as diffs or branches when complete.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Moving beyond point-by-point arguments</title>
      <link href="https://allarddewinter.net/blog/moving-beyond-point-by-point-arguments/" />
      <updated>2025-06-13T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/moving-beyond-point-by-point-arguments/</id>
      <content type="html">
				&lt;p&gt;I recently read an excellent article by Sean Goedecke, “&lt;a href=&quot;https://www.seangoedecke.com/point-by-point-considered-harmful/&quot; rel=&quot;noopener&quot;&gt;Arguing point-by-point considered harmful&lt;/a&gt;”, that clearly articulates a communication anti-pattern many of us in technology have experienced. He describes the unproductive cycle where a technical discussion devolves into endless mini-arguments, with no real progress made.&lt;/p&gt;&lt;p&gt;This is a pattern I recognise from my own experience, particularly from the perspective of a technical leader. It is a delicate balance. You want to guide the technical direction, but getting stuck in a point-by-point debate can easily damage working relationships. If you harm that trust, you risk people avoiding you, working around you, or simply not telling you about potential issues in the future.&lt;/p&gt;&lt;p&gt;I have been in those discussions that did not bring me, or the other party, anything of value. I learned that you have to step out of it and take a more holistic view, much like in systems engineering. Goedecke’s advice points to the same conclusion.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/two-engineers-trying-to-assemble-a-puzzle-while-ar-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/two-engineers-trying-to-assemble-a-puzzle-while-ar-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/two-engineers-trying-to-assemble-a-puzzle-while-ar-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/two-engineers-trying-to-assemble-a-puzzle-while-ar-650w.jpeg&quot; width=&quot;650&quot; height=&quot;325&quot; alt=&quot;Illustration of two engineers arguing over puzzle pieces instead of looking at the bigger picture on the box.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Arguing over the pieces instead of looking at the box.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Instead of diving headfirst into every concern individually, he suggests a more constructive approach to shift the conversation from a series of small debates to a discussion about the core value. His method can be summarised in a few steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Recognise the trap&lt;/strong&gt;: Identify when a discussion is becoming an unproductive point-by-point argument.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Focus on the affirmative case&lt;/strong&gt;: Instead of defending against a list of concerns, make a clear case for the overall value of your proposal.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Identify the real problem&lt;/strong&gt;: Often, the stated reasons are not the core objection. Give the other person space to articulate their main concern.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Collaborate on details&lt;/strong&gt;: Once there is alignment on the bigger picture, you can work through the technical details together.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As Goedecke puts it, you should:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;…make the case for why your feature is valuable enough to spend the developer time and CPU time on it.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This changes the dynamic entirely. It is about moving from defending individual points to building a shared understanding of the overall goal. When you achieve that alignment, the rest often falls into place.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;If you get them on your side, you can work out the technical details together. If they don’t believe in your mission, you’ll never convince them by proving that they’re wrong about the technical points.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A good read for any engineer or leader looking to improve their communication and effectiveness.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Why learning systems thinking is essential in tech</title>
      <link href="https://allarddewinter.net/blog/why-learning-systems-thinking-is-essential-in-tech/" />
      <updated>2025-06-12T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/why-learning-systems-thinking-is-essential-in-tech/</id>
      <content type="html">
				&lt;p&gt;Today I listened to Diana Montalion’s insightful conversation on the &lt;a href=&quot;https://techleadjournal.dev/episodes/219/&quot; rel=&quot;noopener&quot;&gt;Tech Lead Journal podcast&lt;/a&gt; about systems thinking in technology. She shares her perspective on how relationships between components create effects and why it is important to have this holistic view.&lt;/p&gt;&lt;p&gt;&lt;lite-youtube videoid=&quot;jyNIACaTk9I&quot; playlabel=&quot;Why Learning Systems Thinking is Essential in Tech - Diana Montalion&quot;&gt;&lt;/lite-youtube&gt;&lt;/p&gt;&lt;p&gt;Some takeaways from the conversation include:&lt;/p&gt;&lt;h3 id=&quot;what-is-systems-thinking&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/why-learning-systems-thinking-is-essential-in-tech/#what-is-systems-thinking&quot;&gt;What is systems thinking?&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;At its core, a system is a set of interconnected components whose relationships produce outcomes that individual parts cannot achieve alone. Systems thinking means understanding these relationships to architect desired effects. As Montalion explains:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Relationships produce effect. Systems thinking is understanding the effect and being able to architect for the kinds of effects we want in a system.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/systems-thinking-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/systems-thinking-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/systems-thinking-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/systems-thinking-650w.jpeg&quot; width=&quot;650&quot; height=&quot;433&quot; alt=&quot;A drawing of a head and wheel representing systems thinking&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;This approach requires considering multiple levels simultaneously—from code implementation to business outcomes. We need this holistic view to communicate clearly with all stakeholders, secure alignment, obtain funding, and achieve shared goals.&lt;/p&gt;&lt;h3 id=&quot;the-need-for-collaboration&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/why-learning-systems-thinking-is-essential-in-tech/#the-need-for-collaboration&quot;&gt;The need for collaboration&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Importantly, no single person can master all perspectives. Partnering becomes essential:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Your skills are insufficient in the modern world. You can know everything about JavaScript there is to know. But if you do not know how to make people’s lives better with JavaScript, how much value are you really bringing?&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;the-benefits-of-modeling&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/why-learning-systems-thinking-is-essential-in-tech/#the-benefits-of-modeling&quot;&gt;The benefits of modeling&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Modeling emerges as a powerful tool to bridge understanding gaps:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We often think we’re solving the same problem, and when we’re going around and around, usually it is because we have completely different mental models. Including visual elements—moving things around, making relationships—helps.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I particularly appreciated Montalion’s practical advice on architectural decision records. I do not know if I need to laugh or cry here, as I have encountered ADRs that lacked this depth:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A thing that stands out to me often is that people do not describe other options they considered. They are just recording the decision.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Her emphasis on “yes, and” collaboration and systemic reasoning provides actionable methods to implement these concepts. The full conversation offers insights for developers or anyone building (technical) systems.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://techleadjournal.dev/episodes/219/&quot; rel=&quot;noopener&quot;&gt;Watch or listen to the complete episode&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Choosing the right data architecture</title>
      <link href="https://allarddewinter.net/blog/choosing-the-right-data-architecture/" />
      <updated>2025-06-11T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/choosing-the-right-data-architecture/</id>
      <content type="html">
				&lt;p&gt;This post is inspired by an &lt;a href=&quot;https://medium.com/academy-team/which-data-architecture-should-i-choose-for-my-workplace-a-data-engineers-approach-f913b71d8ee6&quot; rel=&quot;noopener&quot;&gt;article by Dr. Fatih Hattatoglu on Medium&lt;/a&gt;, exploring different data architecture choices from a data engineer’s perspective. The article highlights the importance of data as a valuable asset and the need for flexible solutions to manage the increasing volume and diversity of data, particularly as use cases continue to grow, including those in machine learning and AI.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/1749632950319-650w.avif 650w, https://allarddewinter.net/assets/images/1749632950319-960w.avif 960w, https://allarddewinter.net/assets/images/1749632950319-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/1749632950319-650w.webp 650w, https://allarddewinter.net/assets/images/1749632950319-960w.webp 960w, https://allarddewinter.net/assets/images/1749632950319-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/1749632950319-650w.jpeg 650w, https://allarddewinter.net/assets/images/1749632950319-960w.jpeg 960w, https://allarddewinter.net/assets/images/1749632950319-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/1749632950319-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;933&quot; alt=&quot;A clay model of a data lakehouse created by recraft.ai&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-75&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;A &#39;data lakehouse&#39; from clay, made by &lt;a href=&quot;https://www.recraft.ai/&quot;&gt;recraft.ai&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;As Dr. Hattatoglu notes:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;However, the foundations of a successful data architecture must be laid right from the beginning of the design process. This is not just about building a technical structure, but aligning it with organisational goals and data management strategies.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This quote is particularly relevant as it underscores that technology choices are always connected with broader business and strategic considerations.&lt;/p&gt;&lt;p&gt;The article discusses four main data architecture approaches:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Data Warehouse:&lt;/strong&gt; Focused on structured data, optimised for reporting and analysis. Uses ETL processes and is suitable for consistent, well-organised data. However, it can be expensive and only handles structured data.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data Lake:&lt;/strong&gt; A flexible structure for storing structured, semi-structured, and unstructured data in its raw form. Ideal for advanced analytics and machine learning, offering flexibility but posing challenges in data management and security.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data Lakehouse:&lt;/strong&gt; Combines the flexibility of a Data Lake with the structured management of a Data Warehouse. It supports both SQL queries and machine learning, offering the best of both worlds but with complex setup and management.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data Mesh:&lt;/strong&gt; A decentralised architecture where each department manages its own data product. It promotes flexible management and avoids bottlenecks but can create challenges in data consistency and integration.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The article stresses that the choice of architecture is a strategic decision, not just technical, and must align with organisational goals and data management strategies. Requirement analysis is presented as the crucial first step to define needs, identify stakeholders, clarify scope, and choose the correct technology.&lt;/p&gt;&lt;h3 id=&quot;data-architecture-and-machine-learning-/-ai&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/choosing-the-right-data-architecture/#data-architecture-and-machine-learning-/-ai&quot;&gt;Data architecture and machine learning / AI&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Here is a summary of how each data architecture approach relates to the needs of machine learning and AI, based on the article:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align:left&quot;&gt;Data Architecture&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Suitability for Machine Learning / AI&lt;/th&gt;&lt;th style=&quot;text-align:left&quot;&gt;Key Characteristics Relevant to ML/AI&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Data Warehouse&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Limited suitability. Primarily designed for structured data and reporting, not the diverse data types often needed for ML/AI.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;- Works only with structured data.&lt;br&gt;- Optimised for reporting, not flexible data exploration or raw data processing.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Data Lake&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Highly suitable. Designed to store raw, diverse data (structured, semi-structured, unstructured) which is crucial for ML/AI training.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;- Stores data in native format (raw).&lt;br&gt;- Offers flexibility for data engineers/scientists to process data as needed.&lt;br&gt;- Ideal for handling continuously changing datasets.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Data Lakehouse&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Highly suitable. Combines the flexibility of a Data Lake with the structure/performance of a Data Warehouse, supporting both ML/AI and traditional BI.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;- Handles both structured and unstructured data.&lt;br&gt;- Supports both SQL-based queries and machine learning operations on the same platform.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;text-align:left&quot;&gt;&lt;strong&gt;Data Mesh&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;Potentially suitable, but depends on how data products are designed and shared. Decentralisation can support domain-specific ML/AI efforts.&lt;/td&gt;&lt;td style=&quot;text-align:left&quot;&gt;- Distributed data management.&lt;br&gt;- Data ownership by departments.&lt;br&gt;- Requires careful consideration of data integration and consistency for cross-domain ML/AI.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;In essence, Data Lakes and Data Lakehouses are presented as the most inherently suitable architectures for the diverse data needs and processing flexibility required by modern machine learning and AI workflows.&lt;/p&gt;&lt;h3 id=&quot;designing-data-architecture-a-systems-engineering-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/choosing-the-right-data-architecture/#designing-data-architecture-a-systems-engineering-approach&quot;&gt;Designing data architecture: A systems engineering approach&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Designing the right data architecture is a complex undertaking that benefits greatly from applying Systems Engineering principles. This approach breaks down the process into structured phases, ensuring that the solution meets requirements throughout its entire lifecycle. Here is a simplified view of this process, aligning with the data lifecycle:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pre-Acquisition (Understand the Problem &amp; Needs)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define the business mission &amp; data purpose (Why?):&lt;/strong&gt; Begin by clearly articulating the business objectives that the data architecture needs to support. Why is this data needed? What strategic goals will it enable (e.g., predicting turbine component failures, optimising maintenance schedules based on weather forecasts)?&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identify stakeholder data needs &amp; requirements (What?):&lt;/strong&gt; This involves deep engagement with all users and consumers of the data (offshore technicians, data scientists building predictive models, operational managers). Determine the specific data types required (SCADA (sensor) data, weather data, maintenance logs, video feeds), how data needs to be accessed (real-time streaming, batch processing), performance expectations (low latency for anomaly detection), necessary governance policies (data security for sensitive operational data), and data ownership responsibilities (who is responsible for turbine sensor data?).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Output:&lt;/em&gt; This phase culminates in a &lt;strong&gt;Logical Data Architecture&lt;/strong&gt;, defining the functional requirements and conceptual data model – essentially, the “what” the system must do.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acquisition (Design the Solution)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explore data architecture options (How – High Level):&lt;/strong&gt; Based on the requirements gathered in the previous phase, evaluate the different architectural patterns discussed (Data Warehouse, Data Lake, Data Lakehouse, or Data Mesh). Select the pattern that best fits the identified needs and constraints, particularly considering the need for diverse data types common in offshore wind (structured sensor data, unstructured video, semi-structured logs).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Output:&lt;/em&gt; This results in a &lt;strong&gt;High-Level Physical Data Architecture&lt;/strong&gt;, outlining the chosen pattern and major components – the high-level “how”.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Detailed design &amp; technology selection (How – Detailed):&lt;/strong&gt; With the high-level architecture decided, delve into the specifics. Select the appropriate technologies and platforms (e.g., cloud storage for raw data, a processing engine for time-series analysis, a database for structured maintenance records). Design the detailed data models, data pipelines (including streaming data from turbines), security mechanisms, and infrastructure.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Output:&lt;/em&gt; This yields the &lt;strong&gt;Detailed Physical Data Architecture&lt;/strong&gt;, providing the complete blueprint – the detailed “how”.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Construct &amp; produce (Build &amp; Test)&lt;/strong&gt;: Implement the detailed design, building the data pipelines, storage layers, and processing components. Test the system to ensure it meets all defined requirements for data quality, performance (especially for real-time data), security, and functionality (e.g., can the ML models access the necessary data?).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utilization (Operate &amp; Evolve)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operational use &amp; support:&lt;/strong&gt; Once implemented, the architecture is put into production, supporting ML model training, inference, and operational reporting. This phase involves ongoing monitoring of performance, data quality (critical for model accuracy), and security. It also includes providing support to data users and addressing any operational issues.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modification &amp; evolution:&lt;/strong&gt; Data needs and technologies are constantly changing. This phase involves adapting the architecture to accommodate new sensor types, evolving ML model requirements, or integrating new data sources (e.g., drone inspection footage). This is an iterative process, potentially looping back to the design phase.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retirement (When Data is No Longer Needed)&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Data retirement:&lt;/strong&gt; When data or parts of the architecture are no longer required (due to compliance, obsolescence, or data retention policies for specific data types like raw sensor streams from SCADA), a plan for secure and compliant retirement is executed. This involves archiving data or securely deleting it according to established policies.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This structured, lifecycle-oriented approach, rooted in Systems Engineering, helps ensure that the data architecture is not only technically sound but also strategically aligned, maintainable, and capable of evolving over time to support critical operations like offshore wind maintenance.&lt;/p&gt;&lt;p&gt;For further reading, the original article can be found here: &lt;a href=&quot;https://medium.com/academy-team/which-data-architecture-should-i-choose-for-my-workplace-a-data-engineers-approach-f913b71d8ee6&quot; rel=&quot;noopener&quot;&gt;https://medium.com/academy-team/which-data-architecture-should-i-choose-for-my-workplace-a-data-engineers-approach-f913b71d8ee6&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Navigating the Corporate Maze</title>
      <link href="https://allarddewinter.net/blog/navigating-the-corporate-maze/" />
      <updated>2025-06-10T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/navigating-the-corporate-maze/</id>
      <content type="html">
				&lt;p&gt;I recently read an interesting article by Sergio Visinoni titled “&lt;a href=&quot;https://substack.com/home/post/p-163907904&quot; rel=&quot;noopener&quot;&gt;Navigating the Corporate Maze&lt;/a&gt;” on Substack. The article offers a guide for engineering leaders aiming to drive strategic changes within large, bureaucratic organisations where change often seems impossible. It outlines a four-step process: drawing maps of the new environment, clarifying your role, building bridges, and driving change incrementally.&lt;/p&gt;&lt;p&gt;When I transitioned into a domain architect (Technical Authority) role after being the lead data scientist in the same department, I attempted to follow a similar pattern in my large organisation. Step 1, mapping the environment, came quite naturally as I already knew all the stakeholders. The challenge here was that stakeholders tended to view me in my old position. I constantly needed to remind them that I was in a new role with different responsibilities and ways of working.&lt;/p&gt;&lt;p&gt;This largely relates to step 2, clarifying your role. In my case, after a reorganisation, clarifying my new role – which was simultaneously new to the organisation – was the largest hurdle. This required constant proactive involvement and explanation from my side. However, I noticed that with most groups of colleagues, this started to move in the right direction after some time. For example, I went from having to chase to be part of a decision-making meeting to being asked to join.&lt;/p&gt;&lt;p&gt;Step 3, building bridges, is also something I had already applied and seen working. From my peer technical authorities in other domains, I learned to frame initiatives in light of the company goals and agenda. This makes it much easier for decision-makers to approve your requests. I also found that mapping stakeholders and their needs in enterprise architecture tools helped me to frame initiatives against the correct goals and agenda.&lt;/p&gt;&lt;p&gt;Overall, this is a really good article with applicable insights for large corporations. I especially liked the insight to move with the company’s rhythm. As with other things in life and nature, this is almost always the most effective course of action.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Don’t go against the Company’s Rhythm: In a crash between a cargo boat and a powerboat, the cargo boat wins. Instead of being the powerboat, learn to nudge the cargo boat in the right direction.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Understanding and appreciating this natural rhythm, much like the seasons, is crucial for long-term success and well-being when navigating the complexities of a large organisation.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Insights on building MLOps systems</title>
      <link href="https://allarddewinter.net/blog/insights-on-building-mlops-systems/" />
      <updated>2025-06-09T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/insights-on-building-mlops-systems/</id>
      <content type="html">
				&lt;p&gt;In his post ‘&lt;a href=&quot;https://mburaksayici.com/blog/2024/08/29/what-ive-learned-building-mlops-systems-for-four-years.html&quot; rel=&quot;noopener&quot;&gt;What I’ve learned building MLOps systems for four years&lt;/a&gt;’, Mehmet Burak Sayıcı offers valuable insights about the multidisciplinary nature of MLOps work. The article highlights how MLOps professionals need to develop expertise across various domains.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It was fun at first, but then we had to integrate everything into a platform. That’s when I slowly started to understand object-oriented programming, system design, and the principles of traditional software engineering.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Actionable strategy: implementing an ML platform in an energy business</title>
      <link href="https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/" />
      <updated>2025-06-08T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/</id>
      <content type="html">
				&lt;p&gt;In a large organisation, making significant technology decisions, such as selecting a machine learning platform, demands more than just a good idea. It requires a clear, actionable strategy to ensure the chosen solution truly integrates and delivers value. I have found Will Larson’s structured approach to engineering strategy to be a valuable tool for this.&lt;/p&gt;&lt;p&gt;Will’s framework, detailed in his “&lt;a href=&quot;https://lethain.com/components-of-eng-strategy/&quot; rel=&quot;noopener&quot;&gt;Components of Engineering Strategy&lt;/a&gt;” article, breaks down strategy creation into five practical steps:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Exploring:&lt;/strong&gt; Understanding the landscape of existing ideas and practices&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Diagnosing:&lt;/strong&gt; Deep dive into the specific problem and its context&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Refinement:&lt;/strong&gt; Testing and validating initial ideas&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Policy:&lt;/strong&gt; Making concrete decisions and defining guidelines&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Operations:&lt;/strong&gt; Implementing mechanisms to ensure adoption and success&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;These steps are designed to prevent common pitfalls and provide a robust path from concept to execution. I will focus on how the steps of exploration, diagnosis, and operations can be practically applied to a challenge I faced some time ago: implementing an ML platform within an offshore wind business. I draw on Will’s insights from “&lt;a href=&quot;https://lethain.com/exploring-for-strategy/&quot; rel=&quot;noopener&quot;&gt;Exploring for Strategy&lt;/a&gt;”, “&lt;a href=&quot;https://lethain.com/diagnosis-for-strategy/&quot; rel=&quot;noopener&quot;&gt;Diagnosis for Strategy&lt;/a&gt;”, and “&lt;a href=&quot;https://lethain.com/operations-for-strategy/&quot; rel=&quot;noopener&quot;&gt;Operations for Strategy&lt;/a&gt;”, together with a systems engineering perspective.&lt;/p&gt;&lt;h3 id=&quot;exploration-gathering-the-facts-on-ml-platform-options&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/#exploration-gathering-the-facts-on-ml-platform-options&quot;&gt;Exploration: gathering the facts on ML platform options&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/hero-explore-650w.avif 650w, https://allarddewinter.net/assets/images/hero-explore-960w.avif 960w, https://allarddewinter.net/assets/images/hero-explore-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/hero-explore-650w.webp 650w, https://allarddewinter.net/assets/images/hero-explore-960w.webp 960w, https://allarddewinter.net/assets/images/hero-explore-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/hero-explore-650w.jpeg 650w, https://allarddewinter.net/assets/images/hero-explore-960w.jpeg 960w, https://allarddewinter.net/assets/images/hero-explore-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/hero-explore-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;426&quot; alt=&quot;All phases in strategy, exploration highlighted&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;The exploration phase provides the opportunity to gather comprehensive information about potential ML platforms without premature commitment. It is about understanding the practical realities of different solutions and avoiding the trap of simply adopting what is familiar or trendy, as Will cautions.&lt;/p&gt;&lt;p&gt;For our context, this means:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;External benchmarking:&lt;/strong&gt; Actively researching various ML platforms, including those within our central IT’s Azure guardrails and other industry-leading solutions. How are other companies, particularly in the energy sector or those managing similar data complexities, successfully implementing ML? This involves a practical review of industry case studies, technical documentation, and direct conversations with peers to understand real-world trade-offs and team structures.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Internal audit:&lt;/strong&gt; Conducting a thorough review of existing technology within our large, distributed organisation. Different business units may operate with distinct technology architectures, including various data platforms (like Snowflake or Databricks) and ML tools (such as Azure ML). Our own department has an existing data platform that supports ML tasks. Exploration here means documenting these existing components, assessing their current utilisation for ML, and identifying any internal “skunkworks” projects or successful patterns in other departments that could offer valuable lessons.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;From a systems engineering perspective, exploration is about collecting data on available components and their performance characteristics. We are identifying existing infrastructure, data sources, and tools, and also very important, understanding the human capabilities and team models that support successful ML operations in various contexts. This fact-finding ensures strategy is founded on a broad understanding of the options.&lt;/p&gt;&lt;h3 id=&quot;diagnosis-pinpointing-our-specific-ml-platform-challenges&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/#diagnosis-pinpointing-our-specific-ml-platform-challenges&quot;&gt;Diagnosis: pinpointing our specific ML platform challenges&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Following exploration, diagnosis is the crucial step of precisely defining the problem we need the ML platform to solve within our specific offshore wind context. Will indicates that a wrong diagnosis is a primary reason for strategic failure, making this phase essential.&lt;/p&gt;&lt;p&gt;For our ML platform, a precise diagnosis requires:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Defining ML use cases:&lt;/strong&gt; Clearly articulating the specific ML problems our data scientists aim to address (for example, optimising turbine performance, predictive maintenance). What are the exact performance, reliability, and scalability requirements for these applications?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Assessing data ecosystem:&lt;/strong&gt; Mapping our data sources, access patterns, and processing needs. What are the volumes, velocity, and specific data governance, security, and compliance requirements for our energy data? In this, we need to clarify our responsibility and influence. For example, some tasks might be handled via an Operational Level Agreement (OLA) with other teams, while others we manage ourselves.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Evaluating team capabilities and gaps:&lt;/strong&gt; We have skilled data scientists and data engineers. However, an important observation in our current system is the absence of dedicated ML engineers who specialise in operationalising models and maintaining ML infrastructure. This skill gap is a significant constraint that must be explicitly addressed in our strategy. We also acknowledge that our data scientists, while domain experts, may require support with platform-specific technologies.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Acknowledging resource constraints:&lt;/strong&gt; Recognising that our business unit operates with resource limitations, a reality in the current offshore wind market. This directly impacts the feasibility and scope of any platform implementation and the investment in new skills.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clarifying organisational interfaces:&lt;/strong&gt; Defining how we will effectively collaborate with central IT, who provide essential guardrails, and how we can leverage insights from other, more mature ML departments within the organisation.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Applying a systems engineering perspective, diagnosis involves creating a detailed problem statement for our ML system. We quantify where possible, using objective criteria to describe the current state and desired future state:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Platform maintainability:&lt;/strong&gt; What is the estimated ongoing effort (for example, FTE hours) to maintain the platform, explicitly factoring in the current lack of dedicated ML engineering expertise?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Developer experience (DX):&lt;/strong&gt; How efficiently can our data scientists perform core tasks (data access, model training, deployment, monitoring)? This must consider their current proficiency levels and the need for streamlined workflows.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Integration with existing data:&lt;/strong&gt; How well does the platform integrate with our existing data infrastructure (Snowflake, Databricks)?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Alignment with IT guardrails:&lt;/strong&gt; Does the platform adhere to central IT’s approved technology stack? What level of support and collaboration can we expect from IT?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Resource footprint:&lt;/strong&gt; What are the estimated infrastructure costs and the human resources needed for implementation and ongoing support, including the investment required to build ML engineering skills?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Collaboration effectiveness:&lt;/strong&gt; How will the platform and associated processes improve collaboration between data scientists and data engineers, and how will it facilitate the integration of new ML engineering capabilities?&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Skill gap analysis:&lt;/strong&gt; What is the current availability of necessary skills (data science, data engineering, ML engineering), and how significant is the gap in dedicated ML engineering expertise?&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By step by step diagnosing these elements, we build a clear, evidence-based understanding of our challenges, which is essential for making informed decisions.&lt;/p&gt;&lt;h3 id=&quot;operations-actioning-the-strategy-and-building-new-expertise&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/#operations-actioning-the-strategy-and-building-new-expertise&quot;&gt;Operations: actioning the strategy and building new expertise&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The final step is operations. A well-conceived strategy and a carefully chosen platform will not deliver value without the practical mechanisms to ensure adoption and sustained success. Operations is about translating policy into tangible actions, and this critically includes addressing the skill gaps identified in our diagnosis.&lt;/p&gt;&lt;p&gt;Operational mechanisms for our ML platform strategy could include:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Structured collaboration frameworks:&lt;/strong&gt; Implementing clear processes and regular forums that encourage data scientists and data engineers to work together on platform usage and improvements. Crucially, this must also define how new ML engineering skills will be integrated into this collaborative model, perhaps through dedicated MLOps working groups or shared responsibilities.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Targeted training and support programmes:&lt;/strong&gt; Providing accessible, hands-on training tailored to our data scientists’ existing skill levels, focusing on the practical use of the chosen platform. Establishing clear support channels, involving both our internal tech teams and central IT. This training should also include structured pathways for data engineers or data scientists interested in advancing into ML engineering roles, for internal talent development (this would be ideal).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Clear guidelines and best practices:&lt;/strong&gt; Documenting how to use the platform effectively, including standards for model development, versioning, and deployment. These guidelines should evolve to incorporate the MLOps practices that dedicated ML engineering expertise can enable.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Automated workflow tools:&lt;/strong&gt; Implementing automated checks for model versioning, testing, or deployment standards, with nudges to guide developers towards best practices. Developing and maintaining these automation tools is a key function that ML engineering can support, streamlining operations.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Lightweight review processes:&lt;/strong&gt; Establishing efficient review processes for new model or software package deployments to ensure they meet quality, security, and operational standards.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Performance monitoring and feedback loops:&lt;/strong&gt; Setting up dashboards to monitor platform usage, performance, cost, and user satisfaction. Establishing a clear channel for data scientists to provide feedback on their experience and needs to the platform support teams and IT, ensuring continuous improvement.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Strategic skill development plan:&lt;/strong&gt; Explicitly defining how the necessary ML engineering skills will be acquired – whether through targeted hiring, dedicated upskilling programmes for existing data engineers or data scientists, or a combination. This plan is a core operational mechanism for the strategy’s long-term success.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;These operational mechanisms, as Will describes, are the practical steps that transform the platform choice (the policy) into a living, impactful part of our engineering practice. They address the human and process elements necessary for technical success in a complex organisation, including the vital step of building the required expertise.&lt;/p&gt;&lt;h3 id=&quot;the-path-forward-driving-impact-with-clear-strategy&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/actionable-strategy-implementing-an-ml-platform-in-an-energy-business/#the-path-forward-driving-impact-with-clear-strategy&quot;&gt;The path forward: driving impact with clear strategy&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Applying Will Larson’s framework provides a clear and actionable path for navigating the complexities of choosing and implementing an ML platform in our environment. It moves us beyond simply evaluating technical features to building a holistic strategy that considers our specific needs, constraints, the operational realities of a large energy company, and the crucial human skills required for success.&lt;/p&gt;&lt;p&gt;By focusing on thorough exploration, a detailed diagnosis grounded in our unique context (including acknowledging skill gaps), and practical operational mechanisms (including a plan for skill development), we can build a strategy that is not only technically sound but also achievable and impactful for our offshore wind business. The remaining steps in Will’s framework, refinement and policy, would guide us in testing our assumptions and drafting well-informed policy. ML engineering expertise is key in this to getting the full potential of ML for optimising turbine performance and contributing to our KPIs.&lt;/p&gt;&lt;p&gt;You can find Will Larson’s full series on engineering strategy here:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://lethain.com/components-of-eng-strategy/&quot; rel=&quot;noopener&quot;&gt;Steps to build an engineering strategy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://lethain.com/exploring-for-strategy/&quot; rel=&quot;noopener&quot;&gt;Exploring for Strategy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://lethain.com/diagnosis-for-strategy/&quot; rel=&quot;noopener&quot;&gt;Diagnosis for Strategy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://lethain.com/operations-for-strategy/&quot; rel=&quot;noopener&quot;&gt;Operations for Strategy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr&gt;&lt;p&gt;&lt;em&gt;Disclaimer: This post reflects my personal thoughts and learning based on publicly available frameworks and general industry challenges. It does not represent the official views, plans, or internal details of my employer.&lt;/em&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Building a PDF to markdown converter with vibe-coding</title>
      <link href="https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/" />
      <updated>2025-06-07T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/</id>
      <content type="html">
				&lt;p&gt;I needed a way to extract text from poorly formatted PDF handouts for my studies. The plan was to feed this extracted text, together with the video captions of the lessons, to an LLM. I have configured this LLM to be my teaching assistant, formatting and structuring the text in a way that makes it easy to read and helps me understand the material for my exams.&lt;/p&gt;&lt;h2 id=&quot;the-pdf-to-markdown-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/#the-pdf-to-markdown-approach&quot;&gt;The PDF to Markdown approach&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Rather than spending time researching complex solutions, I decided to build something simple that worked. One HTML file with everything included: PDF.js for parsing, vanilla JavaScript, and modern CSS.&lt;/p&gt;&lt;h2 id=&quot;using-claude-sonnet-4-effectively&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/#using-claude-sonnet-4-effectively&quot;&gt;Using Claude Sonnet 4 effectively&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Before starting, I read through Anthropic’s &lt;a href=&quot;https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/claude-4-best-practices&quot; rel=&quot;noopener&quot;&gt;Claude 4 prompt engineering best practices&lt;/a&gt;. The documentation provides specific techniques for getting optimal results from Claude 4 models. I recommend reading it if you’re working with Claude.&lt;/p&gt;&lt;p&gt;Using their guidance, I crafted this prompt for Sonnet 4:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Give me options to transform pdf to markdown. Can you create a converter tool using a single web page? First think of how you would design such a tool.&lt;/p&gt;&lt;p&gt;Please write a high quality plan for a general purpose solution. Implement a solution that works correctly for all valid inputs, not just the test cases. Do not hard-code values or create solutions that only work for specific test inputs. Instead, implement the actual logic that solves the problem generally.&lt;/p&gt;&lt;p&gt;Focus on understanding the problem requirements and implementing the correct algorithm. Tests are there to verify correctness, not to define the solution. Provide a principled implementation that follows best practices and software design principles.&lt;/p&gt;&lt;p&gt;If the task is unreasonable or infeasible, or if any of tests are incorrect, please tell me. The solution should be robust, maintainable, and extendable.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The result worked perfectly on the first attempt. Impressive.&lt;/p&gt;&lt;h2 id=&quot;the-markdown-to-onenote-converter&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/#the-markdown-to-onenote-converter&quot;&gt;The Markdown to OneNote converter&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;After successfully creating the PDF to Markdown tool, I followed up by building a converter that takes Markdown with formatting and converts it to OneNote format. This allows me to easily adapt the notes in my favourite note-taking tool.&lt;/p&gt;&lt;p&gt;I started with a similar prompt, but this one proved more challenging. It required multiple attempts to get right. During development, I used prompts like this when encountering errors:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I have this error, can you think of a fix? One that is elegant, robust and works in a generic way. Include as many relevant features and interactions as possible. Don’t hold back. Give it your all.&lt;/p&gt;&lt;p&gt;The overall goal of the tool is to copy markdown with formatting to OneNote.&lt;/p&gt;&lt;p&gt;I do not think you have access here to a Python environment.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Error&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;language-plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;markdown-to-onenote.html:823
Image loading failed, using SVG data URL
img.onerror @ markdown-to-onenote.html:823&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;Through iterative refinement, we eventually arrived at a working solution. The final result handles Markdown formatting and converts it properly to OneNote’s format. &lt;s&gt;However, it still has some limitations, such as not supporting more than one diagram. I would like to improve this, but I have to dive into what the real problem is.&lt;/s&gt;*&lt;br&gt;*Fully working now for mupliple diagrams in one page.&lt;/p&gt;&lt;p&gt;You can try the tools here:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://allarddewinter.github.io/pdf-to-markdown-converter&quot; rel=&quot;noopener&quot;&gt;PDF to Markdown Converter&lt;/a&gt; (&lt;a href=&quot;https://github.com/allarddewinter/pdf-to-markdown-converter&quot; rel=&quot;noopener&quot;&gt;source code&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://allarddewinter.github.io/markdown-to-onenote/&quot; rel=&quot;noopener&quot;&gt;Markdown to OneNote Converter&lt;/a&gt; (&lt;a href=&quot;https://github.com/allarddewinter/markdown-to-onenote/tree/main&quot; rel=&quot;noopener&quot;&gt;source code&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;results&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-pdf-to-markdown-converter-with-vibe-coding/#results&quot;&gt;Results&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;These tools now handle my study workflow efficiently:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Convert PDF handouts to Markdown.&lt;/li&gt;&lt;li&gt;Feed text and video captions to Claude with instructions to create study summaries.&lt;/li&gt;&lt;li&gt;Convert formatted Markdown to OneNote for easy editing.&lt;/li&gt;&lt;li&gt;Get structured exam notes in my preferred note-taking app.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;What used to take hours of manual text extraction and formatting now takes minutes. The combination of proper prompt engineering and focused tools solved the actual problems I had. The iterative development process, while sometimes challenging, ultimately produced robust solutions that work well for my needs. And most importantly, it was a lot of fun to build, and I am very impressed with the capabilities of these new models!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Avoiding and reducing technical debt</title>
      <link href="https://allarddewinter.net/blog/avoiding-and-reducing-technical-debt/" />
      <updated>2025-06-06T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/avoiding-and-reducing-technical-debt/</id>
      <content type="html">
				&lt;p&gt;Following on from yesterday’s post about &lt;a href=&quot;https://allarddewinter.net/blog/decision-making-pitfalls-for-technical-leaders&quot;&gt;decision-making pitfalls for technical leaders&lt;/a&gt;, I wanted to highlight another series by Chelsea Troy on technical debt.&lt;/p&gt;&lt;p&gt;In her post &lt;a href=&quot;https://chelseatroy.com/2021/01/14/quantifying-technical-debt/&quot; rel=&quot;noopener&quot;&gt;“Quantifying Technical Debt”&lt;/a&gt;, Chelsea starts by defining technical debt, or what she prefers to call “maintenance load,” as the ongoing effort required to keep existing software features running. She argues that all code carries maintenance load, which increases over time depending on the practices used to build and maintain the software. In the post, she illustrates this with two cases: a “yikes case” where a team adds the equivalent of one full-time developer’s worth of maintenance load every 18 months due to a lack of tests, documentation, and a complex coding style, and an “average case” where this happens every 24-30 months with some testing and documentation in place.&lt;/p&gt;&lt;p&gt;In the second post of the series, &lt;a href=&quot;https://chelseatroy.com/2021/01/18/avoiding-technical-debt/&quot; rel=&quot;noopener&quot;&gt;“Avoiding Technical Debt”&lt;/a&gt;, Chelsea explores how some teams manage to keep their maintenance load from growing. She highlights the example of the Explosion company, which maintains multiple complex products with a small team. Key factors she identifies are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lower churn:&lt;/strong&gt; Open-source projects, like SpaCy, tend to have lower developer churn, reducing the loss of undocumented context.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Higher code stewardship skills:&lt;/strong&gt; Open-source contributors often have strong skills in testing, documenting, and communicating their work, as their “clients” are other developers who need to understand and contribute to the code. This focus on accessibility and clarity mitigates context loss.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Developer empowerment:&lt;/strong&gt; In open-source, developers often have more autonomy to rethink or remove features, streamlining the codebase.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To avoid maintenance load growth, Chelsea consequently suggests:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Normalising and valuing writing tests and documentation.&lt;/li&gt;&lt;li&gt;Training and rewarding developers for effective communication about their technical choices.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In the third post, &lt;a href=&quot;https://chelseatroy.com/2021/01/21/reducing-technical-debt/&quot; rel=&quot;noopener&quot;&gt;“Reducing Technical Debt”&lt;/a&gt;, Chelsea addresses the challenge of reducing maintenance load when a team is already struggling under its weight. She offers three strategies:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Force features to earn their keep:&lt;/strong&gt; Regularly measure the ROI of features and remove those with low returns.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Regularly equip developers to suggest streamlining options:&lt;/strong&gt; Give developers time and space to find simpler solutions that improve functionality, robustness, and maintainability simultaneously.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Recover lost context:&lt;/strong&gt; Develop skills in “forensic software analysis” to understand how older codebases work, even when the original authors are gone. This is often less expensive than a full rewrite.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Chelsea emphasizes that both the technical team having these skills and the organisation valuing the use of those skills are crucial for managing and reducing maintenance load.&lt;/p&gt;&lt;p&gt;This series really resonated with me. The idea of “maintenance load” is a much more tangible way to think about technical debt than just “bad code.” It highlights that it’s an ongoing cost, not just a one-time fix. The strategies she outlines, particularly the focus on code stewardship and streamlining, provide practical steps teams can take. I have seen how a lack of documentation and communication negatively influences a team’s ability to maintain a codebase, and the concept of “forensic software analysis” is an interesting approach to move away from that. It also highlights that investing in these “non-feature” activities is essential for long-term project health. Finally, effective technical leadership, as discussed in my &lt;a href=&quot;https://allarddewinter.net/blog/decision-making-pitfalls-for-technical-leaders&quot;&gt;previous post&lt;/a&gt;, is key to implementing these strategies and fostering a culture that prioritises sustainable software development.&lt;/p&gt;&lt;p&gt;Links to the series:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Quantifying Technical Debt: &lt;a href=&quot;https://chelseatroy.com/2021/01/14/quantifying-technical-debt/&quot; rel=&quot;noopener&quot;&gt;https://chelseatroy.com/2021/01/14/quantifying-technical-debt/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Avoiding Technical Debt: &lt;a href=&quot;https://chelseatroy.com/2021/01/18/avoiding-technical-debt/&quot; rel=&quot;noopener&quot;&gt;https://chelseatroy.com/2021/01/18/avoiding-technical-debt/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Reducing Technical Debt: &lt;a href=&quot;https://chelseatroy.com/2021/01/21/reducing-technical-debt/&quot; rel=&quot;noopener&quot;&gt;https://chelseatroy.com/2021/01/21/reducing-technical-debt/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 			</content>
    </entry><entry>
      <title>Decision-making pitfalls for leaders from Chelsea Troy</title>
      <link href="https://allarddewinter.net/blog/decision-making-pitfalls-for-leaders-from-chelsea-troy/" />
      <updated>2025-06-05T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/decision-making-pitfalls-for-leaders-from-chelsea-troy/</id>
      <content type="html">
				&lt;p&gt;I recently came across Chelsea Troy’s website, she shares many interesting thoughts there, I recommend checking it out: &lt;a href=&quot;https://chelseatroy.com/&quot; rel=&quot;noopener&quot;&gt;https://chelseatroy.com/&lt;/a&gt;. She is a Senior Staff Engineer at Mozilla and a Computer Science teacher who provides great insights on technical topics, strategy, and leadership.&lt;/p&gt;&lt;p&gt;Her post discussing common decision-making pitfalls for technical leaders was very informative. Pitfall #2, in particular, about treating everything as an optimising metric, particularly stood out:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Pitfall #2: Treating Everything as an Optimizing Metric&lt;/strong&gt;&lt;br&gt;What it is: Making a long list of characteristics to consider while making a decision between two or more dependencies, architectures, or strategies, and then forestalling or repeatedly reopening the decision until one option outperforms all the others on all of the characteristics.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I have also fallen into this trap in the past. I remember being part of a team that was incredibly indecisive about platform options. This led to endless debates, a prolonged period without a technology choice, and a lot of uncertainty. We tested countless options, suffering from “death by comparison tables.” And because we could, we would even reopen discussions six months later. Not fun at all!&lt;/p&gt;&lt;p&gt;I like Chelsea’s idea on how to prevent or move away from this situation:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;To explain this, I want to introduce you to the idea of optimizing and satisficing metrics.&lt;/p&gt;&lt;p&gt;Optimizing metrics are the ones for which more is always better… Satisficing metrics are the ones for which we have a clear idea of how good is good enough. More of this does not improve our product outcome.&lt;/p&gt;&lt;p&gt;When you are making decisions, narrow down the list of optimizing metrics to as few as possible—zero if you can, one or two realistically. Then, establish the threshold at which your options would satisfice on all of the other metrics.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This simple distinction is very much to the point.&lt;/p&gt;&lt;p&gt;In my own experience, getting some extra support and having central IT make up their mind, along with some help from platform providers, helped us move forward. This aligns with the idea of getting clear on what “good enough” looks like for certain criteria.&lt;/p&gt;&lt;p&gt;You can read Chelsea’s full post here: &lt;a href=&quot;https://chelseatroy.com/2024/10/16/decision-making-pitfalls-for-technical-leaders/&quot; rel=&quot;noopener&quot;&gt;https://chelseatroy.com/2024/10/16/decision-making-pitfalls-for-technical-leaders/&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Python Developer Tooling Handbook</title>
      <link href="https://allarddewinter.net/blog/python-developer-tooling-handbook/" />
      <updated>2025-06-04T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/python-developer-tooling-handbook/</id>
      <content type="html">
				&lt;h1 id=&quot;python-developer-tooling-handbook&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/python-developer-tooling-handbook/#python-developer-tooling-handbook&quot;&gt;Python Developer Tooling Handbook&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;I came across this excellent resource by &lt;a href=&quot;https://pydevtools.com/handbook/&quot; rel=&quot;noopener&quot;&gt;Tim Hopper&lt;/a&gt;: a comprehensive guide to Python development tools and best practices.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;This is not a book about programming Python. Instead, the goal of this book is to help you understand the ecosystem of tools used to make Python development easier and more productive.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The handbook is structured into four sections:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Tutorial: Step-by-step guides to improve your Python development experience&lt;/li&gt;&lt;li&gt;How To: Practical guidance for your Python projects&lt;/li&gt;&lt;li&gt;Explanation: In-depth understanding of Python development concepts&lt;/li&gt;&lt;li&gt;Reference: Detailed information about specific tools and concepts&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What I particularly appreciate is how it provides detailed explanations of design decisions and tool functionality, complete with code examples and references to relevant PEPs. For instance:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href=&quot;https://pydevtools.com/handbook/reference/pyproject/&quot; rel=&quot;noopener&quot;&gt;pyproject.toml reference&lt;/a&gt; includes example code and relevant standards&lt;/li&gt;&lt;li&gt;A &lt;a href=&quot;https://pydevtools.com/blog/simple-modern-uv/&quot; rel=&quot;noopener&quot;&gt;blog post on Simple Modern Python&lt;/a&gt; highlights modern tooling:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;[…] minimal but essential tools for Python projects:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Uses uv for package management&lt;/li&gt;&lt;li&gt;Incorporates ruff for linting and formatting (replacing Black and isort)&lt;/li&gt;&lt;li&gt;Includes mypy, codespell, and pytest&lt;/li&gt;&lt;li&gt;Provides GitHub Actions configuration&lt;/li&gt;&lt;li&gt;Uses Copier for template management&lt;br&gt;[…]&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;This would have been incredibly helpful in the past when I struggled with determining which standards to use or what best practices to follow. The book provides a valuable and easy to understand overview of the modern Python development ecosystem.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Building a modern resume: from manual tweaks to AI-powered automation</title>
      <link href="https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/" />
      <updated>2025-06-03T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/</id>
      <content type="html">
				&lt;p&gt;Creating and maintaining a resume used to be a real headache. In the past, I’d spend hours fine-tuning the layout. Every text edit meant a cascade of layout adjustments just to make it fit, look decent, or simply not break. It was a constant battle.&lt;/p&gt;&lt;p&gt;My next attempt was using PowerPoint, with two A4-sized slides. This gave me a bit more freedom to tweak the design, and it looked pretty cool, I must say. But still, fine-tuning the layout was hard, and selecting all text for editing was cumbersome. Even thinking about using a different layout meant hours of tweaking everything from scratch.&lt;/p&gt;&lt;p&gt;My third iteration, however, has been the best so far. I stumbled upon an open-source tool called &lt;a href=&quot;https://github.com/AmruthPillai/Reactive-Resume&quot; rel=&quot;noopener&quot;&gt;Reactive-Resume&lt;/a&gt;. With this, you can store your resume as JSON, use an interactive UI, and with a single click, play around with a limited selection of themes. It’s truly great that this tool has been developed and open-sourced.&lt;/p&gt;&lt;p&gt;As their documentation states:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Reactive Resume is a free and open-source resume builder that simplifies the process of creating, updating, and sharing your resume. With zero user tracking or advertising, your privacy is a top priority. The platform is extremely user-friendly and can be self-hosted in less than 30 seconds if you wish to own your data completely.&lt;/p&gt;&lt;p&gt;It’s available in multiple languages and comes packed with features such as real-time editing, dozens of templates, drag-and-drop customisation, and integration with OpenAI for enhancing your writing.&lt;/p&gt;&lt;p&gt;You can share a personalised link of your resume to potential employers, track its views or downloads, and customise your page layout by dragging-and-dropping sections. The platform also supports various font options and provides dozens of templates to choose from. And yes, there’s even a dark mode for a more comfortable viewing experience.&lt;/p&gt;&lt;p&gt;Start creating your standout resume with Reactive Resume today!&lt;br&gt;(Source: &lt;a href=&quot;https://docs.rxresu.me/&quot; rel=&quot;noopener&quot;&gt;https://docs.rxresu.me/&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It’s a really easy tool to use with an intuitive UI. Also, I can store the JSON in my GitHub, which automatically gives me an overview of the history of changes. Then I use the online editor to play with the layout and generate a PDF version.&lt;/p&gt;&lt;p&gt;Of course, I also used generative AI for translating and fine-tuning my resume’s text. I tried many different models, but at this moment, I most liked the language use of Google’s Gemini 2.5 Flash, especially if you tell it not to be “too engaging” 🤭. I heard others saying they had good experiences with Anthropic Sonnet 4 or even Opus 4. I liked these for translation from English to Dutch, but overall, I think they tend to generate overly long texts, which means a lot of editing for me.&lt;/p&gt;&lt;p&gt;For editing all text from the document using an LLM, you could share the whole JSON in the chat, but that’s quite large. I also noticed you really need to be very specific about what it can change; for example, it shouldn’t alter the unique identifiers in the JSON. I found it easier to only give the personally written texts as Markdown to the LLM and let it proofread that. To get the text from the JSON, again, you need to be very specific. The models tend not to copy everything or change some text here and there. Proofreading the LLM’s output to ensure it was correct, and waiting for it to generate the output, became quite tedious.&lt;/p&gt;&lt;p&gt;So, I asked Anthropic Sonnet 4 to create an app for me:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I want you to build me app in which I can paste a json and as output I get the relevant text in markdown. I will provide an example json, it is my resume, I am only interested in the text I wrote, like summary or title, and not IDs. First create a step by step plan to build this app. I would prefer something that can run in the browser.&lt;/p&gt;&lt;p&gt;# json&lt;br&gt;[resume json]&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It came back with a plan to build the app:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;# Step-by-Step Plan: JSON Resume to Markdown Converter&lt;br&gt;[…]&lt;/p&gt;&lt;h2 id=&quot;overview&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#overview&quot;&gt;Overview&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h2 id=&quot;steps&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#steps&quot;&gt;Steps&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;1-setup-basic-html-structure&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#1-setup-basic-html-structure&quot;&gt;1. &lt;strong&gt;Setup Basic HTML Structure&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;2-design-the-user-interface&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#2-design-the-user-interface&quot;&gt;2. &lt;strong&gt;Design the User Interface&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;3-implement-json-parsing-logic&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#3-implement-json-parsing-logic&quot;&gt;3. &lt;strong&gt;Implement JSON Parsing Logic&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;4-create-content-extraction-functions&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#4-create-content-extraction-functions&quot;&gt;4. &lt;strong&gt;Create Content Extraction Functions&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;5-implement-html-to-text-conversion&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#5-implement-html-to-text-conversion&quot;&gt;5. &lt;strong&gt;Implement HTML to Text Conversion&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;6-create-markdown-formatting-functions&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#6-create-markdown-formatting-functions&quot;&gt;6. &lt;strong&gt;Create Markdown Formatting Functions&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;7-implement-the-main-conversion-logic&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#7-implement-the-main-conversion-logic&quot;&gt;7. &lt;strong&gt;Implement the Main Conversion Logic&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;8-add-user-experience-features&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#8-add-user-experience-features&quot;&gt;8. &lt;strong&gt;Add User Experience Features&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;9-error-handling-and-validation&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#9-error-handling-and-validation&quot;&gt;9. &lt;strong&gt;Error Handling and Validation&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h3 id=&quot;10-testing-and-refinement&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#10-testing-and-refinement&quot;&gt;10. &lt;strong&gt;Testing and Refinement&lt;/strong&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h2 id=&quot;technical-approach&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#technical-approach&quot;&gt;Technical Approach&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;h2 id=&quot;expected-output-format&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-a-modern-resume-from-manual-tweaks-to-ai-powered-automation/#expected-output-format&quot;&gt;Expected Output Format&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Next, I asked it to build the app, and voilà, it created an app that worked in one go, did exactly what it needed to do, and even had quite a nice design. On closer inspection, I did ask it to make it a more generic tool, as the first version referenced an ID, which is, of course, unique to my example JSON. I asked it to come up with a more generic solution for that, and it did the filtering on section name, which seems to be working just as well.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-650w.avif 650w, https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-960w.avif 960w, https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-650w.webp 650w, https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-960w.webp 960w, https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-650w.jpeg 650w, https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-960w.jpeg 960w, https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/rxresume-json-markdown-converter-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;573&quot; alt=&quot;Screenshot of the Reactive Resume JSON to Markdown converter web application.&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;My custom-built web tool for extracting text from Reactive Resume JSON into Markdown.&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;I’ve hosted it using GitHub Pages, so you can try it for yourself. Here is the link: &lt;a href=&quot;https://allarddewinter.github.io/rxresume-json-markdown-converter/&quot; rel=&quot;noopener&quot;&gt;https://allarddewinter.github.io/rxresume-json-markdown-converter/&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This has been absolute fun to make! Using code (HTML, CSS, JavaScript), which I only have limited experience with, saves me a lot of hassle proofreading the LLM. The output is instant, and it saves tokens used (although I don’t think that really saves a lot of money). As a last note, you could say it also touches on the environmental impact, Simon Willison’s recent posts offer a good perspective on this, suggesting that for typical personal use, it’s not as significant as some might fear:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Developers burning through $100 of tokens per day (not impossible given some of the LLM-heavy development patterns that are beginning to emerge) could end the year with the equivalent of a short haul flight or 600 mile car journey.&lt;br&gt;(Source: &lt;a href=&quot;https://simonwillison.net/2025/May/20/ai-energy-footprint/&quot; rel=&quot;noopener&quot;&gt;https://simonwillison.net/2025/May/20/ai-energy-footprint/&lt;/a&gt; and &lt;a href=&quot;https://simonwillison.net/2025/May/6/whats-the-carbon-footprint-of-using-chatgpt/&quot; rel=&quot;noopener&quot;&gt;https://simonwillison.net/2025/May/6/whats-the-carbon-footprint-of-using-chatgpt/&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Overall, it’s been real fun to be ‘vibe coding’ like this and creating tooling to make my work easier.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Inspiring Persons: Chip Huyen – A Structured Approach to Technology and (Career) Growth</title>
      <link href="https://allarddewinter.net/blog/inspiring-persons-chip-huyen-a-structured-approach-to-technology-and-career-growth/" />
      <updated>2025-06-02T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/inspiring-persons-chip-huyen-a-structured-approach-to-technology-and-career-growth/</id>
      <content type="html">
				&lt;p&gt;Chip Huyen, whose work is available on her &lt;a href=&quot;https://huyenchip.com/&quot; rel=&quot;noopener&quot;&gt;personal website&lt;/a&gt;, demonstrates a structured and strategic approach to career and personal development. This aligns with principles of positive mindset and self-direction, as discussed by Michael Pilarczyk in my earlier post on him: &lt;a href=&quot;https://allarddewinter.net/blog/inspiring-persons-michael-pilarczyk-part-1/&quot; rel=&quot;noopener&quot;&gt;Inspiring Persons: Michael Pilarczyk&lt;/a&gt;. She has a consistent method of exploring complex topics, synthesising information, and presenting it for others to learn from through her blog, books, and courses.&lt;/p&gt;&lt;p&gt;Her perspectives on personal growth, detailed in her blog post “Measuring personal growth” (&lt;a href=&quot;https://huyenchip.com/2024/04/17/personal-growth.html&quot; rel=&quot;noopener&quot;&gt;https://huyenchip.com/2024/04/17/personal-growth.html&lt;/a&gt;), reflect an analytical approach to self-improvement. She discusses metrics such as the rate of change in life, the time taken to work on significant challenges, and the expansion of future options. This quantitative view of personal development shares common ground with Michael Pilarczyk’s “Master Your Mindset” in its emphasis on intentional growth and proactive problem-solving. As she writes in her blog post:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;As someone lowkey fascinated by numbers, I don’t see why measuring and living have to be mutually exclusive – measuring often helps me live better – but I see where they come from.&lt;br&gt;Both perspectives support this deliberate and intentional approach to personal development.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;From a professional standpoint, her &lt;a href=&quot;https://stanford-cs329s.github.io/&quot; rel=&quot;noopener&quot;&gt;Stanford course, CS 329S: Machine Learning Systems Design&lt;/a&gt;, has been especially a valuable resource to me:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Lecture 9, on “Model Deployment,” provided insights into batch versus online prediction. (While “streaming” is often used for real-time data processing, “online prediction” is the term used in the course for synchronous, on-demand predictions.) It helped structure my understanding of our team’s needs at the time, where batch prediction was sufficient, and provided considerations for future transitions to online prediction, with possible real-time needs. The discussion also covered implications for future applications involving edge computing, such as models deployed on wind turbines.&lt;/li&gt;&lt;li&gt;Lecture 10, covering “Data Distribution Shifts and Monitoring,” was especially relevant to my industry. In the context of wind turbines, component wear can lead to shifts in nominal values. Moreover, this lecture highlighted the importance of monitoring practices, including setting alerts and establishing notification channels, to detect such shifts and maintain model performance. These materials were subsequently applied to implement relevant processes and tools in my professional role.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In addition to her course, Chip Huyen has authored two books. “Designing Machine Learning Systems” (O’Reilly, 2022), derived from her Stanford course, provides a comprehensive view of ML system development. Her book, “AI Engineering” (O’Reilly, 2025), covers the development and deployment of applications using foundation models. Summaries for both books are accessible on her &lt;a href=&quot;https://github.com/chiphuyen&quot; rel=&quot;noopener&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Finally, her contributions as a woman in technology are noteworthy, particularly in the context of ongoing industry efforts towards diversity. Her work demonstrates a combination of technical expertise and a methodical approach to problem-solving. Very inspirational!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Twelve-factor agents: Building reliable LLM applications</title>
      <link href="https://allarddewinter.net/blog/twelve-factor-agents-building-reliable-llm-applications/" />
      <updated>2025-06-01T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/twelve-factor-agents-building-reliable-llm-applications/</id>
      <content type="html">
				&lt;p&gt;Dexter Horthy has put online a guide on building production level LLM applications. The guide presents a structured approach for developing LLM-powered software, in similar fashion as the original 12 factor framework.&lt;/p&gt;&lt;h2 id=&quot;12-factors-for-llm-applications&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/twelve-factor-agents-building-reliable-llm-applications/#12-factors-for-llm-applications&quot;&gt;12 factors for LLM applications&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Building LLM applications presents challenges when moving from prototype to production. The gap between demonstration quality and production readiness requires proven engineering principles. The original 12 Factor Apps methodology provided structure for SaaS development (web-based software delivered as a service to users). Dexter created a similar framework for LLM applications.&lt;/p&gt;&lt;p&gt;Most production AI agents are not fully autonomous systems. They consist of traditional software with LLM components integrated at specific points. This guide documents patterns for building functional systems.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/026-agent-dag-lines-650w.avif 650w, https://allarddewinter.net/assets/images/026-agent-dag-lines-960w.avif 960w, https://allarddewinter.net/assets/images/026-agent-dag-lines-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/026-agent-dag-lines-650w.webp 650w, https://allarddewinter.net/assets/images/026-agent-dag-lines-960w.webp 960w, https://allarddewinter.net/assets/images/026-agent-dag-lines-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/026-agent-dag-lines-650w.jpeg 650w, https://allarddewinter.net/assets/images/026-agent-dag-lines-960w.jpeg 960w, https://allarddewinter.net/assets/images/026-agent-dag-lines-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/026-agent-dag-lines-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;606&quot; alt=&quot;Diagram showing how LLMs make real-time decisions to determine execution paths&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Let the LLM make decisions in real time to figure out the path&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;The twelve principles are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Natural language to tool calls&lt;/li&gt;&lt;li&gt;Own your prompts&lt;/li&gt;&lt;li&gt;Own your context window&lt;/li&gt;&lt;li&gt;Tools are just structured outputs&lt;/li&gt;&lt;li&gt;Unify execution state and business state&lt;/li&gt;&lt;li&gt;Launch/pause/resume with simple APIs&lt;/li&gt;&lt;li&gt;Contact humans with tool calls&lt;/li&gt;&lt;li&gt;Own your control flow&lt;/li&gt;&lt;li&gt;Compact errors into context window&lt;/li&gt;&lt;li&gt;Small, focused agents&lt;/li&gt;&lt;li&gt;Trigger from anywhere, meet users where they are&lt;/li&gt;&lt;li&gt;Make your agent a stateless reducer&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The complete guide is available at &lt;a href=&quot;https://github.com/humanlayer/12-factor-agents&quot; rel=&quot;noopener&quot;&gt;12-factor-agents on GitHub&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Two factors stand out as particularly important yet factor 4 is for example often overlooked in the current AI hype with all these marketing terms:&lt;/p&gt;&lt;h2 id=&quot;factor-4-tools-are-just-structured-outputs&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/twelve-factor-agents-building-reliable-llm-applications/#factor-4-tools-are-just-structured-outputs&quot;&gt;Factor 4: Tools are just structured outputs&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This principle defines tools as structured JSON outputs from LLMs that trigger deterministic code. All the function calls you see today are simply JSON outputs. The pattern separates decision-making from execution. The LLM determines actions while application code controls implementation. This provides flexibility in execution logic without being constrained to specific function calls.&lt;/p&gt;&lt;h2 id=&quot;factor-10-small-focused-agents&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/twelve-factor-agents-building-reliable-llm-applications/#factor-10-small-focused-agents&quot;&gt;Factor 10: Small, focused agents&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This principle recommends building specialised agents for specific tasks rather than monolithic, everything-in-one systems. Context window limitations affect LLM performance as complexity increases. Limiting agents to 3-10 steps maintains manageable context and improves reliability. This approach facilitates debugging and testing while allowing gradual scope expansion.&lt;/p&gt;&lt;h2 id=&quot;the-original-12-factor-apps&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/twelve-factor-agents-building-reliable-llm-applications/#the-original-12-factor-apps&quot;&gt;The original 12 Factor Apps&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The &lt;a href=&quot;https://12factor.net/&quot; rel=&quot;noopener&quot;&gt;12 Factor Apps&lt;/a&gt; methodology, created by Adam Wiggins, established principles for building web applications. It addressed configuration management, dependency isolation, and deployment practices in SaaS development.&lt;/p&gt;&lt;p&gt;The 12-factor agents methodology addresses similar fragmentation in LLM application development. Both methodologies aim to create systematic approaches for building scalable software. Just as 12 Factor Apps gives order to web application development, this new framework provides structure for the field of LLM powered applications.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Building and deploying LLMs: A course made by practitioners</title>
      <link href="https://allarddewinter.net/blog/building-and-deploying-llms-a-course-made-by-practitioners/" />
      <updated>2025-05-31T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/building-and-deploying-llms-a-course-made-by-practitioners/</id>
      <content type="html">
				&lt;p&gt;Although published a year ago, this &lt;a href=&quot;https://hamel.dev/blog/posts/course/&quot; rel=&quot;noopener&quot;&gt;Mastering LLMs course&lt;/a&gt; remains a good resource for understanding LLM best practices. With teachers like Jeremy Howard and Simon Willison, it offers practical insights from people actually building AI products.&lt;/p&gt;&lt;p&gt;I particularly appreciate the deployment architecture perspectives. For those making technology decisions, understanding deployment complexity matters:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Simple Model Serving&lt;/strong&gt;: Basic setup with minimal configuration, direct integration with model library (e.g., FastAPI), ideal for proof of concepts and simple applications&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Advanced Model Serving&lt;/strong&gt;: Complex setup involving multiple components and configurations, uses auto-scaling clusters, load balancers, and specialized components, designed for high availability and scalability, suitable for large-scale, production-level applications&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;course-contents&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/building-and-deploying-llms-a-course-made-by-practitioners/#course-contents&quot;&gt;Course contents&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The course covers these topics:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Evaluations&lt;/strong&gt;: Testing frameworks for LLM applications&lt;/li&gt;&lt;li&gt;&lt;strong&gt;RAG (Retrieval-Augmented Generation)&lt;/strong&gt;: Information retrieval systems&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Fine-tuning&lt;/strong&gt;: LoRA adaptations and QLoRA optimisation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Building applications&lt;/strong&gt;: Deployment patterns and serving architectures&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Prompt engineering&lt;/strong&gt;: Production techniques&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Each section includes chapter summaries, notes, and resources. I especially like how they discuss building actual LLM-powered applications and model serving.&lt;/p&gt;&lt;p&gt;The course is free and open. It covers applied topics rather than theory.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Inspiring Persons: Will Larson&#39;s systems thinking approach to engineering strategy</title>
      <link href="https://allarddewinter.net/blog/inspiring-persons-will-larsons-systems-thinking-approach-to-engineering-strategy/" />
      <updated>2025-05-30T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/inspiring-persons-will-larsons-systems-thinking-approach-to-engineering-strategy/</id>
      <content type="html">
				&lt;p&gt;I find this fascinating: mapping a complex problem to a simple diagram with some numbers. This helps shift discussions from opinion-based to something more structured. This text is just an example from a larger book Will Larson is writing on engineering strategy. It shows how you can turn a sensitive topic like implementing LLMs, changing the way engineers work (maybe even combined with vibe coding), into a structured and meaningful conversation about impact on engineering quality and velocity.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/llm-dx-model-1-650w.avif 650w, https://allarddewinter.net/assets/images/llm-dx-model-1-960w.avif 960w, https://allarddewinter.net/assets/images/llm-dx-model-1-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/llm-dx-model-1-650w.webp 650w, https://allarddewinter.net/assets/images/llm-dx-model-1-960w.webp 960w, https://allarddewinter.net/assets/images/llm-dx-model-1-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/llm-dx-model-1-650w.jpeg 650w, https://allarddewinter.net/assets/images/llm-dx-model-1-960w.jpeg 960w, https://allarddewinter.net/assets/images/llm-dx-model-1-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/llm-dx-model-1-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;318&quot; alt=&quot;Developer workflow model showing five stages from open tickets to closed tickets, with error flows moving backwards&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Larson&#39;s systems model of developer workflow with forward progress and error feedback loops&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;It even backs up the importance of a good test suite, as it saves time throughout the whole software lifecycle. I’ve often had to have conversations about why it makes sense to invest in better testing. In the time of LLMs writing (parts of) code and vibe coding, it makes sense to have good tests to ensure the generated code actually does what you want. Of course, you can use LLMs to help generate the tests too. See also a recent discussion from &lt;a href=&quot;https://simonwillison.net&quot; rel=&quot;noopener&quot;&gt;Simon Willison on this&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What I appreciate is how he iterates and refines his approach and thinking on the job, meanwhile releasing some open source tooling (&lt;a href=&quot;https://github.com/lethain/systems&quot; rel=&quot;noopener&quot;&gt;systems modelling tools&lt;/a&gt;) and free-to-read chapters from his book.&lt;/p&gt;&lt;p&gt;Here are some key insights from his &lt;a href=&quot;https://lethain.com/dx-llm-model/&quot; rel=&quot;noopener&quot;&gt;LLM developer experience model&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“The value of a model is in refining our thinking, and simple models are usually more effective at refining thinking across a group than complex models, simply because complex models are fairly difficult to align a group around.”&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;“This is a fascinating result, because tripling development and testing velocity has changed how much work we start, but ultimately the real constraint in our system is the error discovery rate in production.”&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;“If we want to increase our velocity, we have to reduce the rate that we discover errors in production.”&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;systems-modelling-definition&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/inspiring-persons-will-larsons-systems-thinking-approach-to-engineering-strategy/#systems-modelling-definition&quot;&gt;Systems modelling definition&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Larson provides this summary of systems modelling (from his &lt;a href=&quot;https://lethain.com/strategy-systems-modeling/&quot; rel=&quot;noopener&quot;&gt;strategy systems modelling post&lt;/a&gt;):&lt;/p&gt;&lt;p&gt;Systems thinking uses stocks (accumulations like boxes in a diagram) and flows (changes between stocks, shown as arrows) to understand circumstances that might otherwise have surprising behaviour or are too slow to understand from measurement.&lt;/p&gt;&lt;p&gt;In his LLM impact model, Larson demonstrates how tripling development speed doesn’t actually increase overall velocity if errors in production remain the constraint. Without the model, teams might celebrate faster coding while missing that the real bottleneck is downstream error rates, this is what models do: they create a cheap way to understand reality when fully understanding reality is cumbersome.&lt;/p&gt;&lt;p&gt;For deeper learning, Larson recommends Donella Meadows’ &lt;em&gt;Thinking in Systems&lt;/em&gt; or his own shorter introduction in &lt;em&gt;An Elegant Puzzle&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Source: &lt;a href=&quot;https://lethain.com/dx-llm-model/&quot; rel=&quot;noopener&quot;&gt;Modeling impact of LLMs on Developer Experience&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This structured way of thinking, creating an overview, focusing on identifying constraints and levers for improvement, is very valuable for improving the software development process.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Emerging developer patterns for the AI era</title>
      <link href="https://allarddewinter.net/blog/emerging-developer-patterns-for-the-ai-era/" />
      <updated>2025-05-29T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/emerging-developer-patterns-for-the-ai-era/</id>
      <content type="html">
				&lt;p&gt;Yoko Li at a16z discusses how AI is changing software development, moving beyond tooling to a new foundation. This involves rethinking core concepts.&lt;/p&gt;&lt;p&gt;Nine emerging patterns are highlighted:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;AI-native Git:&lt;/strong&gt; Version control shifts focus to prompt+test bundles over line changes.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Dashboards -&gt; Synthesis:&lt;/strong&gt; Interfaces become dynamic and conversational via LLMs.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Docs as interactive knowledge bases:&lt;/strong&gt; Documentation serves humans and agents for context.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Templates to generation:&lt;/strong&gt; Custom project scaffolding based on descriptions replaces static templates.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Beyond .env:&lt;/strong&gt; Secrets management moves towards scoped tokens and local brokers for agents.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Accessibility as the universal interface:&lt;/strong&gt; Accessibility APIs may become the primary layer for agent interaction.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Asynchronous agent work:&lt;/strong&gt; Developers orchestrate agents working in the background across the development lifecycle.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;MCP becoming a universal standard:&lt;/strong&gt; Model Context Protocol enables tools to expose standard interfaces for agents.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Abstracted primitives:&lt;/strong&gt; Agents use robust, composable services (auth, billing, storage) optimised for agent consumption.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The article states:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It’s not just AI layered onto old workflows, but is a redefinition of how software gets built with agents, context, and intent at the core.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Read the full article for details.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://a16z.com/nine-emerging-developer-patterns-for-the-ai-era/&quot; rel=&quot;noopener&quot;&gt;Source: a16z.com&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Notes on The Startup CTO&#39;s Handbook by Zach Goldberg</title>
      <link href="https://allarddewinter.net/blog/notes-on-the-startup-ctos-handbook-by-zach-goldberg/" />
      <updated>2025-05-28T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/notes-on-the-startup-ctos-handbook-by-zach-goldberg/</id>
      <content type="html">
				&lt;p&gt;Came across &lt;a href=&quot;https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md&quot; rel=&quot;noopener&quot;&gt;The Startup CTO’s Handbook&lt;/a&gt; by Zach Goldberg. While titled for startup CTOs, it offers a lot of valuable insights that apply more broadly to anyone involved in tech leadership, engineering management, or even just looking to understand the processes and considerations within a tech department, whether in a startup or a larger corporate environment. It covers topics ranging from architecture and technology choices to team building and HR aspects.&lt;/p&gt;&lt;p&gt;A point on &lt;a href=&quot;https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md#tech-architecture&quot; rel=&quot;noopener&quot;&gt;tech architecture&lt;/a&gt; that resonated:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Good architecture aligns the strengths of the tools and patterns you choose with the needs of your organization now and in the foreseeable future.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This highlights that architecture isn’t just a technical exercise, but needs to serve the business context and its future trajectory.&lt;/p&gt;&lt;p&gt;Under &lt;a href=&quot;https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md#general-tips-and-best-practices-for-architecture-design&quot; rel=&quot;noopener&quot;&gt;General Tips And Best Practices For Architecture Design&lt;/a&gt;, several practical recommendations stand out:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Putting business logic in the backend for testability, code sharing, and security.&lt;/li&gt;&lt;li&gt;Designing services to be externalisable, which encourages better API design and data abstraction from the outset.&lt;/li&gt;&lt;li&gt;Minimising the number of programming languages used, acknowledging the significant overhead each additional language introduces beyond just the code itself (build systems, dependencies, best practices, interfaces).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Another section worth noting is on &lt;a href=&quot;https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md#boring-technology&quot; rel=&quot;noopener&quot;&gt;Boring Technology&lt;/a&gt;. The core idea here is that the primary goal is delivering business functionality, and this often doesn’t require the newest, most exciting tools. Using “not boring” technology can introduce hidden costs (immature documentation, underdeveloped ecosystems, higher defect rates, training, maintenance) that can outweigh perceived benefits. The decision to adopt new tech should involve a clear-eyed assessment of these costs versus the velocity benefit.&lt;/p&gt;&lt;p&gt;Overall, the handbook provides a solid framework of considerations for building and leading engineering teams effectively. It’s a resource worth exploring for practical advice on navigating the complexities of tech leadership and development processes.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>DevOps for Data Science</title>
      <link href="https://allarddewinter.net/blog/devops-for-data-science/" />
      <updated>2025-05-27T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/devops-for-data-science/</id>
      <content type="html">
				&lt;p&gt;Following up on the discussion about DevOps from an engineer’s perspective (as covered in a &lt;a href=&quot;https://allarddewinter.net/blog/yevgeniy-brikman-on-devops-from-an-engineers-perspective/&quot; rel=&quot;noopener&quot;&gt;previous post&lt;/a&gt;), I wanted to share some thoughts on Alex K Gold’s book, &lt;a href=&quot;https://do4ds.com/&quot; rel=&quot;noopener&quot;&gt;“DevOps for Data Science”&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This book offers a clear introduction to DevOps specifically for the data science field. Given the diverse backgrounds these special creatures called data scientists often have, the explanations start at a very accessible level. For instance, it covers foundational concepts like how an SSH connection is established and notes that Python and R are primarily single-threaded.&lt;/p&gt;&lt;p&gt;It provides a good overview of essential topics such as branching strategies, continuous integration/continuous deployment (CI/CD), and the necessity of different environments. While it doesn’t go deeply into each topic, it effectively introduces the terminology and explains the general purpose of these practices within DevOps.&lt;/p&gt;&lt;p&gt;The book includes a helpful table summarising how it addresses common challenges faced by data science teams and those supporting them:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Why I want it&lt;/th&gt;&lt;th&gt;How I feel&lt;/th&gt;&lt;th&gt;What’s my pain&lt;/th&gt;&lt;th&gt;Pain Killer&lt;/th&gt;&lt;th&gt;DO4DS is…&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;I’m trying to take my/our DS practices + procedures to the next level. I need a &lt;strong&gt;framework&lt;/strong&gt; for what I should do.&lt;/td&gt;&lt;td&gt;Unclear&lt;/td&gt;&lt;td&gt;I know our data science practice isn’t &lt;em&gt;production-grade&lt;/em&gt;, but I don’t know how to get better.&lt;/td&gt;&lt;td&gt;DO4DS gives me a framework for thinking about production data science.&lt;/td&gt;&lt;td&gt;Clear + Full of Mental Models&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;I don’t know how to communicate with the IT/Admins who manage our data science environment. I need &lt;strong&gt;advice&lt;/strong&gt;.&lt;/td&gt;&lt;td&gt;Confused&lt;/td&gt;&lt;td&gt;I don’t know what matters to IT/Admins or the words they use. Are they just bamboozling me?&lt;/td&gt;&lt;td&gt;DO4DS helps me understand the concerns of an IT/Admin and gives me the vocabulary to speak with them.&lt;/td&gt;&lt;td&gt;DS-Focused&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;I’m suddenly have to manage a data science environment as a data scientist. I need to know &lt;strong&gt;where to start&lt;/strong&gt; with this IT/Admin stuff.&lt;/td&gt;&lt;td&gt;Alone&lt;/td&gt;&lt;td&gt;I have no mental models for how IT/Admin stuff works. Can someone help me understand?&lt;/td&gt;&lt;td&gt;DO4DS gives me step-by-step instructions for getting started.&lt;/td&gt;&lt;td&gt;Actionable&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;I’m administering a data science environment, but I’m way over my head. I need some &lt;strong&gt;reassurance&lt;/strong&gt; that I’m not accidentally laying landmines I’m going to step on later.&lt;/td&gt;&lt;td&gt;Scared&lt;/td&gt;&lt;td&gt;I think I’ve figured it out, but I’m self-taught and don’t know if I’ve missed something important.&lt;/td&gt;&lt;td&gt;DO4DS points out security and stability risks and ways to limit them. I might not have it perfect now, but I understand the issues.&lt;/td&gt;&lt;td&gt;Forewarned&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Here is a relatable moment from the book that made me smile 🤭:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;[…]All this means it is impossible to work without real data.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;“Duh”, you say, “Of course you can’t do data science without real data”.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This may be obvious to you, but needing to do data science on real data in dev is a common source of friction with IT/Admins.[…]&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This highlights a common point of friction and the book’s focus on bridging the gap between data science needs and IT realities.&lt;/p&gt;&lt;p&gt;Overall, “DevOps for Data Science” is a valuable resource for anyone looking to understand or implement DevOps principles in a data science context, providing easy-to-understand explanations and some practical guidance.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;/assets/images/DevOps for Data Science-650w.avif 650w, /assets/images/DevOps for Data Science-960w.avif 960w, /assets/images/DevOps for Data Science-1400w.avif 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;/assets/images/DevOps for Data Science-650w.webp 650w, /assets/images/DevOps for Data Science-960w.webp 960w, /assets/images/DevOps for Data Science-1400w.webp 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;/assets/images/DevOps for Data Science-650w.jpeg 650w, /assets/images/DevOps for Data Science-960w.jpeg 960w, /assets/images/DevOps for Data Science-1400w.jpeg 1400w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/DevOps%20for%20Data%20Science-1400w.jpeg&quot; width=&quot;1400&quot; height=&quot;2100&quot; alt=&quot;Cover of the book &#39;DevOps for Data Science&#39; by Alex K Gold&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;300,600&lt;/figcaption&gt;&lt;/figure&gt;
 			</content>
    </entry><entry>
      <title>A Recommended Read: Architecture Patterns with Python</title>
      <link href="https://allarddewinter.net/blog/a-recommended-read-architecture-patterns-with-python/" />
      <updated>2025-05-26T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/a-recommended-read-architecture-patterns-with-python/</id>
      <content type="html">
				&lt;p&gt;I came across ‘Architecture Patterns with Python’ by Harry Percival and Bob Gregory, also known as ‘Cosmic Python’. Released in March 2020 by O’Reilly Media, this book is a really nice, in-depth guide to architectural patterns specifically for Python developers.&lt;/p&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/archipatternspython-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/archipatternspython-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/archipatternspython-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/archipatternspython-650w.jpeg&quot; width=&quot;650&quot; height=&quot;855&quot; alt=&quot;Cover of Architecture Patterns with Python book&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Why did they write the book?&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;At the end of Harry’s last book, Test-Driven Development with Python (O’Reilly), he found himself asking a bunch of questions about architecture, such as, What’s the best way of structuring your application so that it’s easy to test? More specifically, so that your core business logic is covered by unit tests, and so that you minimize the number of integration and end-to-end tests you need? He made vague references to “Hexagonal Architecture” and “Ports and Adapters” and “Functional Core, Imperative Shell,” but if he was honest, he’d have to admit that these weren’t things he really understood or had done in practice.&lt;br&gt;[…]&lt;br&gt;Our aim with this book is to introduce several classic architectural patterns and show how they support TDD, DDD, and event-driven services.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;What I particularly like are the practical code examples provided in the book. They effectively illustrate the concepts discussed. The authors take a structured approach, integrating test-driven development (TDD) and Domain-Driven Design (DDD) principles.&lt;/p&gt;&lt;p&gt;Beyond just patterns, the book also includes helpful design tips, some inspiration for creating UML diagrams, and practical testing advice within its chapters. It’s a comprehensive resource for anyone looking to improve their understanding of building robust Python applications.&lt;/p&gt;&lt;p&gt;You can find the online version at &lt;a href=&quot;https://www.cosmicpython.com/&quot; rel=&quot;noopener&quot;&gt;https://www.cosmicpython.com/&lt;/a&gt; and the O’Reilly link here: &lt;a href=&quot;https://learning.oreilly.com/library/view/architecture-patterns-with/9781492052197/&quot; rel=&quot;noopener&quot;&gt;https://learning.oreilly.com/library/view/architecture-patterns-with/9781492052197/&lt;/a&gt;.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Simon Willison on Building with LLMs (PyCon 2025)</title>
      <link href="https://allarddewinter.net/blog/simon-willison-on-building-with-llms-pycon-2025/" />
      <updated>2025-05-25T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/simon-willison-on-building-with-llms-pycon-2025/</id>
      <content type="html">
				&lt;p&gt;Came across this neat tutorial on building LLM-powered applications from Simon Willison, which he shared via his newsletter.&lt;/p&gt;&lt;p&gt;The materials cover practical things like setting up and running LLMs from the command line, using RAG (Retrieval Augmented Generation), and tool usage.&lt;/p&gt;&lt;p&gt;Here’s a snippet of the topics covered:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Topics we will cover include:&lt;/p&gt;&lt;p&gt;A review of the best currently available models&lt;br&gt;Using multi-modal LLMs to analyze images, audio and video&lt;br&gt;Use-cases that LLMs can be effectively applied to&lt;br&gt;How to access the most capable models via their various APIs&lt;br&gt;Prompt engineering&lt;br&gt;Retrieval Augmented Generation (RAG)&lt;br&gt;LLM tool usage&lt;br&gt;Automated evaluations for LLM applications&lt;br&gt;The latest options for running local models&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Here are the tutorial materials: &lt;a href=&quot;https://github.com/simonw/building-with-llms-pycon-2025&quot; rel=&quot;noopener&quot;&gt;https://github.com/simonw/building-with-llms-pycon-2025&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Found it via his newsletter here: &lt;a href=&quot;https://open.substack.com/pub/simonw/p/building-software-on-top-of-large&quot; rel=&quot;noopener&quot;&gt;https://open.substack.com/pub/simonw/p/building-software-on-top-of-large&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Making AI Work: Leadership, Lab, and Crowd</title>
      <link href="https://allarddewinter.net/blog/making-ai-work-leadership-lab-and-crowd/" />
      <updated>2025-05-24T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/making-ai-work-leadership-lab-and-crowd/</id>
      <content type="html">
				&lt;p&gt;Once again, Ethan Mollick delivers an interesting piece. I absolutely feel the need for the things he describes in my own experience.&lt;/p&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/370e328b-e4a5-4291-ae86-f06ad0df45fb_738x627-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/370e328b-e4a5-4291-ae86-f06ad0df45fb_738x627-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/370e328b-e4a5-4291-ae86-f06ad0df45fb_738x627-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/370e328b-e4a5-4291-ae86-f06ad0df45fb_738x627-650w.jpeg&quot; width=&quot;650&quot; height=&quot;552&quot; alt=&quot;Image illustrating the areas&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leadership&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Function&lt;/strong&gt;: Vision Setting&lt;/li&gt;&lt;li&gt;&lt;strong&gt;People&lt;/strong&gt;: Company leaders (e.g., CEOs, executives)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Crowd&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Function&lt;/strong&gt;: Performance Innovation&lt;/li&gt;&lt;li&gt;&lt;strong&gt;People&lt;/strong&gt;: Employees across departments&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Lab&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Function&lt;/strong&gt;: Product Development&lt;/li&gt;&lt;li&gt;&lt;strong&gt;People&lt;/strong&gt;: Subject matter experts, technologists, and non-technologists&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://open.substack.com/pub/oneusefulthing/p/making-ai-work-leadership-lab-and&quot; rel=&quot;noopener&quot;&gt;Link to original article&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;An overall vision is not enough, however, because leaders need to start to anticipate how work will change in a world of AI.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I am increasingly seeing organizations start to experiment with radical new approaches to work in response to AI. For example, dispersing software engineering teams, removing them from a central IT function and instead having them work in cross-functional teams with subject matter experts and marketing experts. Together, these groups can “vibework” and independently build projects in days that would have taken months of coordination across departments.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When research that once took weeks now takes minutes, the bottleneck isn’t the research anymore, it’s figuring out what research to do. When code can be written quickly, the limitation isn’t programming speed, it’s understanding what to build. When content can be generated instantly, the constraint isn’t production, it’s knowing what will actually matter to people.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;[…]&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The key is treating AI adoption as an organizational learning challenge, not merely a technical one.&lt;/p&gt;&lt;/blockquote&gt;
 			</content>
    </entry><entry>
      <title>Yevgeniy Brikman on DevOps from an engineer&#39;s perspective.</title>
      <link href="https://allarddewinter.net/blog/yevgeniy-brikman-on-devops-from-an-engineers-perspective/" />
      <updated>2025-05-23T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/yevgeniy-brikman-on-devops-from-an-engineers-perspective/</id>
      <content type="html">
				&lt;blockquote&gt;&lt;p&gt;“The goal of DevOps is to make software delivery vastly more efficient.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That quote comes from Yevgeniy Brikman’s book, &lt;em&gt;Fundamentals of DevOps and Software Delivery&lt;/em&gt; (2025), which can be read for free on the &lt;a href=&quot;https://www.gruntwork.io/books/fundamentals-of-devops&quot; rel=&quot;noopener&quot;&gt;Gruntwork website&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I had always thought of DevOps primarily as a separate role or team within tech. However, the book clarifies that it’s much broader:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;“DevOps isn’t the name of a team or a job title or a particular technology (though you’ll see it used for all three). Instead, it’s a set of processes, ideas, and techniques.”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Based on the outline, the book dives deep into the practical, hands-on aspects of software delivery from an engineer’s viewpoint. It covers topics like deploying applications, managing infrastructure as code, using orchestration tools, setting up CI/CD pipelines, handling networking and security, managing data storage, and monitoring systems. It provides concrete examples using various tools, making complex concepts accessible and providing code examples.&lt;/p&gt;&lt;p&gt;If, like me, you come from a technical background but have (or want to have) a more holistic view on how to work efficiently, this book seems like a great fit. It describes from an engineering perspective how to become better in DevOps. The potential improvements for companies that adopt these principles are significant:&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;Deploying once per month versus many times per day.&lt;/li&gt;&lt;li&gt;Deployment processes that take 36 hours versus 5 minutes.&lt;/li&gt;&lt;li&gt;Two out of three deployments causing problems versus one out of twenty.&lt;/li&gt;&lt;li&gt;Outages that last 24 hours versus 2 minutes.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;Implementing DevOps is challenging, though; the task can feel daunting. I had similar experiences, particularly when trying to implement and educate about MLOps. Often, you focus on optimising a single piece of the puzzle, making that more efficient in isolation. But the scope of what needs to change is so broad that changes are needed across the board, and you get stuck somewhere in the middle for more complete and lasting improvements. You might need to influence not only your own team but also surrounding teams, and perhaps even department structures or the overall company philosophy.&lt;/p&gt;&lt;p&gt;Brikman describes this complexity as a “&lt;a href=&quot;https://www.gruntwork.io/books/fundamentals-of-devops#box_of_snakes&quot; rel=&quot;noopener&quot;&gt;box of snakes&lt;/a&gt;” 🐍🐍🐍:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;What makes DevOps hard is not that any one of these concepts is incredibly complicated by itself, but that there are so many concepts to master—and you have to connect them all together just right. The TLS certificate must be configured just right, or your users will get scary errors that prevent them from accessing your website; your deployment pipeline must be configured just right, or your team won’t be able to deploy; your database backup must be set up just right, or you are at risk of data loss, and if you lose all your data, you may go out of business entirely. DevOps is remarkable combination of an incredibly broad surface area, but also one where you have to sweat every single detail, for either you get everything connected together correctly, or nothing works at all.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The perspective Brikman takes is that of the engineer, which makes the book a very accessible read if you’re coming from a tech background. It is an absolutely valuable read for anyone looking to understand and improve the efficiency of software delivery.&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Inspiring Persons: Michael Pilarczyk (Part 1)</title>
      <link href="https://allarddewinter.net/blog/inspiring-persons-michael-pilarczyk-part-1/" />
      <updated>2025-05-22T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/inspiring-persons-michael-pilarczyk-part-1/</id>
      <content type="html">
				&lt;p&gt;I want to introduce you to someone who has significantly impacted my perspective: Michael Pilarczyk. He has a remarkable ability to articulate and structure the way I generally approach life. I am a genuine admirer of his book, “&lt;a href=&quot;https://www.michaelpilarczyk.nl/boeken&quot; rel=&quot;noopener&quot;&gt;Master Your Mindset&lt;/a&gt;”, and the powerful ideas it contains, which blend neuroscience, stoicism, Eastern meditation, and modern coaching. The core message is about actively working and training your mindset towards achieving success, building resilience, and finding purpose.&lt;/p&gt;&lt;p&gt;A core conviction he shares, echoing Napoleon Hill’s ‘Think and Grow Rich’, is the power of focused thought and visualisation in attracting opportunities. This principle has manifested in my life multiple times. Most recently, when searching for our current home. We visualised finding a specific type of place, one that met our needs for space, location, and crucially, allowed us to live near my wife’s twin sister and her husband. Despite the specific requirements, within a year, we found our dream house in Kerkdriel.&lt;/p&gt;&lt;p&gt;Similarly, setting up our NGO and working in Rwanda and Madagascar involved visualising the goal and actively seeking possibilities. Initially, connections in Africa seemed distant, but by preparing and looking for openings, we unexpectedly connected with inspiring individuals like entrepreneur &lt;a href=&quot;https://mg.linkedin.com/in/rikstamhuis&quot; rel=&quot;noopener&quot;&gt;Rik Stamhuis&lt;/a&gt; and the mindful Father Jean Bosco in Nyabinoni, Rwanda, who provided the support and location we needed.&lt;/p&gt;&lt;p&gt;For me, this isn’t about magic or passive wishing. It’s about the active process of preparing yourself thoroughly, staying alert for even the smallest glimmer of opportunity, and then having the readiness and courage to seize that moment when it arises.&lt;/p&gt;&lt;h2 id=&quot;key-takeaways-from-master-your-mindset&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/inspiring-persons-michael-pilarczyk-part-1/#key-takeaways-from-master-your-mindset&quot;&gt;Key takeaways from Master Your Mindset&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;picture slot=&quot;image&quot;&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/masteryourmindset-book-650w.avif 650w, https://allarddewinter.net/assets/images/masteryourmindset-book-960w.avif 960w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/masteryourmindset-book-650w.webp 650w, https://allarddewinter.net/assets/images/masteryourmindset-book-960w.webp 960w&quot; sizes=&quot;auto&quot;&gt;&lt;br&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/masteryourmindset-book-650w.jpeg 650w, https://allarddewinter.net/assets/images/masteryourmindset-book-960w.jpeg 960w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/masteryourmindset-book-960w.jpeg&quot; width=&quot;960&quot; height=&quot;1460&quot; alt=&quot;Cover of the book Master Your Mindset by Michael Pilarczyk&quot; loading=&quot;eager&quot; decoding=&quot;sync&quot; class=&quot;image-width-50&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;p&gt;Michael’s book, ‘Master Your Mindset’, offers practical tools for this. Here are some key takeaways:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mindset as “software”: your beliefs shape reality&lt;/li&gt;&lt;li&gt;Identify and reframe limiting beliefs&lt;/li&gt;&lt;li&gt;Use daily practices: journaling, affirmations, visualisation&lt;/li&gt;&lt;li&gt;Design rituals and environment for consistency&lt;/li&gt;&lt;li&gt;Apply tiny habits to build unstoppable momentum&lt;/li&gt;&lt;li&gt;Embrace discomfort to grow resilience&lt;/li&gt;&lt;li&gt;Review and adjust goals regularly&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you’re interested in exploring his work further, his Dutch podcast “&lt;a href=&quot;https://open.spotify.com/show/41RKTinBuriqPUi313sGUq&quot; rel=&quot;noopener&quot;&gt;Leef je mooiste leven&lt;/a&gt;” is a great resource.&lt;/p&gt;&lt;p&gt;I’m personally looking forward to attending his “&lt;a href=&quot;https://www.michaelpilarczyk.nl/maximum-potential-2025&quot; rel=&quot;noopener&quot;&gt;Maximum Potential 2025&lt;/a&gt;” event; very excited about that!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Inspiring Persons: Simon Willison</title>
      <link href="https://allarddewinter.net/blog/inspiring-persons-simon-willison/" />
      <updated>2025-05-20T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/inspiring-persons-simon-willison/</id>
      <content type="html">
				&lt;p&gt;You are reading this post on my own website thanks to the inspiration of Simon Willison.&lt;/p&gt;&lt;p&gt;He is the one who inspired me to get my own site up and running and publish here instead of relying (only) on social media platforms. His personal website, &lt;a href=&quot;https://simonwillison.net/&quot; rel=&quot;noopener&quot;&gt;simonwillison.net&lt;/a&gt;, nicely demonstrates the value of owning your digital narrative and sharing knowledge freely.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Simon Willison is the creator of Datasette, an open source tool for exploring and publishing data. He currently works full-time building open source tools for data journalism, built around Datasette and SQLite.&lt;/p&gt;&lt;p&gt;Prior to becoming an independent open source developer, Simon was an engineering director at Eventbrite. Simon joined Eventbrite through their acquisition of Lanyrd, a Y Combinator funded company he co-founded in 2010.&lt;/p&gt;&lt;p&gt;He is a co-creator of the Django Web Framework, and has been blogging about web development and programming since 2002 at &lt;a href=&quot;http://simonwillison.net&quot; rel=&quot;noopener&quot;&gt;simonwillison.net&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Source: &lt;a href=&quot;https://simonwillison.net/about/&quot; rel=&quot;noopener&quot;&gt;Simon Willison’s About Page&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;inspiration-for-coding-and-learning&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/inspiring-persons-simon-willison/#inspiration-for-coding-and-learning&quot;&gt;Inspiration for Coding and Learning&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Beyond inspiring me to build my own platform, Simon is also an exceptional coder. His dedication inspires me to write better code and continue coding myself, even as my career progresses and coding is expected less and less.&lt;/p&gt;&lt;p&gt;I particularly appreciate how he shares his deep dives into Large Language Models (&lt;a href=&quot;https://simonwillison.net/tags/pelican-riding-a-bicycle/&quot; rel=&quot;noopener&quot;&gt;his pelican on a bike tests are real fun!&lt;/a&gt;), practical coding techniques, and technology trends. These provide really good insight and overview, and inspire me to experiment and build things myself.&lt;/p&gt;&lt;figure slot=&quot;image&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://allarddewinter.net/assets/images/simon-willison-pelican-thinking-650w.avif 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://allarddewinter.net/assets/images/simon-willison-pelican-thinking-650w.webp 650w&quot; sizes=&quot;auto&quot;&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://allarddewinter.net/assets/images/simon-willison-pelican-thinking-650w.jpeg 650w&quot; sizes=&quot;auto&quot;&gt;&lt;img src=&quot;https://allarddewinter.net/assets/images/simon-willison-pelican-thinking-650w.jpeg&quot; width=&quot;650&quot; height=&quot;487&quot; alt=&quot;An SVG image of a pelican riding a bicycle, generated by an LLM.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; eleventy:ignore=&quot;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;llm -m gemini-2.5-flash-preview-05-20 &#39;Generate an SVG of a pelican riding a bicycle&#39;&lt;/figcaption&gt;&lt;/figure&gt;&lt;h2 id=&quot;contributing-to-the-common-good&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://allarddewinter.net/blog/inspiring-persons-simon-willison/#contributing-to-the-common-good&quot;&gt;Contributing to the Common Good&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;I also appreciate his commitment to helping the common good. His Datasette tooling and workshops for the press are a great example of using technology to benefit everyone.&lt;/p&gt;&lt;p&gt;Overall, Simon Willison’s technical expertise, commitment to open source, and focus on the common good make him an inspiring person!&lt;/p&gt;
 			</content>
    </entry><entry>
      <title>Jager McConnell on Proprietary Data in the Age of Generative AI</title>
      <link href="https://allarddewinter.net/blog/jager-mcconnell-on-proprietary-data-in-the-age-of-generative-ai/" />
      <updated>2024-05-21T00:00:00Z</updated>
      <id>https://allarddewinter.net/blog/jager-mcconnell-on-proprietary-data-in-the-age-of-generative-ai/</id>
      <content type="html">
				&lt;p&gt;I also see this advantage for companies with large assets bases, like energy companies, if they learn how to leverage it.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;As a data company, I feel really good, because if you’ve got proprietary data that no one else has access to, it’s very hard to beat me at the game. Data and differentiation in that data that no one else has access to is the holy grail I think in the long run because, no, AI can’t make it up, and that feels like a winner.&lt;br&gt;— Jager McConnell, Crunchbase CEO&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Read the full article here: &lt;a href=&quot;https://stackoverflow.blog/2025/05/15/whether-ai-is-a-bubble-or-revolution-how-does-software-survive/&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.blog/2025/05/15/whether-ai-is-a-bubble-or-revolution-how-does-software-survive/&lt;/a&gt;&lt;/p&gt;
 			</content>
    </entry></feed>
