<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Shai Yallin</title><description>Writing on software engineering, testing, architecture, and engineering culture.</description><link>https://shaiyallin.com/</link><language>en-us</language><item><title>Codin&apos; On A Prayer</title><link>https://shaiyallin.com/post/codin-on-a-prayer/</link><guid isPermaLink="true">https://shaiyallin.com/post/codin-on-a-prayer/</guid><description>AI Agents are just like human contractors only faster; to make them work at scale and in a stable manner, you need to use deterministic, executable checks like tests, compilers, linters, etc - otherwise you&apos;re doing no better than prayer.</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category><category>rant</category></item><item><title>Case Study: Three Years at HoneyBook, From “Soft Consensus” to a Coherent Engineering Culture</title><link>https://shaiyallin.com/post/case-study-three-years-at-honeybook-from-soft-consensus-to-a-coherent-engineering-culture/</link><guid isPermaLink="true">https://shaiyallin.com/post/case-study-three-years-at-honeybook-from-soft-consensus-to-a-coherent-engineering-culture/</guid><description>There’s a particular kind of joy in seeing seeds you planted years ago take root. Watching an engineering organization grow over the course of several years, and seeing ideas we introduced become part of its everyday rhythm, have been some of the most gratifying parts of my work. This is the story of how a small engagement with HoneyBook evolved into a multi-year partnership that shaped everything from testing to architecture to culture. What began as a simple mission of technology evaluation an</description><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><category>culture</category><category>case-studies</category><category>software-engineering</category></item><item><title>Integrative UI/Backend Acceptance Tests with NestJS and React</title><link>https://shaiyallin.com/post/integrative-ui-backend-acceptance-tests-with-nestjs-and-react/</link><guid isPermaLink="true">https://shaiyallin.com/post/integrative-ui-backend-acceptance-tests-with-nestjs-and-react/</guid><description>In the final post of this series, we’ll cover how applications where both the frontend and the backend are built with Javascript can benefit from a novel approach to testing: in-process, JSDOM-based acceptance tests that drive the UI, but incorporate a backend that uses memory fakes for speed and determinism. The benefits are substantial: with this type of tests, we do not need to mock or fake the backend, thus eliminating a whole class of bugs and testing infrastructure. Each test runs its own </description><pubDate>Thu, 05 Sep 2024 00:00:00 GMT</pubDate></item><item><title>Acceptance-Testing NestJS Microservices</title><link>https://shaiyallin.com/post/acceptance-testing-nestjs-microservices/</link><guid isPermaLink="true">https://shaiyallin.com/post/acceptance-testing-nestjs-microservices/</guid><description>Acceptance Testing multiple NestJS Microservices by running them a single process communicating via a memory fake.</description><pubDate>Wed, 04 Sep 2024 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category></item><item><title>Fast and Furious Acceptance Tests for NestJS applications</title><link>https://shaiyallin.com/post/fast-and-furious-acceptance-tests-for-nestjs-applications/</link><guid isPermaLink="true">https://shaiyallin.com/post/fast-and-furious-acceptance-tests-for-nestjs-applications/</guid><description>Writing memory-based black-box acceptance tests for NestJS apps, testing features rather than implementation details</description><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><category>software-engineering</category><category>tdd</category></item><item><title>Using Contract Tests for reliable memory fakes</title><link>https://shaiyallin.com/post/using-contract-tests-for-reliable-memory-fakes/</link><guid isPermaLink="true">https://shaiyallin.com/post/using-contract-tests-for-reliable-memory-fakes/</guid><description>How to make sure that memory-based fakes really behave like the production implementations they replace</description><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category></item><item><title>Chaos-Engineering Your Culture: Building a Self-Healing Organization</title><link>https://shaiyallin.com/post/chaos-engineering-your-culture/</link><guid isPermaLink="true">https://shaiyallin.com/post/chaos-engineering-your-culture/</guid><description>In software, we design for failure. The same is true for organizations. Embrace replaceability to build a self-healing company.</description><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><category>culture</category></item><item><title>Software Dermatitis</title><link>https://shaiyallin.com/post/software-dermatitis/</link><guid isPermaLink="true">https://shaiyallin.com/post/software-dermatitis/</guid><description>Overzealous elimination of duplication can cause code to become so DRY it&apos;s actually brittle: like dry skin, it cracks under pressure.</description><pubDate>Tue, 18 Jun 2024 00:00:00 GMT</pubDate></item><item><title>Your Code as a Lava Lamp</title><link>https://shaiyallin.com/post/your-code-as-a-lava-lamp/</link><guid isPermaLink="true">https://shaiyallin.com/post/your-code-as-a-lava-lamp/</guid><description>In the fast-paced world of software development, change is the only constant. User needs evolve, new technologies emerge, and market conditions shift. In this environment, rigid, inflexible code is a liability. It&apos;s like a brittle sculpture that shatters under pressure. To build software that thrives in the face of change, we need to embrace a different mindset. We need to think of code not as a solid, immutable structure, but as a fluid, adaptable entity. In other words, we need to think of cod</description><pubDate>Tue, 04 Jun 2024 00:00:00 GMT</pubDate></item><item><title>You Don&apos;t Need Kubernetes (Yet)</title><link>https://shaiyallin.com/post/you-don-t-need-kubernetes-yet/</link><guid isPermaLink="true">https://shaiyallin.com/post/you-don-t-need-kubernetes-yet/</guid><description>K8s solves a problem that your new startup probably doesn&apos;t face. Invest your resources in finding product-market fit and scale up later.</description><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><category>lean</category><category>rant</category><category>software-engineering</category></item><item><title>The Hidden Benefits of Working on a Rotten Codebase</title><link>https://shaiyallin.com/post/the-hidden-benefits-of-working-on-a-rotten-codebase/</link><guid isPermaLink="true">https://shaiyallin.com/post/the-hidden-benefits-of-working-on-a-rotten-codebase/</guid><description>Working on bad code makes you better at writing good code</description><pubDate>Sun, 19 May 2024 00:00:00 GMT</pubDate></item><item><title>Shift-Left and The Pitfalls of Overplanning</title><link>https://shaiyallin.com/post/shift-left-and-the-pitfalls-of-overplanning/</link><guid isPermaLink="true">https://shaiyallin.com/post/shift-left-and-the-pitfalls-of-overplanning/</guid><description>PMs make overly detailed plans without dev feedback, resulting in waste. Shorten cycle time by planning briefly then develop and iterate.</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><category>software-engineering</category><category>lean</category></item><item><title>Unit Tests Considered Harmful</title><link>https://shaiyallin.com/post/unit-tests-considered-harmful/</link><guid isPermaLink="true">https://shaiyallin.com/post/unit-tests-considered-harmful/</guid><description>Unit tests couple us to implementation detail, restrict refactoring and don&apos;t assert that features work. Prefer bigger-scoped tests.</description><pubDate>Tue, 02 Apr 2024 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category><category>fear-of-change</category></item><item><title>Not The Design We Want, The Design We Deserve</title><link>https://shaiyallin.com/post/not-the-design-we-want-the-design-we-deserve/</link><guid isPermaLink="true">https://shaiyallin.com/post/not-the-design-we-want-the-design-we-deserve/</guid><description>Upfront design often results in over-engineering and a mismatch between design and reality; embrace Emergent Design to be truly flexible</description><pubDate>Tue, 26 Mar 2024 00:00:00 GMT</pubDate></item><item><title>Of Rigid Microservices and Flexible Monoliths </title><link>https://shaiyallin.com/post/of-rigid-microservices-and-flexible-monoliths/</link><guid isPermaLink="true">https://shaiyallin.com/post/of-rigid-microservices-and-flexible-monoliths/</guid><description>Microservices incur significant overheads in costs of change, runtime and complexity. Start with a monolith and break it down when needed.</description><pubDate>Mon, 18 Mar 2024 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category></item><item><title>SomeEstimates</title><link>https://shaiyallin.com/post/someestimates/</link><guid isPermaLink="true">https://shaiyallin.com/post/someestimates/</guid><description>Estimates cost a lot and deliver little. To progress effectively, Focus on Trust, Information Flow, Mentorship and Cooperation.</description><pubDate>Mon, 25 Dec 2023 00:00:00 GMT</pubDate></item><item><title>Holistic Software Development</title><link>https://shaiyallin.com/post/holistic-software-development/</link><guid isPermaLink="true">https://shaiyallin.com/post/holistic-software-development/</guid><description>How Scrumfall creates a culture of Waste, Fear, Irrationality and Loss and how Holistic Software Development keeps us flexible and adaptable</description><pubDate>Thu, 14 Dec 2023 00:00:00 GMT</pubDate></item><item><title>Agile Isn&apos;t Dead, It Just Smells Funny</title><link>https://shaiyallin.com/post/agile-isn-t-dead-it-just-smells-funny/</link><guid isPermaLink="true">https://shaiyallin.com/post/agile-isn-t-dead-it-just-smells-funny/</guid><description>How the word &apos;Agile&apos; lost its meaning, and how to remain flexible and cultivate a culture of sustainable, holistic software development.</description><pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate></item><item><title>Case Study: Testing the Codium.AI VS Code Extension</title><link>https://shaiyallin.com/post/case-study-testing-the-codium-vs-code-extension/</link><guid isPermaLink="true">https://shaiyallin.com/post/case-study-testing-the-codium-vs-code-extension/</guid><description>How I wrote tests for a VS Code extension that relies on a React.js WebView as its UI, using Playwright, Mocha and some HTTP hacking</description><pubDate>Sun, 11 Jun 2023 00:00:00 GMT</pubDate><category>tdd</category><category>case-studies</category></item><item><title>Fake, Don&apos;t Mock</title><link>https://shaiyallin.com/post/fake-don-t-mock/</link><guid isPermaLink="true">https://shaiyallin.com/post/fake-don-t-mock/</guid><description>Fakes are complete implementations of an API used to replace IO-bound adapters with memory-bound doubles to facilitate Acceptance Testing</description><pubDate>Tue, 02 May 2023 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category></item><item><title>Learning Tests: better than benzos</title><link>https://shaiyallin.com/post/learning-tests-better-than-benzos/</link><guid isPermaLink="true">https://shaiyallin.com/post/learning-tests-better-than-benzos/</guid><description>Learning Tests are an easy and useful methodology for integration with new and unknown APIs, reducing stress and improving feedback times.</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>software-engineering</category><category>tdd</category></item><item><title>Flutter: a love story</title><link>https://shaiyallin.com/post/flutter-a-love-story/</link><guid isPermaLink="true">https://shaiyallin.com/post/flutter-a-love-story/</guid><description>How I learned Flutter to create an iOS app for usage during concerts with my band, using TDD and Acceptance Testing.</description><pubDate>Fri, 10 Mar 2023 00:00:00 GMT</pubDate><category>tdd</category><category>case-studies</category><category>side-project</category></item><item><title>Chronomatic: my side-project story</title><link>https://shaiyallin.com/post/chronomatic-my-side-project-story/</link><guid isPermaLink="true">https://shaiyallin.com/post/chronomatic-my-side-project-story/</guid><description>How I used React with TypeScript and Firebase to build my own client management system, using TDD and Acceptance Testing.</description><pubDate>Sun, 28 Aug 2022 00:00:00 GMT</pubDate><category>case-studies</category><category>tdd</category><category>side-project</category></item><item><title>Beautiful Object Builders in TypeScript</title><link>https://shaiyallin.com/post/beautiful-object-builders-in-typescript/</link><guid isPermaLink="true">https://shaiyallin.com/post/beautiful-object-builders-in-typescript/</guid><description>Fixture test data create stale and outdated data, and make tests unreliable. Object Builders are a better way, here&apos;s how to use them.</description><pubDate>Tue, 19 Jul 2022 00:00:00 GMT</pubDate><category>tdd</category><category>software-engineering</category></item><item><title>dotenv considered harmful</title><link>https://shaiyallin.com/post/dotenv-considered-harmful/</link><guid isPermaLink="true">https://shaiyallin.com/post/dotenv-considered-harmful/</guid><description>Relying on .env files couples your codebase to env vars, making your software harder to change. Here&apos;s how to decouple them.</description><pubDate>Tue, 21 Jun 2022 00:00:00 GMT</pubDate><category>software-engineering</category><category>rant</category></item><item><title>The Anatomy Of A Rotten Codebase</title><link>https://shaiyallin.com/post/the-anatomy-of-a-rotten-codebase/</link><guid isPermaLink="true">https://shaiyallin.com/post/the-anatomy-of-a-rotten-codebase/</guid><description>Code rots because we build too many features, too fast. Emergent Design is an effective way to fight code rot and make change easier.</description><pubDate>Tue, 05 Apr 2022 00:00:00 GMT</pubDate><category>software-engineering</category><category>rant</category><category>fear-of-change</category></item><item><title>Case Study: Versatile CraneView Refactoring</title><link>https://shaiyallin.com/post/case-study-versatile-craneview-refactoring/</link><guid isPermaLink="true">https://shaiyallin.com/post/case-study-versatile-craneview-refactoring/</guid><description>How I helped Versatile remove fear of change in a key subsystem by introducing TDD and refactoring to Hexagonal Architecture.</description><pubDate>Wed, 05 Jan 2022 00:00:00 GMT</pubDate><category>case-studies</category><category>tdd</category><category>fear-of-change</category></item><item><title>The woes of a Mac migration</title><link>https://shaiyallin.com/post/the-woes-of-a-mac-migration/</link><guid isPermaLink="true">https://shaiyallin.com/post/the-woes-of-a-mac-migration/</guid><description>Update, January 2022:Shortly after publishing this post the Mac failed to connect to the display. Through a friend who works at Apple I got to a person who maintains the Thunderbolt firmware on Macbooks, and apparently the problem was caused by a combination of two issues; the first issue being a physical breakage in the Thunderbolt cable affecting only half of the wires inside, and the second being that Intel-based Macs can still manage to negotiate a Thunderbolt connection with only half of th</description><pubDate>Fri, 10 Dec 2021 00:00:00 GMT</pubDate></item><item><title>Your Software as a Kitchen</title><link>https://shaiyallin.com/post/your-software-as-a-kitchen/</link><guid isPermaLink="true">https://shaiyallin.com/post/your-software-as-a-kitchen/</guid><description>When there are too many dirty pots and plates in the sink, it&apos;s impossible to clean them. It&apos;s the same with software and technical debt.</description><pubDate>Tue, 23 Nov 2021 00:00:00 GMT</pubDate><category>software-engineering</category><category>tdd</category><category>rant</category></item><item><title>Tzvika&apos;s Revenge&apos;s Revenge</title><link>https://shaiyallin.com/post/tzvika-s-revenge-s-revenge/</link><guid isPermaLink="true">https://shaiyallin.com/post/tzvika-s-revenge-s-revenge/</guid><description>Recovering a Pascal game I wrote at age 16, lost to a dead hard drive in the late 90s and resurrected from an ARJ archive twenty-some years later.</description><pubDate>Wed, 09 Jun 2021 00:00:00 GMT</pubDate><category>side-project</category></item><item><title>Litany Against Fear of Change</title><link>https://shaiyallin.com/post/litany-against-fear-of-change/</link><guid isPermaLink="true">https://shaiyallin.com/post/litany-against-fear-of-change/</guid><description>Written 56 years ago, the Litany Against Fear plays an important part in the novel Dune, allowing the protagonist to overcome his crippling feelings and go through difficult ordeals. Recently it dawned on me that it could be just as effective - and just as true - when dealing with fear of change in software systems. Let&apos;s go over the litany line by line and consider its meaning and implications.I must not fear changeChange is good. If your software doesn&apos;t change, it makes your life boring. It a</description><pubDate>Thu, 22 Apr 2021 00:00:00 GMT</pubDate><category>fear-of-change</category></item><item><title>Permanent Prototypes</title><link>https://shaiyallin.com/post/permanent-prototypes/</link><guid isPermaLink="true">https://shaiyallin.com/post/permanent-prototypes/</guid><description>Prototypes are a lie; when it&apos;s good enough for production, it *becomes* production. Here&apos;s how to make them easily maintainable.</description><pubDate>Mon, 01 Feb 2021 00:00:00 GMT</pubDate><category>fear-of-change</category><category>tdd</category><category>software-engineering</category></item><item><title>On Remote Pair-Programming</title><link>https://shaiyallin.com/post/on-remote-pair-programming/</link><guid isPermaLink="true">https://shaiyallin.com/post/on-remote-pair-programming/</guid><description>For the past few months I&apos;ve been working with a startup building a mobile app using #ReactNative. I last used #React back in 2016, and my most recent mobile development was in the joyful J2ME days of 2007, so I was a bit hesitant to dive into this codebase. Usually, I find my way around new codebases and technologies by #pairprogramming with an experienced colleague, but with COVID-19 and the Israeli lockdown I had to find a remote way to pair-program.The first solution I went with was Zoom scr</description><pubDate>Wed, 27 Jan 2021 00:00:00 GMT</pubDate></item><item><title>It&apos;s all about the maintenance, dummy</title><link>https://shaiyallin.com/post/it-s-all-about-the-maintenance-dummy/</link><guid isPermaLink="true">https://shaiyallin.com/post/it-s-all-about-the-maintenance-dummy/</guid><description>We spend most of our time maintaining software. Writing features we might need in the future is not only a waste of time, it makes your software harder to maintain.</description><pubDate>Wed, 16 Dec 2020 00:00:00 GMT</pubDate><category>fear-of-change</category><category>rant</category><category>software-engineering</category></item><item><title>Big Design Up-Front or Emergent Design? Hexagonal Architecture Gives Us Both</title><link>https://shaiyallin.com/post/big-design-up-front-or-emergent-design-hexagonal-architecture-gives-us-both/</link><guid isPermaLink="true">https://shaiyallin.com/post/big-design-up-front-or-emergent-design-hexagonal-architecture-gives-us-both/</guid><description>When we started coding the Orbs reference implementation in the Go programming language, we had several guidelines in mind: The code must be written outside-in using TDD The code must have bounded contexts, expressed as interfaces generated f</description><pubDate>Wed, 04 Nov 2020 00:00:00 GMT</pubDate><category>tdd</category><category>case-studies</category><category>software-engineering</category></item><item><title>Inside The Inner Hexagon: Component Tests</title><link>https://shaiyallin.com/post/inside-the-inner-hexagon-component-tests/</link><guid isPermaLink="true">https://shaiyallin.com/post/inside-the-inner-hexagon-component-tests/</guid><description>This blog post was originally published in the Orbs Engineering blog in 2018.My previous post described how the Go reference implementation of the Orbs Network blockchain protocol used Hexagonal Architecture to facilitate upfront design, while allowing the inner design of components inside the system to emerge via TDD. We left off with a promise to discuss Component Tests, as well as elaborating more about how to make use of the Hexagonal Architecture to deal with concurrency and flakiness. In t</description><pubDate>Wed, 04 Nov 2020 00:00:00 GMT</pubDate></item></channel></rss>