<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Remo H. Jansen</title>
    <description>The latest articles on DEV Community by Remo H. Jansen (@remojansen).</description>
    <link>https://dev.to/remojansen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F24875%2F8708b5ec-0a58-4900-9c87-6f5ab2540dd7.png</url>
      <title>DEV Community: Remo H. Jansen</title>
      <link>https://dev.to/remojansen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/remojansen"/>
    <language>en</language>
    <item>
      <title>When Code Gets Cheap, Verification Becomes Expensive: How AI changes the economics of software architecture</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Mon, 28 Sep 2026 21:52:55 +0000</pubDate>
      <link>https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632</link>
      <guid>https://dev.to/remojansen/when-code-gets-cheap-verification-becomes-expensive-how-ai-changes-the-economics-of-software-632</guid>
      <description>&lt;p&gt;Recently, I was having a conversation at work about how we should implement a feature. I was advocating for one particular approach, and one of the reasons I preferred it was that I thought it would be easier for AI agents to work with. The structure was more explicit, the possible states were easier to reason about, and it would give us better opportunities to automate verification and put guardrails around future changes.&lt;/p&gt;

&lt;p&gt;One of the stakeholders pushed back with a very reasonable point: we shouldn't design software a certain way simply because it is easier for AI agents. We should design it based on what is best for our users.&lt;/p&gt;

&lt;p&gt;I agree completely.&lt;/p&gt;

&lt;p&gt;But the conversation made me realise that there is an important part of my reasoning that I hadn't articulated well. I wasn't putting the AI agent ahead of the user. I was still trying to find the solution that gave us the best combination of user experience, reliability, simplicity, time to market, implementation cost, operational cost, and long-term maintainability. The fact that an agent could understand and verify the resulting system more easily was one of the variables in that equation, not the objective itself.&lt;/p&gt;

&lt;p&gt;That distinction matters because I think AI is changing the economics of software architecture in a way that we haven't fully absorbed yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of writing software is changing
&lt;/h2&gt;

&lt;p&gt;For decades, one of the biggest constraints in software development was the cost of producing software. Developers had to understand the problem, design the solution, write the code, review it, test it, debug it, and maintain it. Engineering capacity was scarce, so reducing the amount of implementation work required was extremely valuable.&lt;/p&gt;

&lt;p&gt;AI coding agents are changing this equation. They can generate implementations, write tests, refactor code, explore unfamiliar codebases, migrate APIs, and perform many other tasks at a speed that would have been difficult to achieve with humans alone.&lt;/p&gt;

&lt;p&gt;But there is an important asymmetry here: generating code is not the same thing as establishing that the code is correct.&lt;/p&gt;

&lt;p&gt;An agent can produce a thousand lines of code in minutes. That doesn't mean we can establish in minutes that those thousand lines correctly implement the desired behaviour, don't introduce regressions, preserve important invariants, and interact correctly with the rest of the system.&lt;/p&gt;

&lt;p&gt;This means that as the marginal cost of producing code decreases, another cost becomes relatively more important: the cost of verification.&lt;/p&gt;

&lt;p&gt;And verification isn't something we pay for once.&lt;/p&gt;

&lt;p&gt;We verify software when we initially build it. We verify it when we change it. We verify it when we refactor it. We verify it when dependencies change. We verify it when another feature interacts with it. We verify it when an AI agent modifies it. We verify it when a bug is fixed. We verify it when we migrate data. We verify it when we upgrade infrastructure.&lt;/p&gt;

&lt;p&gt;Implementation costs are often largely one-off. Verification costs are recurrent.&lt;/p&gt;

&lt;p&gt;That changes the architectural equation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation cost is not the whole cost
&lt;/h2&gt;

&lt;p&gt;Imagine that we have two possible implementations for the same feature.&lt;/p&gt;

&lt;p&gt;Solution A costs $100,000 to implement, but because the architecture doesn't provide strong guarantees, every subsequent change requires significant testing, review, and regression checking.&lt;/p&gt;

&lt;p&gt;Solution B costs $120,000 to implement, but the architecture makes many invalid states impossible and gives us strong automated guarantees about the behaviour of the system.&lt;/p&gt;

&lt;p&gt;If we only look at implementation cost, Solution A appears cheaper.&lt;/p&gt;

&lt;p&gt;But software doesn't stop costing money when the initial implementation is complete.&lt;/p&gt;

&lt;p&gt;If Solution A requires an additional $20,000 every year in verification and regression work while Solution B requires only $5,000, then the initial $20,000 saving disappears very quickly. Over the lifetime of the system, the more expensive implementation can become the cheaper system.&lt;/p&gt;

&lt;p&gt;The exact numbers aren't important. The important thing is that verification is recurrent.&lt;/p&gt;

&lt;p&gt;This is why I think we need to start treating &lt;strong&gt;verifiability as an architectural concern&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When comparing two architectures, we shouldn't only ask how much they cost to build. We should also ask how cheaply and reliably we can establish that they are correct over the lifetime of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification isn't just testing
&lt;/h2&gt;

&lt;p&gt;When I talk about verification, I don't mean that we should simply write more tests.&lt;/p&gt;

&lt;p&gt;Tests are extremely useful, but there is a more powerful form of verification: designing the system so that certain classes of incorrect behaviour cannot happen in the first place.&lt;/p&gt;

&lt;p&gt;There is a huge difference between saying, "We have tests that check this invalid state doesn't happen" and saying, "This invalid state cannot be represented by the system."&lt;/p&gt;

&lt;p&gt;The latter is an architectural property.&lt;/p&gt;

&lt;p&gt;Strong types are a simple example. If a function accepts a &lt;code&gt;UserId&lt;/code&gt; rather than an arbitrary string, the type system can eliminate an entire class of mistakes before the program runs. Database constraints can prevent invalid relationships. State machines can restrict which transitions are possible. Schemas can prevent malformed data from entering a system. Idempotency can eliminate entire classes of duplicate-operation bugs. Explicit boundaries can reduce the number of possible interactions between components.&lt;/p&gt;

&lt;p&gt;In each case, we are moving some of the burden of verification away from humans and tests and into the structure of the system itself.&lt;/p&gt;

&lt;p&gt;The system becomes easier to verify because the system itself provides guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  A database can become part of the state machine
&lt;/h2&gt;

&lt;p&gt;Consider a workflow where a piece of data moves through several states.&lt;/p&gt;

&lt;p&gt;Perhaps it starts as &lt;code&gt;Created&lt;/code&gt;, then becomes &lt;code&gt;Validated&lt;/code&gt;, then &lt;code&gt;Processed&lt;/code&gt;, and finally &lt;code&gt;Completed&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One way to implement this is with a single event table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WorkflowEvents

id
workflow_id
event_type
payload
created_at
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application then needs to determine whether a particular event is valid given the previous state. The code needs to understand which transitions are allowed, whether the previous event exists, whether the payload is valid for the event type, and whether the workflow has reached an impossible state.&lt;/p&gt;

&lt;p&gt;We can write tests for all of this. We can write application-level validation. We can ask an AI agent to reason about the state machine. We can review the implementation.&lt;/p&gt;

&lt;p&gt;Another approach is to model the workflow more explicitly in the persistence layer. We could have event-specific structures where each stage references the previous stage through a foreign key, with schemas specific to that event.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Created
   ↓
Validated
   ↓
Processed
   ↓
Completed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Validated&lt;/code&gt; cannot exist without a corresponding &lt;code&gt;Created&lt;/code&gt;. &lt;code&gt;Processed&lt;/code&gt; cannot exist without the appropriate &lt;code&gt;Validated&lt;/code&gt; record. &lt;code&gt;Completed&lt;/code&gt; cannot exist without the preceding state.&lt;/p&gt;

&lt;p&gt;Each event can also have a schema that expresses the data required for that particular stage.&lt;/p&gt;

&lt;p&gt;Now the database isn't just storing the state of the workflow. It is helping enforce the workflow.&lt;/p&gt;

&lt;p&gt;We have effectively moved part of the finite-state machine into the persistence model.&lt;/p&gt;

&lt;p&gt;I'm not suggesting that this is always the right design. It introduces its own complexity and trade-offs, and there are many workflows where a simpler event table or a different state-machine implementation would be preferable. The important point is not that one particular architecture is universally superior.&lt;/p&gt;

&lt;p&gt;The important point is that &lt;strong&gt;the architectural choice changes the cost of verification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;With the first design, we may need to repeatedly establish through application logic and tests that invalid transitions cannot occur.&lt;/p&gt;

&lt;p&gt;With the second design, some invalid transitions simply cannot be persisted.&lt;/p&gt;

&lt;p&gt;That is a very different property.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make invalid states unrepresentable
&lt;/h2&gt;

&lt;p&gt;This is an old idea in software engineering, but AI makes it increasingly valuable.&lt;/p&gt;

&lt;p&gt;If we can make an invalid state unrepresentable, we don't need to repeatedly verify that nobody has accidentally created that state.&lt;/p&gt;

&lt;p&gt;Consider the difference between these two statements:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We have tests proving that this state should never happen."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The architecture makes this state impossible."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second statement is much more powerful.&lt;/p&gt;

&lt;p&gt;It means that a future developer doesn't need to remember the rule. A future refactor doesn't need to rediscover the rule. An AI agent doesn't need to infer the rule from a collection of tests and documentation. A code reviewer doesn't need to notice a subtle violation.&lt;/p&gt;

&lt;p&gt;The constraint is part of the system.&lt;/p&gt;

&lt;p&gt;This is what I mean when I talk about verification becoming an architectural concern. Architecture can determine not only what the system is capable of doing, but also what incorrect things the system is capable of doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI makes these properties more valuable
&lt;/h2&gt;

&lt;p&gt;This is where AI agents enter the picture, but I don't think the argument should be "design software for AI."&lt;/p&gt;

&lt;p&gt;The better argument is that AI increases the rate at which software can change.&lt;/p&gt;

&lt;p&gt;If the number of changes increases, the cost of verifying those changes becomes more important.&lt;/p&gt;

&lt;p&gt;Imagine two systems. In the first, every change requires a human to reconstruct a complicated mental model of the system and determine whether a subtle invariant has been preserved. In the second, the architecture expresses many of those invariants through types, schemas, constraints, contracts, and automated checks.&lt;/p&gt;

&lt;p&gt;The second system is not merely easier for an AI agent to work with. It is easier for everyone to work with.&lt;/p&gt;

&lt;p&gt;The agent benefits because it has stronger boundaries and clearer feedback. Developers benefit because there is less implicit behaviour to remember. Code reviewers benefit because more correctness properties are mechanically enforced. Operations benefit because fewer invalid states can reach production.&lt;/p&gt;

&lt;p&gt;AI simply makes the difference more visible because we are increasing the volume and speed of change.&lt;/p&gt;

&lt;p&gt;If AI can produce changes faster than humans can safely verify them, then architectures that reduce the cost of verification become increasingly valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification is a recurring cost
&lt;/h2&gt;

&lt;p&gt;This is probably the most important economic point.&lt;/p&gt;

&lt;p&gt;Suppose Architecture A costs 10% less to implement but requires significantly more effort to verify every time it changes.&lt;/p&gt;

&lt;p&gt;Architecture B costs 10% more to implement but gives us strong structural guarantees that dramatically reduce the cost of verification.&lt;/p&gt;

&lt;p&gt;If we only look at the initial project, Architecture A may look attractive.&lt;/p&gt;

&lt;p&gt;But software is not a project that ends when the feature ships. It is a system that continues changing for years.&lt;/p&gt;

&lt;p&gt;The implementation cost happens once. The verification cost happens again and again.&lt;/p&gt;

&lt;p&gt;Every feature built on top of the system pays some of that verification cost. Every refactor pays it. Every migration pays it. Every AI-generated change pays it.&lt;/p&gt;

&lt;p&gt;This creates a compounding effect.&lt;/p&gt;

&lt;p&gt;A small amount of additional complexity that buys a strong, reusable verification guarantee can potentially pay for itself many times over.&lt;/p&gt;

&lt;p&gt;This is why I think architecture discussions need to consider the lifetime economics of verification, rather than treating testing and verification as something that happens after architecture has already been decided.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification as a first-class quality attribute
&lt;/h2&gt;

&lt;p&gt;We already talk about architecture in terms of qualities such as performance, scalability, reliability, security, availability, and maintainability.&lt;/p&gt;

&lt;p&gt;I think we should increasingly ask another question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How verifiable is this system?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How easy is it to write tests?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How cheaply and reliably can we establish that this system is behaving correctly?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are different questions.&lt;/p&gt;

&lt;p&gt;A system can have excellent test coverage and still be difficult to verify. It might have complicated state transitions, implicit dependencies, weak contracts, highly coupled components, or many possible invalid states.&lt;/p&gt;

&lt;p&gt;Conversely, a system can be designed so that its structure itself provides useful guarantees.&lt;/p&gt;

&lt;p&gt;That could mean strong types. It could mean database constraints. It could mean explicit state machines. It could mean narrow interfaces, deterministic components, schemas, transactional boundaries, idempotent operations, or other forms of architectural constraint.&lt;/p&gt;

&lt;p&gt;The common property is that correctness becomes cheaper to establish.&lt;/p&gt;

&lt;h2&gt;
  
  
  This changes architecture trade-offs
&lt;/h2&gt;

&lt;p&gt;I think this also changes how we should evaluate competing solutions.&lt;/p&gt;

&lt;p&gt;Historically, we might ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Which solution is cheaper to build?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which one is simpler?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which one performs better?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which one is easier to maintain?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions still matter.&lt;/p&gt;

&lt;p&gt;But I think we should add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Which solution is cheaper to verify?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution makes more invalid states impossible?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution gives us stronger automated guarantees?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution makes regressions easier to detect?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution reduces the amount of behaviour that humans have to repeatedly reason about?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution gives automated agents better boundaries and feedback?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which solution reduces the blast radius of an incorrect change?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting thing is that these questions can change the answer.&lt;/p&gt;

&lt;p&gt;A solution that costs more to implement can be the economically better solution if it substantially reduces the recurring cost of verification.&lt;/p&gt;

&lt;p&gt;And this doesn't mean the most constrained architecture always wins. Constraints have costs too. Excessive constraints can make a system unnecessarily rigid, difficult to evolve, or more complicated than the problem warrants.&lt;/p&gt;

&lt;p&gt;The point is not to maximise constraints.&lt;/p&gt;

&lt;p&gt;The point is to recognise that &lt;strong&gt;constraints have economic value when they reduce the cost of establishing correctness&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question I now want to ask during architecture discussions
&lt;/h2&gt;

&lt;p&gt;Coming back to that conversation at work, I still agree with the stakeholder's principle: the user should come first.&lt;/p&gt;

&lt;p&gt;But I now think there is a missing dimension in how we reason about what is best for the user.&lt;/p&gt;

&lt;p&gt;The question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which architecture is easiest for the AI?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nor is it simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which architecture is cheapest to implement?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The question is closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Which architecture gives us the best overall outcome for the user, given the lifetime cost of building, operating, changing, and verifying the system?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer will be the simplest possible implementation.&lt;/p&gt;

&lt;p&gt;Sometimes it will be the architecture that is easiest for an AI agent to modify.&lt;/p&gt;

&lt;p&gt;Sometimes it will be an architecture with significantly more upfront complexity because that complexity gives us guarantees that would otherwise have to be repeatedly verified.&lt;/p&gt;

&lt;p&gt;And sometimes the right answer will be something completely different.&lt;/p&gt;

&lt;p&gt;The important thing is that &lt;strong&gt;verifiability is now part of the trade-off&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture should help us prove that it is correct
&lt;/h2&gt;

&lt;p&gt;AI-assisted development is often discussed in terms of how quickly we can produce software.&lt;/p&gt;

&lt;p&gt;I think that is only half of the story.&lt;/p&gt;

&lt;p&gt;If AI makes implementation dramatically cheaper, then our scarce resource increasingly becomes the ability to establish that what we produced is correct.&lt;/p&gt;

&lt;p&gt;That means the architecture of a system is no longer just about making the desired behaviour possible. It is also about making incorrect behaviour difficult to express, easy to detect, and cheap to rule out.&lt;/p&gt;

&lt;p&gt;The most interesting architectural decisions may therefore be the ones that turn verification from a recurring human activity into a property of the system itself.&lt;/p&gt;

&lt;p&gt;Because the ultimate goal isn't to build software that AI can generate quickly.&lt;/p&gt;

&lt;p&gt;It's to build software that &lt;strong&gt;we can continuously establish is correct&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And if we can design the architecture so that the system helps us do that, then verification stops being something we bolt onto the end of development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It becomes part of the architecture.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>discuss</category>
      <category>agents</category>
    </item>
    <item>
      <title>Do We Still Need Code Reviews in the Age of Coding Agents?</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sun, 27 Sep 2026 08:25:14 +0000</pubDate>
      <link>https://dev.to/remojansen/do-we-still-need-code-reviews-in-the-age-of-coding-agents-31eg</link>
      <guid>https://dev.to/remojansen/do-we-still-need-code-reviews-in-the-age-of-coding-agents-31eg</guid>
      <description>&lt;p&gt;For most of my career, code review has been a fairly simple idea.&lt;/p&gt;

&lt;p&gt;One engineer writes some code, opens a pull request, and another engineer reviews it before it gets merged. The second engineer looks for bugs, questions design decisions, suggests improvements, and ultimately gives the team another level of confidence that the change is safe to ship.&lt;/p&gt;

&lt;p&gt;It is such a normal part of software development that we rarely stop to question the assumptions behind it.&lt;/p&gt;

&lt;p&gt;One of those assumptions is that &lt;strong&gt;another engineer wrote the code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That assumption is becoming less reliable.&lt;/p&gt;

&lt;p&gt;Today, a coding agent can implement an entire feature, run the tests, fix failures, refactor the implementation, and prepare a pull request. The engineer who opens that pull request may have spent most of their time reviewing and directing the agent rather than writing the code themselves.&lt;/p&gt;

&lt;p&gt;This makes me wonder whether our traditional code review process still makes sense.&lt;/p&gt;

&lt;p&gt;Not because I think code review is obsolete. I think the opposite is true: &lt;strong&gt;we need verification more than ever.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But I think we need to change &lt;em&gt;how&lt;/em&gt; we think about code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was code review actually for?
&lt;/h2&gt;

&lt;p&gt;Before we decide what should happen to code review, it is worth asking what problem it was solving in the first place.&lt;/p&gt;

&lt;p&gt;When one engineer writes a change and another engineer reviews it, we get a second set of eyes. The reviewer might catch a bug the author missed, notice that an abstraction is wrong, identify an edge case, question an architectural decision, or simply ask why something was implemented in a particular way.&lt;/p&gt;

&lt;p&gt;There is also a social dimension to code review. It creates shared ownership and knowledge across a team. The code does not belong exclusively to the person who wrote it.&lt;/p&gt;

&lt;p&gt;All of that remains valuable.&lt;/p&gt;

&lt;p&gt;But not every part of the traditional process is equally valuable when the author is an AI agent.&lt;/p&gt;

&lt;p&gt;I have started thinking about coding agents as something like &lt;strong&gt;flawed peers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Imagine that you are a seasoned engineer and you have a very fast colleague who is capable of producing an enormous amount of code. They can work tirelessly, know an impressive amount about software development, and solve many problems very well. At the same time, they are inexperienced in your particular system and can occasionally make mistakes that seem obvious in hindsight.&lt;/p&gt;

&lt;p&gt;You would not blindly merge their work.&lt;/p&gt;

&lt;p&gt;You would review it.&lt;/p&gt;

&lt;p&gt;You would give them clear constraints.&lt;/p&gt;

&lt;p&gt;You would run automated checks.&lt;/p&gt;

&lt;p&gt;You might ask another specialist to look at particularly important changes.&lt;/p&gt;

&lt;p&gt;That sounds quite a lot like the agentic development workflow we are building now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineer opening the PR is already a reviewer
&lt;/h2&gt;

&lt;p&gt;This is where I think our traditional PR rules start to become interesting.&lt;/p&gt;

&lt;p&gt;Suppose a team has historically required one human review for every pull request.&lt;/p&gt;

&lt;p&gt;The traditional workflow looks something like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineer A writes the code → Engineer B reviews the code → merge.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now consider an agentic workflow:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent writes the code → Engineer A reviews the code → Engineer A opens the PR → merge.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If Engineer A has genuinely reviewed the implementation, understands the change, and is willing to take ownership of it, what exactly are we gaining from requiring another human to perform a second generic review?&lt;/p&gt;

&lt;p&gt;The PR being opened does not magically make the code more trustworthy.&lt;/p&gt;

&lt;p&gt;The meaningful event happened before that: an engineer examined the work and decided that they were prepared to own it.&lt;/p&gt;

&lt;p&gt;This is why I think we should be careful about treating approval counts as a proxy for quality.&lt;/p&gt;

&lt;p&gt;If your previous process required one review, I think there is a reasonable argument that an agent-generated change which has been thoroughly reviewed by the engineer opening the PR may not need another generic human approval.&lt;/p&gt;

&lt;p&gt;If your process required two human reviews, then perhaps the agent-generated change gets one human review by the owner and one additional human review after the PR is opened.&lt;/p&gt;

&lt;p&gt;The exact policy will depend on the risk of the system and the kind of change being made.&lt;/p&gt;

&lt;p&gt;The important part is the principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The number of approval buttons pressed is not the same thing as the amount of verification performed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust the engineer, get ownership in return
&lt;/h2&gt;

&lt;p&gt;There is also a cultural issue here.&lt;/p&gt;

&lt;p&gt;If an experienced engineer reviews an agent-generated change, opens the PR, and says "I am happy to own this", I think we should take that statement seriously.&lt;/p&gt;

&lt;p&gt;We often say that we want engineers to have ownership.&lt;/p&gt;

&lt;p&gt;But ownership without trust is difficult to achieve.&lt;/p&gt;

&lt;p&gt;If we tell engineers that they are responsible for the code but then require another person to validate every decision they make, we are creating a system where responsibility and authority do not quite match.&lt;/p&gt;

&lt;p&gt;I would rather move toward a model where we say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You reviewed it. You understand it. You own it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In return, we should expect engineers to take that responsibility seriously.&lt;/p&gt;

&lt;p&gt;This does not mean trusting every change equally. A production database migration, authentication change, or financial transaction workflow deserves a different verification strategy from a small UI change.&lt;/p&gt;

&lt;p&gt;It means that our process should respond to &lt;strong&gt;risk and uncertainty&lt;/strong&gt;, rather than blindly applying the same number of reviewers to every pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger problem is code volume
&lt;/h2&gt;

&lt;p&gt;There is another problem that I think is even more important.&lt;/p&gt;

&lt;p&gt;Coding agents make producing code dramatically cheaper.&lt;/p&gt;

&lt;p&gt;That is fantastic.&lt;/p&gt;

&lt;p&gt;It also creates a problem.&lt;/p&gt;

&lt;p&gt;If generating code becomes cheap enough, the amount of code produced can increase much faster than the amount of human attention available to review it.&lt;/p&gt;

&lt;p&gt;We cannot solve that problem simply by adding more reviewers.&lt;/p&gt;

&lt;p&gt;If an agent produces ten times more code and our answer is to have humans manually inspect ten times more code, we have simply moved the bottleneck from writing software to verifying software.&lt;/p&gt;

&lt;p&gt;Human attention is scarce.&lt;/p&gt;

&lt;p&gt;So we need to become much more selective about where we spend it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't review what you can make unrepresentable
&lt;/h2&gt;

&lt;p&gt;This is where architecture becomes a much more important part of code review.&lt;/p&gt;

&lt;p&gt;There are many classes of bugs where I would rather not depend on a reviewer noticing the problem.&lt;/p&gt;

&lt;p&gt;I would rather design the system so that the incorrect implementation is difficult or impossible to represent.&lt;/p&gt;

&lt;p&gt;Consider a database schema.&lt;/p&gt;

&lt;p&gt;If the database requires a value to satisfy a particular constraint, we don't need to rely entirely on every application developer remembering to validate that constraint correctly. The database can enforce it.&lt;/p&gt;

&lt;p&gt;Or consider a business workflow.&lt;/p&gt;

&lt;p&gt;If a process can only move from &lt;code&gt;Pending&lt;/code&gt; to &lt;code&gt;Approved&lt;/code&gt; or &lt;code&gt;Rejected&lt;/code&gt;, we can represent those states explicitly rather than allowing arbitrary strings and hoping that every piece of application code handles them correctly.&lt;/p&gt;

&lt;p&gt;Finite state machines are a good example of this approach. The architecture itself describes which transitions are valid and which are not.&lt;/p&gt;

&lt;p&gt;The same idea applies to types, contracts, API boundaries, validation, generated code, static analysis, automated tests, and many other forms of explicitness.&lt;/p&gt;

&lt;p&gt;The goal is not to make developers more careful.&lt;/p&gt;

&lt;p&gt;The goal is to &lt;strong&gt;make certain mistakes impossible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That changes the economics of code review.&lt;/p&gt;

&lt;p&gt;Instead of asking a human to inspect every line and think about every possible failure mode, we can move some classes of verification into the system itself.&lt;/p&gt;

&lt;p&gt;The reviewer can then spend their limited cognitive capacity on the things that actually require human judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification becomes a layered system
&lt;/h2&gt;

&lt;p&gt;This suggests a different model for reviewing agent-generated code.&lt;/p&gt;

&lt;p&gt;At the bottom, we have constraints and architecture that prevent entire classes of incorrect implementations.&lt;/p&gt;

&lt;p&gt;Above that, we have automated verification: type checking, tests, static analysis, security scanners, contract tests, database constraints, CI checks, and whatever else is appropriate for the system.&lt;/p&gt;

&lt;p&gt;Then we have the engineer who reviews the change and takes ownership.&lt;/p&gt;

&lt;p&gt;And for changes where we want additional confidence, we can add another layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adversarial agents.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What if the reviewers were agents too?
&lt;/h2&gt;

&lt;p&gt;We don't necessarily have to choose between one human review and three human reviews.&lt;/p&gt;

&lt;p&gt;We can introduce specialized agents whose job is not to approve the code, but to try to find reasons why we should not trust it.&lt;/p&gt;

&lt;p&gt;Imagine an agent whose only responsibility is security.&lt;/p&gt;

&lt;p&gt;It reviews the change and asks questions such as: "Can this input be manipulated? Did we introduce an authorization bypass? Are there new injection opportunities? Did this change expose something that should remain private?"&lt;/p&gt;

&lt;p&gt;Another agent might specialize in performance.&lt;/p&gt;

&lt;p&gt;It could look for expensive queries, unnecessary allocations, N+1 database access, contention, excessive network calls, or other performance problems.&lt;/p&gt;

&lt;p&gt;We could have agents specializing in reliability, backwards compatibility, API design, testing, accessibility, architecture, or whatever concerns are particularly important to a given system.&lt;/p&gt;

&lt;p&gt;The important part is that these agents have &lt;strong&gt;specialized responsibilities&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I don't want ten generic agents saying "LGTM."&lt;/p&gt;

&lt;p&gt;I want adversarial agents trying to break my confidence in the implementation.&lt;/p&gt;

&lt;p&gt;The security agent should be trying to find a security problem. The performance agent should be trying to find a performance problem. The architecture agent should be trying to find an architectural violation.&lt;/p&gt;

&lt;p&gt;And, just like the coding agent, we should remember that these are flawed peers.&lt;/p&gt;

&lt;p&gt;A security agent does not prove that our application is secure. A performance agent does not prove that the system is fast.&lt;/p&gt;

&lt;p&gt;They provide another independent attempt to find problems.&lt;/p&gt;

&lt;p&gt;That can still be extremely valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  More verification without a longer delivery cycle
&lt;/h2&gt;

&lt;p&gt;This gives us an interesting alternative to the traditional approach.&lt;/p&gt;

&lt;p&gt;Today, if a change is considered important, we might respond by adding more human reviewers.&lt;/p&gt;

&lt;p&gt;That increases the amount of human attention required and can increase the time it takes to get the change through the development process.&lt;/p&gt;

&lt;p&gt;In an agentic workflow, we have another option.&lt;/p&gt;

&lt;p&gt;We can increase the amount of verification without necessarily increasing the number of humans involved.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Coding Agent
     |
     v
Engineer reviews and takes ownership
     |
     +------&amp;gt; Security Agent
     |
     +------&amp;gt; Performance Agent
     |
     +------&amp;gt; Architecture Agent
     |
     +------&amp;gt; Testing Agent
     |
     v
Automated verification
     |
     v
Merge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not every change needs every agent.&lt;/p&gt;

&lt;p&gt;A documentation change probably does not need a performance review. A database migration probably deserves more scrutiny than changing a button label.&lt;/p&gt;

&lt;p&gt;The important thing is that verification can become &lt;strong&gt;composable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can assemble the verification pipeline according to the risk of the change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code review at scale
&lt;/h2&gt;

&lt;p&gt;This leads me to a slightly different way of thinking about code review.&lt;/p&gt;

&lt;p&gt;The answer to having more generated code is not necessarily to review more code.&lt;/p&gt;

&lt;p&gt;It is to make &lt;strong&gt;less code require human review&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We can do that in several ways.&lt;/p&gt;

&lt;p&gt;We can use architecture and constraints to make certain incorrect implementations unrepresentable.&lt;/p&gt;

&lt;p&gt;We can use automation to verify things that machines are better at checking than humans.&lt;/p&gt;

&lt;p&gt;We can use specialized adversarial agents to search for specific categories of problems.&lt;/p&gt;

&lt;p&gt;And then we can use human engineers for the decisions where human judgment actually matters.&lt;/p&gt;

&lt;p&gt;Does this solve the right problem?&lt;/p&gt;

&lt;p&gt;Is this the right abstraction?&lt;/p&gt;

&lt;p&gt;Does this fit the architecture?&lt;/p&gt;

&lt;p&gt;Are the trade-offs appropriate?&lt;/p&gt;

&lt;p&gt;Does this behavior make sense for the business?&lt;/p&gt;

&lt;p&gt;Is this something we actually want to own and operate?&lt;/p&gt;

&lt;p&gt;Those are difficult questions to reduce to a simple automated check.&lt;/p&gt;

&lt;p&gt;Checking whether a database column is nullable is not.&lt;/p&gt;

&lt;p&gt;Checking whether an API contract is backwards compatible is often automatable.&lt;/p&gt;

&lt;p&gt;Checking whether every state transition is valid can be encoded into a state machine.&lt;/p&gt;

&lt;p&gt;The more of these things we can move out of human cognition, the more effectively humans can review the things that remain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The PR isn't dead
&lt;/h2&gt;

&lt;p&gt;I don't think code reviews are going away.&lt;/p&gt;

&lt;p&gt;I think the &lt;strong&gt;meaning of a code review is changing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When humans wrote most of the code, the natural workflow was for another human to inspect the author's work.&lt;/p&gt;

&lt;p&gt;When agents write most of the code, the engineer's role becomes less about being the person who typed the implementation and more about being the person who understands it, verifies it, and takes responsibility for it.&lt;/p&gt;

&lt;p&gt;That doesn't mean we should blindly trust agents.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;It means we should build better verification systems around them.&lt;/p&gt;

&lt;p&gt;Some verification should happen through architecture. Some through constraints. Some through automation. Some through specialized adversarial agents. And some through experienced engineers exercising judgment.&lt;/p&gt;

&lt;p&gt;The goal shouldn't be to remove verification in order to move faster.&lt;/p&gt;

&lt;p&gt;The goal should be to &lt;strong&gt;increase verification while reducing the amount of expensive human attention required for it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Maybe the question for the agentic era isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many engineers need to review this PR?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe it is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What is the cheapest reliable way to gain confidence in this change?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the answer will still be another human.&lt;/p&gt;

&lt;p&gt;Sometimes it will be an agent.&lt;/p&gt;

&lt;p&gt;Sometimes it will be a test, a type, a database constraint, or an architectural decision that makes the bug impossible.&lt;/p&gt;

&lt;p&gt;And sometimes, if an experienced engineer has already reviewed the work and is willing to own it, perhaps the answer is simply to trust them.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>coding</category>
    </item>
    <item>
      <title>Revisiting the Toyota Production System (TPS) in the Age of Coding Agents</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Wed, 23 Sep 2026 23:36:43 +0000</pubDate>
      <link>https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5</link>
      <guid>https://dev.to/remojansen/revisiting-the-toyota-production-system-tps-in-the-age-of-coding-agents-2bb5</guid>
      <description>&lt;p&gt;Software has borrowed a surprising amount from manufacturing. Not from manufacturing in the sense of “let’s put programmers on an assembly line.” Thankfully, we’ve tried enough variations of that idea already.&lt;/p&gt;

&lt;p&gt;I mean something more interesting.&lt;/p&gt;

&lt;p&gt;Some of the most influential ideas in modern software development came from looking at how Toyota transformed manufacturing. Lean Software Development, Kanban, limiting work in progress, reducing waste, optimizing flow, continuous improvement, pull systems—many of these ideas have a lineage that leads back to manufacturing.&lt;/p&gt;

&lt;p&gt;And at the center of that story is the Toyota Production System (TPS).&lt;/p&gt;

&lt;p&gt;Toyota describes TPS around two pillars: &lt;strong&gt;Jidoka&lt;/strong&gt; and &lt;strong&gt;Just-in-Time&lt;/strong&gt;. Jidoka is roughly “automation with a human touch”: when an abnormality is detected, the process stops rather than continuing to produce defective products. Just-in-Time is about producing what is needed, when it is needed, and in the amount needed.&lt;/p&gt;

&lt;p&gt;These ideas were developed for a world of physical products. But we are entering another period where software development is changing dramatically—and this time, the manufacturing analogy might be useful for a completely different reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  I. The Software Bottleneck Is Moving
&lt;/h2&gt;

&lt;p&gt;For most of the history of software development, producing software was expensive. Writing code took time. Understanding a codebase took time. Testing, debugging, and reviewing code all took time. Because developers are human, all of these activities were constrained by the number of humans available to perform them.&lt;/p&gt;

&lt;p&gt;We built processes around this constraint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDEs to make writing code faster&lt;/li&gt;
&lt;li&gt;Languages &amp;amp; Frameworks to make code easier to express&lt;/li&gt;
&lt;li&gt;CI Systems to automate testing&lt;/li&gt;
&lt;li&gt;Agile &amp;amp; Kanban to improve feedback loops and flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then coding agents arrived. Suddenly, the cost of producing code changed. An agent can read a codebase, modify dozens of files, run commands, inspect test results, make another change, and repeat the process without waiting for a human to type every line.&lt;/p&gt;

&lt;p&gt;The production capacity of software development can increase dramatically. But if an agent can produce changes faster than we can establish that those changes are correct, we have created a new bottleneck: &lt;strong&gt;Verification&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TRADITIONAL SOFTWARE

┌──────────────┐
│ Human writes │
│    code      │
└──────┬───────┘
       │
       ▼
┌──────────────┐
│ Verification │
└──────────────┘

Production and verification are relatively balanced.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI CODING AGENTS

┌──────────────────────────────┐
│                              │
│      CODE PRODUCTION         │
│                              │
│          ████████████        │
│          ████████████        │
│          ████████████        │
│                              │
└──────────────┬───────────────┘
               │
               ▼
        ┌──────────────┐
        │ VERIFICATION │
        │      █       │
        └──────────────┘

The factory produces faster than quality control can inspect.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is a manufacturing problem, and manufacturing has spent a very long time thinking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Looking at the Factory Floor Again
&lt;/h2&gt;

&lt;p&gt;The answer is not to blindly copy Toyota. Software has no physical inventory, no physical assembly line, and no truck waiting for parts. But the underlying challenges are identical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do you prevent defects?&lt;/li&gt;
&lt;li&gt;How do you detect problems as early as possible?&lt;/li&gt;
&lt;li&gt;What should happen when an abnormality occurs?&lt;/li&gt;
&lt;li&gt;How much unfinished work should be allowed to accumulate?&lt;/li&gt;
&lt;li&gt;How do you improve the production process rather than merely inspecting its output?&lt;/li&gt;
&lt;li&gt;How do you increase production speed without increasing the rate at which defects escape?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are the exact questions that led to modern manufacturing quality practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  III. Jidoka &amp;amp; The Software Andon Cord
&lt;/h2&gt;

&lt;p&gt;Of all the Toyota concepts, Jidoka is the most interesting for AI coding agents. The basic idea is simple: if a machine detects an abnormality, it stops. The objective isn’t simply to detect defective products at the end of the line—it is to prevent the production of more defective products in the first place by building quality directly into the process.&lt;/p&gt;

&lt;p&gt;A conventional automated system behaves like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Produce → Produce → Produce → Inspect → Discover Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jidoka aims for something different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Produce → Produce → Detect Abnormality → STOP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine an agent working on a task. It modifies several files sequentially. Tests pass until an important invariant breaks. A naïve agent continues attempting fixes randomly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Test failed. I’ll try another approach… and another… and another.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In doing so, it accumulates a massive amount of unverified state. A Jidoka-inspired agent behaves deliberately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Makes Change
       │
       ▼
  Verification
       │
       ▼
Abnormality Detected ──► STOP ──► Investigate ──► Fix ──► Verify ──► Continue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent should not merely be capable of stopping; it should be designed to stop.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Andon Cord
&lt;/h3&gt;

&lt;p&gt;Toyota uses an Andon signal to make abnormalities visible and draw immediate attention to the point of failure. While software already uses crude signals like failed CI builds or production alerts, AI agents allow us to make every invariant an Andon cord:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Type safety violated&lt;/li&gt;
&lt;li&gt;❌ API contract changed&lt;/li&gt;
&lt;li&gt;❌ Security policy violated&lt;/li&gt;
&lt;li&gt;❌ Migration is destructive&lt;/li&gt;
&lt;li&gt;❌ Test coverage dropped&lt;/li&gt;
&lt;li&gt;❌ Performance budget exceeded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The critical distinction is that the signal is not just a passive warning displayed on a dashboard; it is an active control mechanism. The agent loses permission to continue until the abnormality is resolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. Poka-yoke: Mistake-Proofing the Environment
&lt;/h2&gt;

&lt;p&gt;Poka-yoke focuses on using fail-safe mechanisms to avoid simple mistakes entirely. We tend to frame software verification as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How can we detect whether the agent made a mistake?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A far better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Can we make it impossible for the agent to make this particular mistake?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an agent needs to modify a database, giving it unrestricted access relies on post-hoc testing to catch dangerous operations. Designing a poka-yoke environment changes the interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────┐      ┌──────────────┐      ┌──────────────┐      ┌──────────────────┐
│ Agent │ ───► │ Database Tool│ ───► │ Policy Layer │ ───► │ Allowed Operation│
└───────┘      └──────────────┘      └──────────────┘      └──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A destructive operation simply isn’t available through the interface. The agent cannot execute it because the capability does not exist in that context.&lt;/p&gt;

&lt;p&gt;This applies equally to dependency installation, secret access, schema migrations, and permission changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Design Principle:&lt;/strong&gt; Don’t teach the agent not to make a mistake when you can design the system so the mistake cannot be made.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Quality at the Source &amp;amp; WIP Limits for Uncertainty
&lt;/h2&gt;

&lt;p&gt;An agent executing a dozen changes before running verification creates a massive search space when a failure inevitably occurs. Diagnosing which assumption failed becomes exponentially harder as unverified work accumulates.&lt;/p&gt;

&lt;p&gt;AI coding agents require a concept similar to Work-in-Progress (WIP) limits. Instead of tracking open tickets, we should limit the amount of unverified change in the system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Make Small Change
            │
            ▼
         Verify
            │
            ▼
    Make Another Change
            │
            ▼
         Verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consider an agent operating with a &lt;strong&gt;Verification Debt&lt;/strong&gt; budget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unchecked Invariant = +1&lt;/li&gt;
&lt;li&gt;Unvalidated Dependency = +1&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unverified Integration = +1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification Debt = 0&lt;/strong&gt;: Agent proceeds freely.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification Debt = 3&lt;/strong&gt;: Agent must verify before taking further actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification Debt = 5&lt;/strong&gt;: Agent is stopped completely.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  VI. The Economics of Inspection
&lt;/h2&gt;

&lt;p&gt;Not every verification step needs to carry the same execution cost. Cheap defects must be caught cheaply through a tiered inspection pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────────────────────────────────────┐
│              Syntax / Parsing             │  ◄── Fast / Cheap
├───────────────────────────────────────────┤
│               Type Checking               │
├───────────────────────────────────────────┤
│              Static Analysis              │
├───────────────────────────────────────────┤
│                Unit Tests                 │
├───────────────────────────────────────────┤
│               Contract Tests              │
├───────────────────────────────────────────┤
│             Integration Tests             │
├───────────────────────────────────────────┤
│              E2E / Behavioral             │
├───────────────────────────────────────────┤
│          Adversarial Verification         │  ◄── Slow / Expensive
└───────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If an agent references a non-existent function, it should not require a 45-minute integration suite to catch it. In a high-throughput environment where an agent generates dozens of candidate changes an hour, optimizing the verification loop itself is critical to preventing systemic bottlenecks.&lt;/p&gt;

&lt;h2&gt;
  
  
  VII. Process Control and Root-Cause Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Statistical Process Control
&lt;/h3&gt;

&lt;p&gt;In traditional manufacturing, quality control monitors the process, not just individual outputs. If an agent’s defect rate suddenly spikes, focusing only on single test failures misses system-level shifts (e.g., context window truncation, degraded model weights, altered tool behavior, or stale API specs).&lt;/p&gt;

&lt;p&gt;Tracking process-level metrics provides visibility into the health of the system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Target Baseline&lt;/th&gt;
&lt;th&gt;Out-of-Control State&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compile Failures / 1,000 Changes&lt;/td&gt;
&lt;td&gt;0.7%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test Failures / 1,000 Changes&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;8.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reverted Changes&lt;/td&gt;
&lt;td&gt;0.9%&lt;/td&gt;
&lt;td&gt;5.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Findings&lt;/td&gt;
&lt;td&gt;0.03%&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When metrics breach baseline thresholds, the relevant question isn’t “Is this code change bad?” but “Has the production process itself gone out of control?”&lt;/p&gt;

&lt;h3&gt;
  
  
  Human Review Shifts Upward
&lt;/h3&gt;

&lt;p&gt;When an engineer oversees dozens of autonomous agents, manual line-by-line code review becomes impossible. The human role shifts from reviewing individual diffs to evaluating the integrity of the generation process: verification coverage, failure patterns, architectural invariants, and root causes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kaizen (Continuous Improvement)
&lt;/h3&gt;

&lt;p&gt;When a failure occurs, the agentic loop should produce process knowledge rather than simply retrying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Test Fails ──► Containment ──► Identify Abnormality ──► Root-Cause Hypothesis ──► Fix &amp;amp; Regression Protection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every failure should permanently update the system constraints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent Task Fails (Stale API Docs)
              │
              ▼
    Add Contract Test
              │
              ▼
   Update Agent Constraint
              │
              ▼
  Improved Production System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  VIII. End-to-End Traceability
&lt;/h2&gt;

&lt;p&gt;When a defect manifests in production months after deployment, tracing its origin in an agent-generated codebase requires a complete provenance chain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirement → Agent Session → Model/Version → Context &amp;amp; Tools → Verification Logs → Human Approval → Commit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Understanding defect origin shifts our diagnosis from “Who wrote this code?” to “What production process generated this code, and where did that process fail?”&lt;/p&gt;

&lt;h2&gt;
  
  
  IX. Conclusion: The Quality System Is the Deliverable
&lt;/h2&gt;

&lt;p&gt;The conversation around AI coding agents focuses heavily on the agent itself: which model, which benchmark, which context window, which reasoning capabilities.&lt;/p&gt;

&lt;p&gt;These factors matter, but the system surrounding the agent will ultimately matter more. A mediocre agent operating inside an exceptional verification environment will consistently outperform a brilliant agent operating inside a weak one.&lt;/p&gt;

&lt;p&gt;The future of autonomous software engineering is less about building an AI that never makes mistakes, and more about building a production system in which mistakes are cheap, contained, visible, and quickly corrected.&lt;/p&gt;

&lt;p&gt;The first wave of Lean software development optimized for flow, reduced batch sizes, and shorter feedback loops. The next evolution will focus on verification. As production costs drop toward zero, quality engineering becomes the primary constraint.&lt;/p&gt;

&lt;p&gt;The most important question in modern software development is no longer “How do we build software faster?”&lt;/p&gt;

&lt;p&gt;It is: &lt;strong&gt;“How do we build a system that produces software extremely fast without letting defects escape just as fast?”&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Why the Best Software Advice Is the Hardest to Follow</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Tue, 22 Sep 2026 13:19:12 +0000</pubDate>
      <link>https://dev.to/remojansen/why-the-best-software-advice-is-the-hardest-to-follow-4kg8</link>
      <guid>https://dev.to/remojansen/why-the-best-software-advice-is-the-hardest-to-follow-4kg8</guid>
      <description>&lt;p&gt;Not all software advice is created equal. Some advice is practical. It tells you exactly what to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write small functions.&lt;/li&gt;
&lt;li&gt;Keep functions focused.&lt;/li&gt;
&lt;li&gt;Use constants instead of magic numbers.&lt;/li&gt;
&lt;li&gt;Give variables meaningful names.&lt;/li&gt;
&lt;li&gt;Keep your classes small.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of advice is useful because it is easy to understand, easy to teach, and easy to verify. You can look at a piece of code and ask: &lt;em&gt;Is this function too large? Is this a magic number? Is this constant named correctly?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is usually a relatively clear answer. And because this advice is so easy to follow, it tends to spread. Teams put it into coding standards. Linters enforce it. Code reviews check it. Developers learn it early in their careers. But there is another kind of advice. It is much harder to follow. And, in my experience, it is often much more valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two kinds of advice
&lt;/h2&gt;

&lt;p&gt;I think about software advice as belonging roughly to two categories. The first is &lt;strong&gt;practical advice&lt;/strong&gt;. It is close to black and white:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do this.&lt;br&gt;
Don't do that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second is &lt;strong&gt;judgment-based advice&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It doesn't give you a recipe. Instead, it gives you a principle that you have to interpret depending on the situation. It might even contradict another principle you have learned. This kind of advice is closer to a balance between two opposing forces. There isn't always a universally correct answer. And that's what makes it difficult.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical advice is easy to scale
&lt;/h2&gt;

&lt;p&gt;Take a piece of advice like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write small functions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's generally useful advice. A junior developer can understand it. A senior developer can teach it. A code reviewer can point at a 200-line function and say, "This should probably be split up."&lt;/p&gt;

&lt;p&gt;The same is true for advice such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't use magic numbers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use meaningful names.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep your classes focused.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are great pieces of advice because they reduce the number of decisions you need to make.&lt;/p&gt;

&lt;p&gt;You don't need years of experience to understand what they mean. You can learn them from a book, apply them tomorrow, and see an immediate improvement. This is one of the reasons books like &lt;em&gt;Clean Code&lt;/em&gt; became so influential. A large part of the advice is actionable.&lt;/p&gt;

&lt;p&gt;You can take a principle and immediately translate it into something you do while writing code. And that's valuable. But there is a danger. We can start confusing &lt;strong&gt;following good practices&lt;/strong&gt; with &lt;strong&gt;becoming a good engineer&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When advice stops being black and white
&lt;/h2&gt;

&lt;p&gt;Consider a different piece of advice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The wrong abstraction is more costly than duplication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sounds simple, but try turning it into a rule. Should I duplicate this code? Sometimes yes. Sometimes no.&lt;/p&gt;

&lt;p&gt;How much duplication is acceptable?&lt;/p&gt;

&lt;p&gt;How similar do two pieces of code need to be before they should be abstracted? What if they look similar today but are likely to evolve differently?&lt;/p&gt;

&lt;p&gt;What if the abstraction makes the current code more complicated but might save us from duplication later? There is no simple checklist that answers these questions. You need judgment. And judgment comes from experience. You have to have seen abstractions that worked well. You also have to have seen abstractions that turned into monsters.&lt;/p&gt;

&lt;p&gt;You need to experience the cost of changing an abstraction that was designed too early. You need to see duplication that was completely harmless. And you need to see duplication eventually become a maintenance nightmare. Only then does the advice start to become useful at a deeper level. It stops being a rule and becomes a &lt;strong&gt;way of thinking&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experience changes the meaning of advice
&lt;/h2&gt;

&lt;p&gt;This is something I find fascinating about software engineering. You can hear exactly the same advice at different stages of your career and understand something completely different each time. Early in your career, someone tells you: "Don't repeat yourself".&lt;/p&gt;

&lt;p&gt;You learn DRY. So you start looking for duplication everywhere. Two pieces of code look similar? Abstract them. A few parameters are repeated? Create a common object. Several classes have similar behavior? Create a base class. You are following the advice. Then, years later, you encounter another principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prefer duplication over the wrong abstraction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And suddenly DRY doesn't look so simple anymore. You realize that duplication isn't necessarily the problem.&lt;/p&gt;

&lt;p&gt;Sometimes duplication is the price you pay for keeping two concepts independent. Sometimes an abstraction creates more coupling than the duplication ever would have. Sometimes the best thing you can do is repeat yourself and wait until the domain tells you what the abstraction should actually be.&lt;/p&gt;

&lt;p&gt;The advice didn't change. &lt;strong&gt;Your ability to interpret it changed.&lt;/strong&gt; That's what experience gives you.&lt;/p&gt;

&lt;h2&gt;
  
  
  From rules to intuition
&lt;/h2&gt;

&lt;p&gt;There is a point in your career where you accumulate enough examples that you start recognizing patterns before you can fully articulate them. You look at an abstraction and something feels wrong. You can't immediately explain it. You might say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I don't think we should abstract this yet."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why? Maybe you've seen this exact situation before. Maybe you've experienced how these abstractions evolve. Maybe you recognize that two things that currently look identical are likely to change for completely different reasons.&lt;/p&gt;

&lt;p&gt;This is where intuition starts becoming important. Intuition in software engineering isn't magic. It isn't a replacement for thinking. It is often the result of accumulated experience.&lt;/p&gt;

&lt;p&gt;You've seen enough situations, failures, trade-offs, and consequences that your brain starts recognizing patterns automatically. The problem is that intuition is much harder to teach than a rule. I can teach you "Use small functions." in five minutes.&lt;/p&gt;

&lt;p&gt;I can't give you five minutes of advice that will make you understand &lt;strong&gt;when&lt;/strong&gt; a function is too large, &lt;strong&gt;why&lt;/strong&gt; it is too large, and &lt;strong&gt;when splitting it would actually make the code worse&lt;/strong&gt;. That requires experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable part of judgment-based advice
&lt;/h2&gt;

&lt;p&gt;There is another reason this kind of advice is difficult. Sometimes two pieces of good advice conflict. You might hear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep things simple.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don't duplicate code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Avoid premature abstraction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Encapsulate things that change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All of these can be good advice. But what happens when following one makes it harder to follow another? &lt;/p&gt;

&lt;p&gt;There is no compiler warning for this. There is no linter that can tell you which principle should win. You have to make a decision. And that decision depends on context.&lt;/p&gt;

&lt;p&gt;This is why experienced engineers can sometimes disagree about a piece of code while both having perfectly reasonable arguments. The disagreement isn't necessarily because one person knows the rules and the other doesn't.&lt;/p&gt;

&lt;p&gt;It may be because they're making different judgments about the future, the domain, the cost of change, or the risks involved. That's the gray area of software engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scrum is another interesting example
&lt;/h2&gt;

&lt;p&gt;I think the same distinction can be seen outside of code. Consider Scrum and the Agile Manifesto. Scrum gives you something concrete. Roles, Events, Artifacts and Rules.&lt;/p&gt;

&lt;p&gt;A team can learn Scrum and start implementing it relatively quickly. That makes it attractive to organizations. There is something reassuring about being able to say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We are doing Scrum."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is a framework. There are defined practices. There are ceremonies you can schedule. There are artifacts you can create. There are things you can point to and say, "We're doing it."&lt;/p&gt;

&lt;p&gt;The Agile Manifesto is different. It gives you four values and twelve principles, but it doesn't give you a complete operating manual for running a software organization.&lt;/p&gt;

&lt;p&gt;It tells you things like valuing individuals and interactions over processes and tools, and responding to change over following a plan. Those statements require interpretation. They require judgment.&lt;/p&gt;

&lt;p&gt;For example, valuing individuals and interactions over processes doesn't mean processes are useless. Responding to change doesn't mean planning is useless.&lt;/p&gt;

&lt;p&gt;The interesting question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which one do I follow?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The interesting question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I apply these principles in this particular situation?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that is much harder. You can implement Scrum without necessarily developing the judgment behind Agile.&lt;/p&gt;

&lt;p&gt;You can have all the ceremonies, all the boards, all the roles, and all the terminology and still miss the underlying principles.&lt;/p&gt;

&lt;p&gt;That's the difference between &lt;strong&gt;following a framework&lt;/strong&gt; and &lt;strong&gt;understanding the principles behind it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the easy advice wins
&lt;/h2&gt;

&lt;p&gt;There is a natural reason practical advice dominates.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is measurable.&lt;/li&gt;
&lt;li&gt;It is teachable.&lt;/li&gt;
&lt;li&gt;It is reviewable.&lt;/li&gt;
&lt;li&gt;It is scalable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A company can create a coding standard that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Functions should be small.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is much harder to create a standard that says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use your accumulated experience and judgment to determine the appropriate level of abstraction for the current domain and its likely future changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first can become a rule. The second requires a person who knows what they're doing. Organizations naturally prefer things that can be turned into rules. And this isn't necessarily bad. Practical advice is extremely useful. The problem starts when we believe that collecting enough practical rules will eventually give us good judgment.&lt;/p&gt;

&lt;p&gt;It doesn't work that way. Knowing more rules doesn't automatically make you better at making trade-offs. At some point, you need to develop the ability to decide &lt;strong&gt;which rule matters in this situation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardest advice may be the most valuable
&lt;/h2&gt;

&lt;p&gt;This is why I think some of the most valuable software advice is also the hardest to follow.&lt;/p&gt;

&lt;p&gt;It doesn't tell you exactly what to do.&lt;/p&gt;

&lt;p&gt;It makes you think. It gives you a lens through which you can look at a problem. It might even force you to balance two competing ideas. And initially, that can be frustrating. We want software engineering to have recipes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tell me the right architecture.&lt;/li&gt;
&lt;li&gt;Tell me when to abstract.&lt;/li&gt;
&lt;li&gt;Tell me how big a function should be.&lt;/li&gt;
&lt;li&gt;Tell me exactly when to introduce a design pattern.&lt;/li&gt;
&lt;li&gt;Tell me the correct process for building software.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But software is built in contexts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different teams. &lt;/li&gt;
&lt;li&gt;Different domains. &lt;/li&gt;
&lt;li&gt;Different constraints. &lt;/li&gt;
&lt;li&gt;Different people. &lt;/li&gt;
&lt;li&gt;Different levels of uncertainty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more experience you gain, the more you realize that many of the most important engineering decisions don't have a universally correct answer. They require judgment. And judgment is difficult because &lt;strong&gt;you have to own the decision&lt;/strong&gt;. There is no checklist to hide behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe that's the real progression
&lt;/h2&gt;

&lt;p&gt;Perhaps becoming a better software engineer isn't about replacing bad rules with better rules. Maybe it's about gradually moving from rules toward principles.&lt;/p&gt;

&lt;p&gt;From:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I was told to do this."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I understand why this is usually useful."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and eventually to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I understand the trade-off, and I can decide whether it applies here."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a much harder skill to develop. But once you develop it, practical advice becomes even more useful. You don't stop using the rules. You understand them better. You know when to follow them. You know when two rules conflict. And, perhaps most importantly, you know when &lt;strong&gt;not&lt;/strong&gt; to follow them. That is where experience turns advice into wisdom.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do you think?
&lt;/h2&gt;

&lt;p&gt;I'm curious about your experience. &lt;strong&gt;What is the most pointless practical software advice you've encountered in your career?&lt;/strong&gt; And on the other side: &lt;strong&gt;What is the most valuable piece of judgment-based advice you've learned?&lt;/strong&gt; The kind of advice that didn't give you a rule to follow, but changed the way you think about software engineering.&lt;/p&gt;

&lt;p&gt;I'd love to hear your examples in the comments.&lt;/p&gt;

</description>
      <category>software</category>
      <category>career</category>
      <category>learning</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Scrum is finally dead 🎉 and we have to thank Coding Agents for that</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:55:21 +0000</pubDate>
      <link>https://dev.to/remojansen/scrum-is-finally-dead-and-we-have-to-thank-coding-agents-for-that-18bi</link>
      <guid>https://dev.to/remojansen/scrum-is-finally-dead-and-we-have-to-thank-coding-agents-for-that-18bi</guid>
      <description>&lt;h2&gt;
  
  
  The funeral nobody is sad about
&lt;/h2&gt;

&lt;p&gt;Let's be honest about something we've all been pretending not to notice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scrum is dead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And almost nobody is sad about it.&lt;/p&gt;

&lt;p&gt;We've spent twenty years standing in a circle every morning, moving tickets across a board, arguing about whether something is a 3 or a 5, and calling it "agility." We built an entire industry on top of it — certifications, coaches, tooling, dashboards. We turned a lightweight idea into a bureaucracy with a mascot.&lt;/p&gt;

&lt;p&gt;And deep down, most of us hated it.&lt;/p&gt;

&lt;p&gt;Here's the twist: the thing finally killing Scrum isn't a better methodology. It isn't a smarter framework with cleaner ceremonies. It's a &lt;strong&gt;capability shift&lt;/strong&gt;. Coding agents have made the original promise of the Agile Manifesto — the actual promise, not the ritual we replaced it with — physically possible for the first time.&lt;/p&gt;

&lt;p&gt;Scrum won because it was &lt;em&gt;followable&lt;/em&gt;, not because it was right. And now something has come along that makes the right thing followable too.&lt;/p&gt;

&lt;p&gt;So this is a eulogy. But bring confetti.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manifesto was correct — and that's exactly why it failed
&lt;/h2&gt;

&lt;p&gt;Here's the part people get wrong.&lt;/p&gt;

&lt;p&gt;The Agile Manifesto wasn't wrong. It was &lt;strong&gt;right&lt;/strong&gt;. Read it again today and it still reads like common sense written by people who had suffered.&lt;/p&gt;

&lt;p&gt;So why did it fail?&lt;/p&gt;

&lt;p&gt;It failed because it was right &lt;em&gt;in the wrong format&lt;/em&gt;. It gave us &lt;strong&gt;principles&lt;/strong&gt;. And principles are the single hardest thing in the world to get an organisation to actually follow.&lt;/p&gt;

&lt;p&gt;Think about the difference between a principle and a piece of practical advice.&lt;/p&gt;

&lt;p&gt;Practical advice can be followed by &lt;em&gt;anyone&lt;/em&gt;. "Stand up for fifteen minutes every morning." "Estimate your work in story points." "Work in two-week sprints." No judgment required. No experience required. Just compliance. You can teach it in an afternoon and audit it with a spreadsheet.&lt;/p&gt;

&lt;p&gt;Principles are different. "Deliver value continuously." "Trust motivated individuals to get the job done." "Reflect regularly and adjust." You cannot checklist your way to those. They require &lt;strong&gt;intuition, gut feeling, and accumulated experience&lt;/strong&gt;. You have to &lt;em&gt;earn&lt;/em&gt; the judgment to apply them, and that judgment doesn't arrive on a training course.&lt;/p&gt;

&lt;p&gt;And here is the uncomfortable truth about human beings:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are biased toward the practical over the principled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Give a large organisation a choice between a principle it has to internalise and a practice it can copy-paste, and it will pick the practice every single time. Not because people are stupid — because practices are &lt;em&gt;legible, teachable, auditable, and certifiable&lt;/em&gt;. Principles are none of those things. You can't put "developed good judgment" on a Jira board.&lt;/p&gt;

&lt;p&gt;So the market did what the market always does. It converted the principles into practices — and lost the soul in translation.&lt;/p&gt;

&lt;p&gt;Scrum &lt;em&gt;was&lt;/em&gt; that conversion.&lt;/p&gt;

&lt;p&gt;It took a set of values that required wisdom and repackaged them as ceremonies that required only attendance. That's the whole reason Scrum won and "being agile" lost: Scrum was followable. It asked nothing of your judgment. It just asked you to show up to the standup.&lt;/p&gt;

&lt;p&gt;This is exactly how Agile transformations fail. The gap between &lt;em&gt;principles&lt;/em&gt; and &lt;em&gt;practices&lt;/em&gt; is where every one of them goes to die. Leadership never commits to the principle; they adopt the artefact, misread it — the burndown chart becomes an obsession with output instead of a tool for reflection — and they end up with the precise opposite of what the Manifesto intended. A principle demands a missionary. A practice only needs a mercenary. And most organisations are staffed to hire mercenaries.&lt;/p&gt;

&lt;p&gt;So the real question was never "were the Agile values correct?" They were.&lt;/p&gt;

&lt;p&gt;The real question was: &lt;em&gt;how do you get an organisation to honour principles it doesn't have the collective experience to internalise?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For twenty years, the honest answer was: &lt;strong&gt;you can't. So here's Scrum instead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Manifesto didn't fail because it was too idealistic. It failed because it trusted us to have judgment — and judgment doesn't scale by memo. Scrum scaled by memo. That's the whole tragedy.&lt;/p&gt;

&lt;p&gt;Until now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The principle that just became literally true
&lt;/h2&gt;

&lt;p&gt;Look at one line from the Manifesto:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Business people and developers must work together daily throughout the project."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the principle everyone paid lip service to and absolutely nobody achieved.&lt;/p&gt;

&lt;p&gt;"Daily"? Come on. We got a fifteen-minute standup where a business stakeholder occasionally lurked, and a Slack channel where they dropped requirements like ransom notes. We put "collaboration" on the wall and then reintroduced every silo the Manifesto told us to tear down.&lt;/p&gt;

&lt;p&gt;Working together &lt;em&gt;daily&lt;/em&gt; was a principle. So of course we replaced it with a practice — a recurring meeting — and pretended that counted.&lt;/p&gt;

&lt;p&gt;Now watch what agents do to that sentence.&lt;/p&gt;

&lt;p&gt;For the first time in the history of this industry, &lt;strong&gt;business people and end users are the ones building.&lt;/strong&gt; Not describing. Not requesting. &lt;em&gt;Building.&lt;/em&gt; A domain expert who has never written a line of production code can now sit down with a coding agent and vibe-code the thing they actually want.&lt;/p&gt;

&lt;p&gt;So "work together daily" stops being a meeting you have to schedule and start resenting. It collapses into a single artefact: a &lt;strong&gt;working prototype&lt;/strong&gt;, produced by the person who understands the problem best.&lt;/p&gt;

&lt;p&gt;You don't need business and engineering in the same room every day if the business already handed you running software.&lt;/p&gt;

&lt;p&gt;The principle didn't get easier to follow. It stopped needing to be &lt;em&gt;followed&lt;/em&gt; at all — because the technology now executes it by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prototypes are the new requirements — and they're better than any ticket
&lt;/h2&gt;

&lt;p&gt;Think about the old chain of custody for an idea.&lt;/p&gt;

&lt;p&gt;Idea → Jira epic → refinement session → user story → acceptance criteria → estimate → sprint commitment → build → demo → &lt;em&gt;"...that's not what I meant."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every arrow in that chain is a place where value leaks out. Every handoff is a game of telephone played by people with different incentives and different vocabularies. By the time an idea reaches an engineer, it has been flattened into a ticket — a &lt;strong&gt;lossy proxy&lt;/strong&gt; for a conversation that a business person had with themselves weeks ago.&lt;/p&gt;

&lt;p&gt;The new chain is almost insultingly short.&lt;/p&gt;

&lt;p&gt;The end user vibe-codes the thing they actually want → they hand engineering a &lt;strong&gt;working form of requirements&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;And a working prototype is a &lt;em&gt;better&lt;/em&gt; requirement than any document we've ever produced. A spec &lt;em&gt;describes&lt;/em&gt;. A prototype &lt;em&gt;demonstrates&lt;/em&gt;. A spec says "the user should be able to filter the list." A prototype shows you exactly which filters, in what order, with what defaults, behaving in the specific way the person imagined but could never have written down.&lt;/p&gt;

&lt;p&gt;I've always believed we should listen to our customers' problems, not their solutions. That's still true — but a prototype reveals the real problem far better than a feature request ever could, because you get to see what they reached for when nobody was translating for them.&lt;/p&gt;

&lt;p&gt;This is executable discovery. It is the highest-fidelity requirement artefact we have ever had.&lt;/p&gt;

&lt;p&gt;Now — an important caveat, because I don't want to sell you snake oil. The prototype is &lt;strong&gt;not the product&lt;/strong&gt;. It's validated intent. It's a running, clickable, arguable statement of "this is what I mean." Engineering's job doesn't disappear. It &lt;em&gt;changes&lt;/em&gt; — from "figure out what they meant" to "make this real, safe, scalable, and correct."&lt;/p&gt;

&lt;p&gt;Which is a much better job than the one we had.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jira is dead too 🪦
&lt;/h2&gt;

&lt;p&gt;So let me ask the obvious question.&lt;/p&gt;

&lt;p&gt;If the requirement is a running prototype, what exactly is the backlog &lt;em&gt;for&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;The ticket was always a lossy proxy for a conversation and an intent. Agents let us skip the proxy entirely. And once you remove the proxy, an enormous amount of ceremony has nothing left to justify it.&lt;/p&gt;

&lt;p&gt;Here lies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sprint planning.&lt;/li&gt;
&lt;li&gt;Story points.&lt;/li&gt;
&lt;li&gt;Estimates.&lt;/li&gt;
&lt;li&gt;Burndown charts.&lt;/li&gt;
&lt;li&gt;Three-hour refinement marathons.&lt;/li&gt;
&lt;li&gt;Velocity dashboards nobody trusted anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Story points and Jira tickets were the ultimate practice-over-principle crutch. They were legible, auditable, and certifiable — which is &lt;em&gt;exactly&lt;/em&gt; why they metastasised across every engineering org on earth. They gave managers something to point at. They never gave customers anything.&lt;/p&gt;

&lt;p&gt;I've argued for years for no estimates, no time boxes, pull-based flow, and cost tracking over velocity tracking. Agents don't just make estimation &lt;em&gt;undesirable&lt;/em&gt; — they make it &lt;strong&gt;absurd&lt;/strong&gt;. Agent velocity is wildly unpredictable; a task that looks trivial takes six iterations, and a task that looks huge falls out in one prompt. Estimating that is superstition with a Fibonacci sequence attached.&lt;/p&gt;

&lt;p&gt;And let's say the quiet part out loud: a large chunk of the agile-industrial complex exists to manage a scarcity — human coding throughput — that is actively evaporating. When the bottleneck moves, the machinery built around the old bottleneck becomes theatre.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what actually replaces Scrum?
&lt;/h2&gt;

&lt;p&gt;Not another framework with new ceremonies. Please, not that.&lt;/p&gt;

&lt;p&gt;What replaces it is a &lt;strong&gt;capability-driven loop&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business people and end users turn intent into a prototype. Discovery becomes executable.&lt;/li&gt;
&lt;li&gt;Engineering steers, hardens, verifies, and integrates. The role shifts from typing to judgment.&lt;/li&gt;
&lt;li&gt;Everything is continuous, pull-based, and measured by outcomes rather than by sprints completed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice what happened to the silo wall. It didn't get a door. It &lt;em&gt;dissolved&lt;/em&gt;. Developers get pulled into discovery — because when implementation is cheap, understanding &lt;em&gt;what&lt;/em&gt; to build matters more than &lt;em&gt;how&lt;/em&gt;. And business people get pulled into building — because the tools finally let them.&lt;/p&gt;

&lt;p&gt;And look at what got &lt;em&gt;deleted&lt;/em&gt; in the process. Not automated — deleted. The whole tower of intermediaries that used to sit between the person with the problem and the person solving it. The business analyst who translated the need into a document. The scrum master who defended the ceremony. The project manager who maintained the Gantt chart. The proxy product owner who spoke for a user they'd never met. Layer after layer, each one added to compensate for the fact that the end user and the developer couldn't talk to each other directly.&lt;/p&gt;

&lt;p&gt;Now they can. So the layers have no reason to exist.&lt;/p&gt;

&lt;p&gt;This is where it gets interesting, because of Conway's law. Any system you build ends up mirroring the communication structure of the organisation that builds it. Stack up six layers of handoffs between the user and the code, and your software inherits all six — the seams, the misunderstandings, the compromises baked in at every translation. Conway's law never stops operating; you just get to choose how ugly the org chart it's copying is.&lt;/p&gt;

&lt;p&gt;When you collapse the distance to a single hop — end user to developer, mediated by an agent instead of a committee — Conway's law is still true, but its blast radius shrinks to almost nothing. There are barely any communication seams left for the software to inherit. The negative version of Conway's law fades not because we repealed it, but because we finally stopped feeding it layers.&lt;/p&gt;

&lt;p&gt;That's the Manifesto's cross-functional dream, except this time it isn't an aspiration you have to be disciplined enough to honour. It's just how the work flows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part: what could still go wrong
&lt;/h2&gt;

&lt;p&gt;I'm celebrating, but I'm not naïve. I have one rule about AI that I'll never let go of: &lt;strong&gt;it's an amplifier, not a corrector.&lt;/strong&gt; It accelerates whatever trajectory you're already on.&lt;/p&gt;

&lt;p&gt;So here's the sober bit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verification is the new bottleneck.&lt;/strong&gt; Anyone can now generate software that &lt;em&gt;works-ish&lt;/em&gt;. Proving that it's correct, secure, performant, and maintainable is the scarce skill — and it's a skill agents cannot be fully trusted to perform on themselves. Prototypes-as-requirements only works if engineering owns the hardening layer with total seriousness.&lt;/p&gt;

&lt;p&gt;Beware "good bad code" — code that is technically impressive but delivers no value, and its evil twin, code that looks fine and quietly ships a vulnerability. The vibe coders who ship without any verification will fail, and they'll fail fast. The winners are the ones who start with value &lt;em&gt;and&lt;/em&gt; invest enough in verification to sustain it.&lt;/p&gt;

&lt;p&gt;Killing Scrum removes a fake safety net. Sprints and story points never made your software correct; they just made your Gantt chart feel manageable. The real safety net — automated testing, security review, human judgment at the gate — now has to be built for real. The new failure mode isn't shipping slowly. It's shipping the wrong, unsafe thing &lt;em&gt;faster&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Which brings us to the developer identity shift I keep banging on about. Our profession has lived by "talk is cheap, show me the code." Code is our identity. Letting go of it is painful. But the job was never the typing. The job was the judgment. Agents don't take the judgment away — they make it the &lt;em&gt;only&lt;/em&gt; thing that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who wins and who's in denial
&lt;/h2&gt;

&lt;p&gt;The winners are the teams that let end users prototype, treat those prototypes as requirements, and reinvest all the capacity they just freed up into the two things that actually matter now: &lt;strong&gt;discovery and verification.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The ones in denial are the organisations bolting agents onto Scrum. Asking an agent to produce story-point estimates. Running AI-assisted standups. Generating Jira tickets that no human will ever read, to feed a process whose only job was to ration a scarcity that no longer exists.&lt;/p&gt;

&lt;p&gt;They will amplify their dysfunction — faster.&lt;/p&gt;

&lt;p&gt;You cannot AI-transform your way out of a methodology whose entire purpose was to ration something that isn't scarce anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manifesto wasn't wrong, just early
&lt;/h2&gt;

&lt;p&gt;The Agile Manifesto's promise was never a lie. It was &lt;strong&gt;early&lt;/strong&gt;. The values were correct; we just never had the technology to honour principles that demanded more judgment than an organisation could reliably muster. So we swapped the principles for practices, called the practices "agile," and spent two decades cosplaying the thing instead of living it.&lt;/p&gt;

&lt;p&gt;Coding agents change that — not by giving us a new set of rules to follow, but by letting a principle finally be &lt;em&gt;executed&lt;/em&gt; as a working artefact instead of admired as a poster on the wall.&lt;/p&gt;

&lt;p&gt;Scrum served its purpose. It taught a whole generation to work in small increments and to at least &lt;em&gt;look&lt;/em&gt; at their users. We can thank it for that. And then we can let it go.&lt;/p&gt;

&lt;p&gt;Because Scrum didn't lose an argument.&lt;/p&gt;

&lt;p&gt;It lost a job — now that business people and developers can, finally and literally, build together every day. 🎉&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>agents</category>
      <category>sdlc</category>
    </item>
    <item>
      <title>Turbocharge Coding Agents with Your Test Coverage</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:02:00 +0000</pubDate>
      <link>https://dev.to/remojansen/turbocharge-coding-agents-with-your-test-coverage-40dm</link>
      <guid>https://dev.to/remojansen/turbocharge-coding-agents-with-your-test-coverage-40dm</guid>
      <description>&lt;p&gt;The original title of this post was &lt;del&gt;&lt;em&gt;Turbocharge Your Test Coverage with Coding Agents&lt;/em&gt;&lt;/del&gt; but then I changed it because &lt;strong&gt;the real competitive advantage isn’t using AI to write tests. It’s using high test coverage to let coding agents move at maximum speed without breaking your system.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The traditional view of testing
&lt;/h3&gt;

&lt;p&gt;Most organisations still treat testing the old way. Tests ensure code quality. Tests catch bugs. Tests are a cost centre. We’ll add them when we have time.&lt;/p&gt;

&lt;p&gt;The result is painfully familiar. Low coverage creates fear of change. Fear of change produces slow delivery. Slow delivery frustrates teams. Frustrated teams feed a downward spiral of doom where everyone knows the codebase is brittle, yet nobody wants to touch it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The paradigm shift
&lt;/h3&gt;

&lt;p&gt;There’s a better way to think about this. Tests are not primarily about quality. They’re about speed.&lt;/p&gt;

&lt;p&gt;High test coverage is your licence to move fast. With low coverage the dominant question is always “Will this break something?” With high coverage it becomes “Let’s ship it.” Manual regression testing gives way to automated confidence. Fear of refactoring turns into fearless improvement. Slow, careful changes become fast, bold iterations.&lt;/p&gt;

&lt;p&gt;When the suite is solid, changing code stops feeling dangerous. That psychological shift is more valuable than any individual bug the tests happen to catch.&lt;/p&gt;

&lt;h3&gt;
  
  
  The AI speed paradox
&lt;/h3&gt;

&lt;p&gt;Without tests, coding agents create a new kind of bottleneck.&lt;/p&gt;

&lt;p&gt;You ask the agent to refactor a service. Seconds later it hands you the new code. Then the real work begins: hours spent manually verifying that nothing broke. The agent was fast. The human became the bottleneck again.&lt;/p&gt;

&lt;p&gt;AI generates code in seconds. You spend hours verifying it. Net productivity gain is often minimal, sometimes negative. Tests are the trust layer that unlocks the speed AI actually promises.&lt;/p&gt;

&lt;h3&gt;
  
  
  The competitive advantage
&lt;/h3&gt;

&lt;p&gt;Organisations that already have high test coverage and then add coding agents experience something different. They ship features three to five times faster. They refactor without anxiety. New developers onboard more quickly because the tests act as living documentation. Agents can carry the heavy lifting while humans stay focused on intent.&lt;/p&gt;

&lt;p&gt;Organisations that adopt AI without solid tests get the opposite outcome. The agents generate code that no one fully trusts. Everything still requires manual verification. Delivery barely accelerates. The AI investment is largely wasted.&lt;/p&gt;

&lt;p&gt;The difference isn’t the model. It’s the feedback loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spec-driven development
&lt;/h3&gt;

&lt;p&gt;This is where tests become more than verification. They become documentation of intent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RiskService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;calculatePremium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should apply 15% surcharge for high-risk categories&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// This IS the specification&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should throw ValidationError when coverage exceeds $10M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// This documents the business rule&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When tests are written this way, three quiet but powerful things happen.&lt;/p&gt;

&lt;p&gt;They become living documentation. The suite is always up to date—or the tests fail. It is executable, not just readable. It shows actual behaviour rather than intended behaviour.&lt;/p&gt;

&lt;p&gt;They create shared understanding. Developers who write the tests develop a deeper grasp of the requirements. Edge cases surface during design instead of in production.&lt;/p&gt;

&lt;p&gt;And they form a reliable refactoring safety net. The implementation can change freely as long as the behaviour remains correct. The specs keep the system honest.&lt;/p&gt;

&lt;h3&gt;
  
  
  What coding agents actually need
&lt;/h3&gt;

&lt;p&gt;For an autonomous coding agent to be useful, it needs four things.&lt;/p&gt;

&lt;p&gt;Clear goals—the specs (tests) define what success looks like.&lt;br&gt;&lt;br&gt;
A feedback mechanism—test results show progress.&lt;br&gt;&lt;br&gt;
Verification—passing tests prove the work is done.&lt;br&gt;&lt;br&gt;
Guardrails—existing tests prevent regressions.&lt;/p&gt;

&lt;p&gt;Without those elements the agent is flying blind. There is no reliable way to verify correctness, and the human has to step back in as the slow, expensive verification layer.&lt;/p&gt;
&lt;h3&gt;
  
  
  The virtuous cycle
&lt;/h3&gt;

&lt;p&gt;When the feedback loop exists, a different cycle emerges.&lt;/p&gt;

&lt;p&gt;The agent receives instructions. It makes the code changes. The tests run. The agent fixes whatever fails. It loops until the suite is green.&lt;/p&gt;

&lt;p&gt;Humans stay focused on the intent and on the edge cases the tests don’t yet cover. The agent iterates rapidly because the tests tell it whether it is getting closer to the goal.&lt;/p&gt;
&lt;h3&gt;
  
  
  A practical example
&lt;/h3&gt;

&lt;p&gt;I built a custom Copilot agent specifically for coverage improvement. It analyses coverage reports, prioritises files by impact, writes tests incrementally, verifies after each change, and loops until the target coverage is reached.&lt;/p&gt;

&lt;p&gt;The agent works because the existing suite already provides the feedback loop and the guardrails. Without that foundation it would simply generate more untrusted code.&lt;/p&gt;
&lt;h3&gt;
  
  
  The AI test pitfall
&lt;/h3&gt;

&lt;p&gt;One warning is important.&lt;/p&gt;

&lt;p&gt;AI is very good at writing tests that pass. It is much less reliable at writing tests that are correct.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// You write a buggy function&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Bug: adds an extra 1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// AI generates a test based on the current implementation&lt;/span&gt;
&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should add two numbers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Passes. Wrong.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// The test you actually want&lt;/span&gt;
&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should add two numbers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Fails. Correct expectation.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you let the agent write the tests from the implementation, you risk locking the bugs in place. Intent must come first. Specs must precede code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key takeaways
&lt;/h3&gt;

&lt;p&gt;Tests enable speed, not just quality. High coverage gives you the confidence to move fast. Low coverage produces fear-driven slowness.&lt;/p&gt;

&lt;p&gt;Tests are specs. They are living documentation, executable requirements, and the single source of truth.&lt;/p&gt;

&lt;p&gt;Tests enable AI. A reliable suite becomes the feedback loop and the trust layer for generated code. That is what finally unlocks the full potential of coding agents.&lt;/p&gt;

&lt;p&gt;The organisations that understand this will not just write tests faster. They will move faster, refactor more freely, and let their agents do the heavy lifting while the system stays stable.&lt;/p&gt;

&lt;p&gt;That is the real competitive advantage.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>softwareengineering</category>
      <category>testing</category>
    </item>
    <item>
      <title>Maybe Enterprise Software Doesn’t Have to Suck Anymore</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Mon, 14 Sep 2026 21:37:04 +0000</pubDate>
      <link>https://dev.to/remojansen/maye-enterprise-software-doesnt-have-to-suck-anymore-2163</link>
      <guid>https://dev.to/remojansen/maye-enterprise-software-doesnt-have-to-suck-anymore-2163</guid>
      <description>&lt;p&gt;There is an uncomfortable truth about most non-tech enterprises: a lot of their software is insanely shit.&lt;/p&gt;

&lt;p&gt;I don't mean that the engineers are shit. In many cases, the opposite is true. I've worked with plenty of smart engineers who were perfectly capable of building good software. The problem is that good software is expensive, and for a long time the economics of building it simply didn't make sense.&lt;/p&gt;

&lt;p&gt;Think about the incentives inside a large enterprise. You have an internal system that employees have to use every day. The interface is confusing, the workflows are clunky, the codebase is a mess, and everyone knows it needs a serious refactor. Maybe there are thousands of lines of code that should be deleted. Maybe the architecture was designed ten years ago around assumptions that haven't been true for years. Maybe adding a simple feature now takes three weeks because nobody really understands how the thing works anymore.&lt;/p&gt;

&lt;p&gt;The engineers know this. The users know this. Everyone complains about it.&lt;/p&gt;

&lt;p&gt;And then someone proposes spending three months fixing it.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;What exactly does the business get at the end of those three months?&lt;/p&gt;

&lt;p&gt;There probably isn't a new customer. There isn't a new revenue stream. There isn't a shiny feature that can go into a quarterly presentation. Nobody in sales can put the refactor into a demo. The business has simply spent three months making something that already worked—technically speaking—less shit.&lt;/p&gt;

&lt;p&gt;From the perspective of an executive looking at a roadmap, that's a difficult proposition to approve.&lt;/p&gt;

&lt;p&gt;And in many enterprises, the incentives are even worse than that. The users aren't going anywhere. If you work for a bank, an airline, a government department, an insurance company, or some giant industrial company, you don't get to decide that you're going to use a competitor's internal software instead. You're using whatever system your employer gives you.&lt;/p&gt;

&lt;p&gt;So why obsess over UX?&lt;/p&gt;

&lt;p&gt;If your customers can leave, product quality matters enormously. If your customers are employees who have no choice, the incentive is very different.&lt;/p&gt;

&lt;p&gt;This is one of the reasons I think a lot of terrible enterprise software actually makes sense.&lt;/p&gt;

&lt;p&gt;Not to me, necessarily. But within the incentive structure of the organization, it can make perfect sense.&lt;/p&gt;

&lt;p&gt;The company needs feature X by September. The team has four engineers. The existing system technically works. There is a giant backlog. Nobody has allocated time for a rewrite. The person responsible for the budget doesn't personally use the software. The person who understands the architecture is worried about hitting the deadline. And the consequences of making the code slightly worse won't show up on anyone's quarterly report.&lt;/p&gt;

&lt;p&gt;So you ship it.&lt;/p&gt;

&lt;p&gt;Then you ship the next thing.&lt;/p&gt;

&lt;p&gt;Then the next thing.&lt;/p&gt;

&lt;p&gt;And eventually you have a system that everyone hates.&lt;/p&gt;

&lt;h3&gt;
  
  
  The hidden cost of software everyone hates
&lt;/h3&gt;

&lt;p&gt;The problem is that "the software technically works" is an incredibly low bar.&lt;/p&gt;

&lt;p&gt;A piece of software can work perfectly well and still make thousands of people's lives slightly worse every single day.&lt;/p&gt;

&lt;p&gt;A workflow that should take two minutes takes ten. A page that should load instantly takes thirty seconds. An employee has to enter the same information into three different systems. An error message tells them absolutely nothing. A form resets itself for no apparent reason. A button is hidden behind some bizarre legacy navigation. Nobody knows why the process works this way, but changing it feels too risky.&lt;/p&gt;

&lt;p&gt;Each individual annoyance is tiny.&lt;/p&gt;

&lt;p&gt;The problem is that these tiny annoyances compound.&lt;/p&gt;

&lt;p&gt;If 5,000 employees waste ten minutes a day fighting with internal software, that's more than 200,000 hours of human time every year. And even that calculation misses something important: &lt;strong&gt;the psychological cost.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;People don't just lose ten minutes.&lt;/p&gt;

&lt;p&gt;They become frustrated.&lt;/p&gt;

&lt;p&gt;They lose momentum. They have to remember workarounds. They start distrusting the systems around them. They learn that doing their job means fighting with the tools provided to them.&lt;/p&gt;

&lt;p&gt;And eventually, they start hating the job itself.&lt;/p&gt;

&lt;p&gt;We talk endlessly about employee engagement and morale. Companies spend fortunes on offsites, leadership programmes, wellness initiatives and motivational speakers. But there is something deeply absurd about trying to improve employee morale while forcing people to spend eight hours a day using software they hate.&lt;/p&gt;

&lt;p&gt;Everyone knows that teams with low morale don't win championships.&lt;/p&gt;

&lt;p&gt;We understand this intuitively in sports. Nobody looks at a dysfunctional football team and says, "It's fine, the players are still technically capable of running around."&lt;/p&gt;

&lt;p&gt;We care about the environment in which people perform.&lt;/p&gt;

&lt;p&gt;Software is part of that environment.&lt;/p&gt;

&lt;p&gt;And yet, in many companies, the quality of the software employees use every day is treated as an engineering concern rather than a business concern.&lt;/p&gt;

&lt;h3&gt;
  
  
  The dinosaur problem
&lt;/h3&gt;

&lt;p&gt;There is also a generational problem here.&lt;/p&gt;

&lt;p&gt;A lot of people making technology decisions in large organizations didn't grow up thinking of software as a product. They grew up thinking of it as infrastructure: something the IT department provides so that the business can function.&lt;/p&gt;

&lt;p&gt;You don't ask whether the electricity in the office has a delightful user experience.&lt;/p&gt;

&lt;p&gt;You don't care whether the database has beautiful onboarding.&lt;/p&gt;

&lt;p&gt;You just need it to work.&lt;/p&gt;

&lt;p&gt;That mentality made a lot more sense when software was something employees occasionally interacted with. It makes considerably less sense when software is effectively the workplace itself.&lt;/p&gt;

&lt;p&gt;But organizational thinking moves slowly.&lt;/p&gt;

&lt;p&gt;Companies are enormous machines with long memories. The incentives, processes and mental models that made sense twenty years ago can survive long after the world that created them has disappeared.&lt;/p&gt;

&lt;p&gt;And this is where I think something genuinely exciting is happening.&lt;/p&gt;

&lt;p&gt;Coding agents are changing the economics of software quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  The three-month refactor
&lt;/h3&gt;

&lt;p&gt;Imagine that you have a horrible codebase.&lt;/p&gt;

&lt;p&gt;For years, the engineering team has known that it should be cleaned up. Everyone has a list of things they would change if they had the time. But the time never comes.&lt;/p&gt;

&lt;p&gt;The reason is not necessarily that management doesn't care. The reason is that the opportunity cost is enormous.&lt;/p&gt;

&lt;p&gt;A traditional refactor might require one or two engineers to spend weeks or months understanding the existing system, designing the changes, implementing them, testing everything, fixing regressions and gradually migrating the code.&lt;/p&gt;

&lt;p&gt;Three months is a long time.&lt;/p&gt;

&lt;p&gt;And three months of engineering time is expensive.&lt;/p&gt;

&lt;p&gt;Now imagine that instead of taking three months, an extremely capable coding agent can do a large part of the work in a day.&lt;/p&gt;

&lt;p&gt;Not every refactor, obviously. Not every codebase. And certainly not without human oversight, testing and engineering judgement.&lt;/p&gt;

&lt;p&gt;But the economic threshold has changed.&lt;/p&gt;

&lt;p&gt;Something that previously required a three-month business case might now require an afternoon.&lt;/p&gt;

&lt;p&gt;That is a completely different proposition.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI makes quality economically viable
&lt;/h3&gt;

&lt;p&gt;This is the part of AI-assisted programming that excites me much more than the promise of simply writing code faster.&lt;/p&gt;

&lt;p&gt;I don't think the most interesting consequence of coding agents is that developers can produce more lines of code.&lt;/p&gt;

&lt;p&gt;Frankly, the world already has enough lines of code.&lt;/p&gt;

&lt;p&gt;The interesting consequence is that &lt;strong&gt;code quality itself can become economically viable in places where it wasn't before.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a long time, software engineering involved an uncomfortable tradeoff. You could build the right thing, properly, but it would take longer. Or you could ship something that was good enough and move on.&lt;/p&gt;

&lt;p&gt;There were always engineers arguing for the former, and there were always business pressures pushing toward the latter.&lt;/p&gt;

&lt;p&gt;Sometimes the business won for perfectly rational reasons.&lt;/p&gt;

&lt;p&gt;But what happens when the cost of doing the right thing falls by an order of magnitude?&lt;/p&gt;

&lt;p&gt;Suddenly, the argument changes.&lt;/p&gt;

&lt;p&gt;The refactor doesn't have to compete with the feature roadmap in the same way. The cleanup doesn't necessarily require taking a team off delivery for a quarter. The ugly piece of legacy code doesn't have to remain ugly simply because nobody can justify spending six weeks fixing it.&lt;/p&gt;

&lt;p&gt;And perhaps most importantly, engineers don't have to spend as much time &lt;strong&gt;convincing people that quality matters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a subtle but profound shift.&lt;/p&gt;

&lt;p&gt;In the old world, if I wanted to spend three months improving a codebase, I had to convince someone that three months of engineering time was worth spending on something that users might not immediately notice.&lt;/p&gt;

&lt;p&gt;I needed a business case.&lt;/p&gt;

&lt;p&gt;I needed projections about future productivity.&lt;/p&gt;

&lt;p&gt;I needed to explain how technical debt compounds.&lt;/p&gt;

&lt;p&gt;I needed to convince someone to spend money today to avoid costs that might appear six months or two years from now.&lt;/p&gt;

&lt;p&gt;That's hard.&lt;/p&gt;

&lt;p&gt;But if the same improvement can be done in eight hours with an agent, the conversation becomes very different.&lt;/p&gt;

&lt;p&gt;Maybe I don't need a business case.&lt;/p&gt;

&lt;p&gt;Maybe I can just do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The software we already have
&lt;/h3&gt;

&lt;p&gt;This is why I think the biggest impact of coding agents might not be that they allow us to build more software.&lt;/p&gt;

&lt;p&gt;We already build an enormous amount of software.&lt;/p&gt;

&lt;p&gt;It might be that they finally allow us to make the software we already have good.&lt;/p&gt;

&lt;p&gt;There are millions of applications sitting inside organizations that are not fundamentally broken. They are just mediocre. They are slow, awkward, overcomplicated, badly structured and unpleasant to maintain.&lt;/p&gt;

&lt;p&gt;And for years, that was the equilibrium.&lt;/p&gt;

&lt;p&gt;The software was bad, but fixing it was too expensive.&lt;/p&gt;

&lt;p&gt;So everyone learned to live with it.&lt;/p&gt;

&lt;p&gt;Engineers learned the workarounds. Employees learned the weird workflows. Managers learned to accept the complaints. Executives learned that the system "worked."&lt;/p&gt;

&lt;p&gt;The organization adapted itself around the limitations of its software.&lt;/p&gt;

&lt;p&gt;That is a very strange thing when you step back and look at it.&lt;/p&gt;

&lt;p&gt;We built computers to make people more productive, and then spent decades making people adapt their behaviour to accommodate the computers.&lt;/p&gt;

&lt;p&gt;Coding agents could start reversing that relationship.&lt;/p&gt;

&lt;p&gt;If an engineer can take a horrible codebase and dramatically improve it without blowing up the delivery schedule, the default assumption no longer has to be that technical debt is permanent.&lt;/p&gt;

&lt;p&gt;Maybe the ugly code doesn't have to stay.&lt;/p&gt;

&lt;p&gt;Maybe the terrible internal tool can actually become pleasant.&lt;/p&gt;

&lt;p&gt;Maybe the three-month refactor becomes an afternoon.&lt;/p&gt;

&lt;p&gt;And if that happens at scale, the consequences aren't just technical.&lt;/p&gt;

&lt;p&gt;They are organizational.&lt;/p&gt;

&lt;p&gt;Because when the software gets better, the people using it get better tools. When people have better tools, they waste less time. They get less frustrated. They can move faster. They spend less mental energy fighting the system and more energy doing the thing the system was supposed to help them do.&lt;/p&gt;

&lt;p&gt;Good software isn't just a technical luxury.&lt;/p&gt;

&lt;p&gt;It is part of the working environment.&lt;/p&gt;

&lt;p&gt;And for the first time, we may be entering a world where making it good is cheap enough that even enterprises have less of an excuse not to.&lt;/p&gt;

&lt;p&gt;Maybe the future of coding agents isn't that we'll write ten times as much code.&lt;/p&gt;

&lt;p&gt;Maybe it's that &lt;strong&gt;we finally get to stop writing quite so much shit code.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>refactoring</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Career safety in the Age of AI Layoffs</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:39:57 +0000</pubDate>
      <link>https://dev.to/remojansen/career-safety-in-the-age-of-ai-layoffs-4ich</link>
      <guid>https://dev.to/remojansen/career-safety-in-the-age-of-ai-layoffs-4ich</guid>
      <description>&lt;p&gt;There is a strange contradiction happening in software engineering right now. A lot of developers are worried that AI is going to make them obsolete. &lt;/p&gt;

&lt;p&gt;At the same time, the people building the most capable AI coding tools are demonstrating something that should probably make us rethink what being a software engineer actually means. I don't think the future is one where nobody understands software anymore. I think it is one where writing the software becomes dramatically cheaper. &lt;/p&gt;

&lt;p&gt;And if that happens, the thing that makes an engineer valuable has to move. That is what I mean by career safety. Career safety isn't about making yourself impossible to replace. It is about making your value portable.&lt;/p&gt;

&lt;h2&gt;
  
  
  We've always resisted giving up the code
&lt;/h2&gt;

&lt;p&gt;Developers have a long history of being suspicious of abstractions that take work away from us. We went from machine code to assembly, from assembly to higher-level languages, from manually managing memory to garbage collection, from building everything ourselves to libraries and frameworks, and from text editors to IDEs. &lt;/p&gt;

&lt;p&gt;We even had entire categories of tools, such as CASE tools, designed to automate parts of software development. And every time, there was resistance. Because programmers don't just use code. We build our identities around it. John Carmack captured this unusually well when he wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Coding” was never the source of value, and people shouldn’t get overly attached to it. — John Carmack&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He followed that with the more important point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Problem solving is the core skill. — John Carmack&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a difficult idea for developers to internalize because coding is tangible. You can point at the repository. You can point at the pull request. You can count the commits. You can say, "I wrote this." &lt;/p&gt;

&lt;p&gt;But the business doesn't ultimately pay you for the number of lines you wrote. It pays you for what those lines accomplish.&lt;/p&gt;

&lt;h2&gt;
  
  
  The business never really bought the code
&lt;/h2&gt;

&lt;p&gt;A company doesn't wake up in the morning thinking: "We need 14,000 more lines of TypeScript." It thinks: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"We need to reduce the cost of this process."&lt;/li&gt;
&lt;li&gt;"We need to launch this product."&lt;/li&gt;
&lt;li&gt;"We need to increase conversion."&lt;/li&gt;
&lt;li&gt;"We need to satisfy this regulatory requirement."&lt;/li&gt;
&lt;li&gt;"We need to reduce operational risk."&lt;/li&gt;
&lt;li&gt;"We need to make our customers happier." &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code is the mechanism. The outcome is the value. That distinction matters enormously when the cost of producing code starts approaching zero. &lt;/p&gt;

&lt;p&gt;And I think this is where the current AI discussion often goes wrong. The argument becomes: "AI can't write perfect code." Maybe. "AI still makes mistakes." Absolutely. "I had to spend an hour fixing what the AI generated." I've done that too. &lt;/p&gt;

&lt;p&gt;But those observations don't answer the important question. How quickly is the capability improving? The code AI generated a year ago was often laughably bad. Today's systems are substantially better. &lt;/p&gt;

&lt;p&gt;And the direction of travel matters more than whether today's models can replace every engineer. You don't need AI to become perfect for the economics of software development to change. You only need the cost of producing implementation to keep falling. &lt;/p&gt;

&lt;p&gt;Linus Torvalds recently made essentially this pragmatic argument about AI in the Linux kernel:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI is a tool, just like other tools we use. And it’s clearly a useful one.”— Linus Torvalds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He went further, saying that decisions in the kernel should be based on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“technical merit. Not fear of new tools.”— Linus Torvalds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction is incredibly important. The question isn't whether AI is morally good or bad. The question is: Does the tool help us produce better technology? &lt;/p&gt;

&lt;p&gt;If the answer increasingly becomes yes, then refusing to use it isn't protecting the profession. It is simply refusing a tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding code isn't the same as typing it
&lt;/h2&gt;

&lt;p&gt;This is where I think we need to separate two things that have become conflated. Understanding software and manually producing software are not the same skill. &lt;/p&gt;

&lt;p&gt;A compiler already transforms the code we write into something else. Libraries allow us to avoid implementing primitives ourselves. Frameworks give us enormous amounts of functionality without us writing the underlying infrastructure. Garbage collectors manage memory we previously had to manage ourselves. IDEs autocomplete, refactor and navigate code for us. &lt;/p&gt;

&lt;p&gt;Nobody seriously argues that using these tools means we aren't software engineers. AI is another step in the same direction. The difference is that this step is much larger. &lt;/p&gt;

&lt;p&gt;Instead of automating one small part of implementation, AI can potentially automate substantial portions of the implementation itself. That doesn't make understanding less important. It makes understanding more important. &lt;/p&gt;

&lt;p&gt;If I ask an AI system to build a payment workflow, I need to understand payments. If I ask it to design an insurance pricing system, I need to understand insurance. If I ask it to modify a distributed system, I need to understand distributed systems. &lt;/p&gt;

&lt;p&gt;The machine can increasingly help with the implementation. It cannot magically give me the context that determines whether the implementation is the right thing to build. And that leads to what I think will become one of the biggest career advantages of the next decade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Domain expertise becomes a moat
&lt;/h2&gt;

&lt;p&gt;Imagine two engineers. The first is: Senior Full Stack TypeScript Engineer. The second is: London Specialty Insurance Product Engineer. &lt;/p&gt;

&lt;p&gt;The first might be excellent at React, Node.js, TypeScript, databases and cloud infrastructure. The second understands specialty insurance. They understand brokers. They understand underwriting. They understand policies. They understand claims. They understand regulatory constraints. They understand how the business actually makes money. They understand which workflows are painful. They understand which problems are worth solving. &lt;/p&gt;

&lt;p&gt;If AI makes software implementation dramatically cheaper, which of those profiles becomes more differentiated? Probably the second. &lt;/p&gt;

&lt;p&gt;Because technology knowledge is increasingly becoming something AI can augment. Deep knowledge of a particular business domain is much harder to manufacture on demand. &lt;/p&gt;

&lt;p&gt;This doesn't mean you should abandon technical expertise. Quite the opposite. It means you should combine technical expertise with domain expertise. &lt;/p&gt;

&lt;p&gt;If you're working in finance, learn finance. If you're working in healthcare, learn healthcare. If you're working in insurance, learn insurance. Read the books. Understand the regulations. Talk to customers. Understand the economics. Learn how the industry actually works. &lt;/p&gt;

&lt;p&gt;I increasingly think engineers should be reading as many books about their industry as they read about technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineer becomes a product person
&lt;/h2&gt;

&lt;p&gt;This also changes the relationship between engineering and product management. For a long time, organizations could afford a relatively clean separation. Product people decide what to build. Engineers decide how to build it. &lt;/p&gt;

&lt;p&gt;But what happens when the cost of implementation falls dramatically? The bottleneck moves. The scarce resource becomes knowing what should be built. &lt;/p&gt;

&lt;p&gt;That makes product judgment increasingly valuable for engineers. Can you understand a customer's problem? Can you translate it into a useful product? Can you understand the business case? Can you identify the constraints? Can you decide what not to build? Can you describe the desired outcome precisely enough that a machine can implement it? &lt;/p&gt;

&lt;p&gt;That last question is particularly important. Because the next generation of software engineering may look less like: "Give me a ticket and I'll write the code." And more like: "Give me a business problem and I'll turn it into a system of coordinated machines that can safely solve it."&lt;/p&gt;

&lt;h3&gt;
  
  
  The compression of the middle
&lt;/h3&gt;

&lt;p&gt;There is another consequence of AI that is worth considering: it may not only reduce the amount of implementation work required, but also compress some of the intermediate organizational layers around engineering.&lt;/p&gt;

&lt;p&gt;As AI makes it easier to gather information, analyze requirements, synthesize feedback, produce specifications, and coordinate work, roles such as analysts, Scrum Masters, and some forms of project or product coordination may become leaner. This doesn't mean these functions disappear, but fewer people may be needed to translate information between customers, product teams, and engineers.&lt;/p&gt;

&lt;p&gt;That makes communication an increasingly important engineering skill.&lt;/p&gt;

&lt;p&gt;An engineer who can speak directly with users, understand their problems, gather and synthesize feedback, identify patterns across different customers, and translate those patterns into general-purpose solutions could become considerably more valuable. Instead of simply implementing a requirement handed down through several layers of an organization, that engineer can participate directly in discovering the requirement.&lt;/p&gt;

&lt;p&gt;This also changes what it means to be good at product management. Product thinking isn't simply about writing requirements or managing a backlog; it involves understanding people and their problems, communicating effectively, distinguishing individual requests from broader patterns, and deciding which problems are worth solving.&lt;/p&gt;

&lt;p&gt;In a leaner organization, the engineer who can bridge the gap between &lt;strong&gt;user problem → product insight → technical solution&lt;/strong&gt; may have significantly more leverage than an engineer who only receives a specification and implements it.&lt;/p&gt;

&lt;p&gt;The interesting consequence is that AI may therefore make communication skills &lt;em&gt;more&lt;/em&gt; important for engineers, not less. As the number of intermediaries decreases, the ability to communicate directly with the people experiencing the problem becomes increasingly valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The next engineering skill is operating agents
&lt;/h2&gt;

&lt;p&gt;I don't think the most interesting future is one where an engineer has one AI assistant open in their IDE. I think it is one where an engineer can operate a fleet of agents. &lt;/p&gt;

&lt;p&gt;One agent investigates the existing architecture. Another implements a feature. Another writes tests. Another reviews the implementation. Another performs security analysis. Another evaluates performance. Another updates documentation. Another runs experiments. And potentially dozens or hundreds of these processes can operate in parallel. &lt;/p&gt;

&lt;p&gt;At that point, the scarce skill isn't typing. It's orchestration. &lt;/p&gt;

&lt;p&gt;You need to know how to decompose a problem. How to specify work. How to establish boundaries. How to give agents the right context. How to structure systems so that work can happen safely in parallel. How to verify the results. How to detect when an agent has gone off course. How to roll back changes. How to evaluate whether the system actually achieved the intended outcome. &lt;/p&gt;

&lt;p&gt;In other words, the engineer moves up another level of abstraction. From writing code to causing valuable software to be produced. &lt;/p&gt;

&lt;p&gt;And I think this is where Linus's pragmatism becomes especially relevant. His position isn't "let the machines do whatever they want." It's essentially the opposite. Use the tool if it is useful. Judge the result on technical merit. Don't confuse opposition to the tool with engineering quality. &lt;/p&gt;

&lt;p&gt;The standard doesn't disappear because AI produced the code. If anything, the standard has to become more explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification becomes more important than generation
&lt;/h2&gt;

&lt;p&gt;There is an uncomfortable implication here. If one engineer can produce ten times as much implementation with AI, we cannot simply review ten times as much code manually. The old process breaks. &lt;/p&gt;

&lt;p&gt;Today we often have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human → code → human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tomorrow we may have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human → specification → many agents → automated verification → human judgment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That requires a different engineering discipline. We need better architectures. Better tests. Better specifications. Better observability. Better evaluation. Better security controls. Better deployment boundaries. Better rollback mechanisms. Better ways of proving that the generated system does what we intended. &lt;/p&gt;

&lt;p&gt;This is why I don't think AI makes engineering less important. It makes engineering discipline more important. &lt;/p&gt;

&lt;p&gt;The amount of generated code may explode. Our ability to trust that code cannot depend on reading every line. We need systems that make correctness easier to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what actually makes a career safe?
&lt;/h2&gt;

&lt;p&gt;This is the question I care about most. Because if coding becomes increasingly commoditized, simply becoming a better coder may not be enough. The answer, I think, is to build career capital in layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technical depth&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You still need to understand how software works. You need architecture. You need systems thinking. You need to understand databases, networks, distributed systems, security, reliability and the fundamentals of computing. AI doesn't remove the need for this knowledge. It gives you more leverage if you have it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain expertise&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Become unusually knowledgeable about something that matters to a business. Don't just be "a TypeScript developer." Become the engineer who understands a particular industry, market or class of problems deeply.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Product judgment&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Learn to identify valuable problems. Understand customers. Understand economics. Understand trade-offs. Understand why something should be built, not just how.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Specification&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Learn to turn ambiguous goals into precise systems and constraints. This may become one of the defining engineering skills of the AI era. The better you can specify a problem, the more leverage you can get from machines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Learn how to determine whether a system is actually correct. Testing. Evaluation. Observability. Security. Performance. Failure analysis. Rollback. These skills become more valuable as the amount of machine-generated output increases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reputation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Build proof that exists outside your current employer. Write. Build open source. Contribute. Speak. Teach. Publish. Create things people can see. Your employer can remove your job. They cannot remove the body of work you've built in public. That's what makes career capital portable.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Become replaceable at the task level
&lt;/h2&gt;

&lt;p&gt;There is a strange career lesson hidden in all of this. I don't think you should try to make yourself irreplaceable. You should try to make yourself replaceable at the task level. &lt;/p&gt;

&lt;p&gt;If an AI can write the CRUD endpoint you used to spend half a day implementing, great. Let it. If an agent can write the tests, great. Let it. If a tool can refactor 50 files in seconds, great. Let it. &lt;/p&gt;

&lt;p&gt;Your goal shouldn't be to protect those tasks. Your goal should be to move upward. &lt;/p&gt;

&lt;p&gt;From implementation to architecture. From architecture to product. From product to domain. From individual tasks to systems of work. From writing code to deciding what code should exist in the first place. &lt;/p&gt;

&lt;p&gt;The safest engineer isn't necessarily the one who can write the most code. It is the engineer who can create the most value when the cost of writing code approaches zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding was never the destination
&lt;/h2&gt;

&lt;p&gt;This is why I keep coming back to Carmack's observation. Coding was never the source of value. It was the mechanism through which we created value. &lt;/p&gt;

&lt;p&gt;For decades, writing software was expensive enough that the ability to write it well was itself a significant competitive advantage. AI changes that equation. And that is scary. But it is also liberating. &lt;/p&gt;

&lt;p&gt;Because it forces us to ask what we should have been asking all along: What are we actually here to do? &lt;/p&gt;

&lt;p&gt;We're here to solve problems. We're here to create useful products. We're here to improve businesses. We're here to make systems more reliable. We're here to reduce costs. We're here to create new possibilities. &lt;/p&gt;

&lt;p&gt;Code is one of the tools that allows us to do those things. It is not the thing itself. &lt;/p&gt;

&lt;p&gt;Linus's attitude toward AI is useful here because it cuts through a lot of the noise: Use the tool. Judge it on technical merit. Keep the engineering standards. And if the tool becomes genuinely useful, don't confuse refusing to use it with preserving engineering. &lt;/p&gt;

&lt;p&gt;The future engineer may write less code than today's engineer. They may spend more time understanding a business. More time talking to customers. More time designing systems. More time specifying problems. More time verifying results. More time coordinating machines. And potentially produce vastly more valuable software as a result. &lt;/p&gt;

&lt;p&gt;That's the career shift I'm preparing for. Not how do I make sure AI never replaces what I do? But: How do I become the person who can use AI to create more value than I could ever create by myself? &lt;/p&gt;

&lt;p&gt;Because career safety doesn't come from protecting the work that machines are learning to do. It comes from developing the judgment, expertise and reputation to remain valuable when the work itself changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update 1: Technical depth is still relevant
&lt;/h2&gt;

&lt;p&gt;Based on a comment by &lt;a class="mentioned-user" href="https://dev.to/routinekit"&gt;@routinekit&lt;/a&gt;, I think it is important to clarify one point: we can’t completely forget about technical expertise.&lt;/p&gt;

&lt;p&gt;I still believe that the implementation details — specific tools, frameworks, syntax, and even some programming languages — will become less important as AI becomes increasingly capable of handling them. But that doesn't mean technical knowledge becomes irrelevant. In some ways, the opposite is true.&lt;/p&gt;

&lt;p&gt;The fundamentals become more important. Understanding protocols, computer architecture, operating systems, networks, databases, distributed systems, security, and how software behaves at a deeper level gives you the context needed to judge whether an AI-generated solution is actually good.&lt;/p&gt;

&lt;p&gt;And there is another kind of knowledge that is much harder to automate: the intuition you develop after years of being burned by bugs in production.&lt;/p&gt;

&lt;p&gt;Knowing that a particular architecture &lt;em&gt;looks&lt;/em&gt; fine is one thing. Having an instinct that something is going to fail under load, that a seemingly harmless change could introduce a race condition, or that a system is going to become impossible to operate six months from now is something you develop through experience.&lt;/p&gt;

&lt;p&gt;AI can help us implement and investigate these problems, but someone still needs to recognize when something doesn't look right and know what questions to ask.&lt;/p&gt;

&lt;p&gt;So I don't think the future is about choosing between technical expertise and domain expertise. I think the most valuable engineers will combine both, deep technical fundamentals, strong domain knowledge, and the experience to use AI effectively while knowing when not to trust it.&lt;/p&gt;

&lt;p&gt;The syntax may change. The tools will certainly change. But understanding how computers and systems actually work. Having the scars to prove you've learned from production remains valuable.&lt;/p&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Calling All Cloud Providers: Let’s Build a Sustainable Funding Model for Open Source</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Mon, 31 Aug 2026 13:47:12 +0000</pubDate>
      <link>https://dev.to/remojansen/calling-all-cloud-providers-lets-build-a-sustainable-funding-model-for-open-source-45p7</link>
      <guid>https://dev.to/remojansen/calling-all-cloud-providers-lets-build-a-sustainable-funding-model-for-open-source-45p7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Calling All Cloud Providers: Let’s Build a Sustainable Funding Model for Open Source&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open source powers an enormous part of the modern internet. Apache HTTP Server, Linux, Kubernetes, PostgreSQL, Python, NGINX, and thousands of other projects form the foundation of the applications and infrastructure that run on cloud platforms.&lt;/p&gt;

&lt;p&gt;Yet a clear economic disconnect remains: cloud providers generate billions from workloads built on open source, while many of the projects creating that value struggle to fund maintenance and development.&lt;/p&gt;

&lt;p&gt;There is a straightforward mechanism that could help close the gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if cloud providers shared a small percentage of cloud consumption attributable to open-source projects?
&lt;/h3&gt;

&lt;p&gt;Not as a new fee, surcharge, or software license, and without charging the customer anything extra. An open-source project could simply add a button in its GitHub repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Deploy to AWS — Support this project ]
[ Deploy to Azure — Support this project ]
[ Deploy to Google Cloud — Support this project ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The button deploys the project into the user’s own cloud account at the provider’s normal prices. The user pays exactly what they would otherwise pay. The cloud provider receives its normal revenue. The only difference is an attribution identifier that records:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This workload originated from this open-source project.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The provider could then voluntarily return, for example, &lt;strong&gt;1% of eligible cloud consumption&lt;/strong&gt; to the project.&lt;/p&gt;

&lt;p&gt;From the user’s perspective nothing changes: they keep their own cloud account, pay normal prices, and need not understand the attribution details. The important part is transparency—the project can clearly tell users that choosing a particular option may help support it through ordinary cloud usage.&lt;/p&gt;

&lt;h4&gt;
  
  
  An example
&lt;/h4&gt;

&lt;p&gt;A user clicks &lt;strong&gt;Deploy to Azure to support this project&lt;/strong&gt; and later spends $10,000/month on Azure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Amount&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customer’s Azure bill&lt;/td&gt;
&lt;td&gt;$10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure keeps&lt;/td&gt;
&lt;td&gt;$9,900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSS project receives&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional customer cost&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The project sells nothing. The user makes no donation. Azure charges nothing extra. The project simply receives a small share of the consumption it helped drive. If that deployment represents incremental revenue Azure might otherwise have lost, the provider has effectively spent $100 to acquire or retain $10,000 of monthly consumption—an attractive customer-acquisition cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  This is different from a cloud marketplace
&lt;/h3&gt;

&lt;p&gt;AWS, Azure, and Google Cloud Marketplaces already let companies sell software. That model is useful, but it does not address free and open-source projects that have no commercial license, subscription, paid listing, SaaS product, or software fee.&lt;/p&gt;

&lt;p&gt;Apache HTTP Server is free. The customer simply needs somewhere to run it. If they choose Azure, Azure earns the infrastructure revenue. Why shouldn’t a tiny portion of that revenue flow back to the project that helped make the workload possible? This is not about turning open source into a paid product. It is about recognizing that open-source projects can influence where and how cloud infrastructure is consumed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Think of it as an OSS affiliate program
&lt;/h3&gt;

&lt;p&gt;Affiliate marketing is a familiar pattern: a site refers a customer to Amazon; the customer buys something; Amazon shares a percentage of the revenue. The affiliate did not manufacture the product—it simply helped generate the transaction.&lt;/p&gt;

&lt;p&gt;Cloud revenue sharing for open source could work the same way, except the referral is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“My open-source project helped generate or influence a cloud workload.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of a one-time payment, the project could receive a small percentage of resulting consumption for a defined period. The exact percentage and duration would be set by the provider. &lt;strong&gt;1% is only an illustrative example of a sufficiently small share.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloud providers already have pieces of the technology
&lt;/h3&gt;

&lt;p&gt;This is not purely hypothetical. Microsoft Azure’s Customer Usage Attribution (CUA), for example, associates Azure usage with partner solutions and deployments at the time of deployment. That capability is very close to the core technical requirement: knowing which project influenced a particular cloud deployment.&lt;/p&gt;

&lt;p&gt;The missing piece is the economic incentive. Attribution already helps providers understand the origin of consumption. Why not use it to create a sustainability mechanism for open source?&lt;/p&gt;

&lt;h3&gt;
  
  
  Why would a cloud provider do this?
&lt;/h3&gt;

&lt;p&gt;Giving away 1% of revenue looks like a cost at first glance. The better framing is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Would spending $10 increase the probability of generating or retaining $1,000 of cloud consumption?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is yes, the program is an interesting customer-acquisition and retention tool. Open source already possesses a vast distribution network—GitHub, documentation, tutorials, Stack Overflow, package repositories, Docker images, Kubernetes manifests, Helm charts, Terraform modules, blog posts, conferences, and developer communities. Cloud providers compete to become the place where that software runs. Giving the software itself an economic incentive to make cloud deployment easier is a natural extension of that competition.&lt;/p&gt;

&lt;h3&gt;
  
  
  The flywheel
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmp3j8brqr1konj3unlwc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmp3j8brqr1konj3unlwc.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maintainers currently rely on donations, GitHub Sponsors, corporate sponsorship, consulting, support contracts, foundations, grants, employment, dual licensing, or venture funding. Those channels remain valuable. Cloud revenue sharing would simply add another path that links real-world usage directly to sustainability.&lt;/p&gt;

&lt;h3&gt;
  
  
  This could change the economics of open source
&lt;/h3&gt;

&lt;p&gt;One of the largest problems in open source is that usage and funding are poorly correlated. A project can have millions of users and still struggle financially. Cloud revenue sharing would create a tighter relationship:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;usage → value → sustainability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;instead of&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;usage → popularity → hope someone sponsors us&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It would not replace existing models; it would complement them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attribution should favor the projects that need it most
&lt;/h3&gt;

&lt;p&gt;The hardest practical question is attribution. When a user deploys an application that sits on top of Kubernetes, Ubuntu, PostgreSQL, Terraform, and a dozen other layers, who should receive credit?&lt;/p&gt;

&lt;p&gt;In practice, the core infrastructure projects are often relatively well-funded. Foundations, corporate sponsors, and large user bases already support many of them. The projects that most often see zero support are the higher-level applications, libraries, tools, and domain-specific projects that actually put the “Deploy to Cloud” button in front of the user.&lt;/p&gt;

&lt;p&gt;That observation points to a simple and intentional design choice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attribute the revenue share to the project that provided the explicit Deploy action.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx1rn4xo1ap8fzpwb7aeq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx1rn4xo1ap8fzpwb7aeq.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system does not try to split value across every layer of the stack. It does not attempt to decide whether Ubuntu, PostgreSQL, or Terraform “deserve” a cut. It only records a clear, measurable relationship: this deployment was initiated through &lt;em&gt;this&lt;/em&gt; project’s channel.&lt;/p&gt;

&lt;p&gt;That design has three advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It directs funding toward the projects that are actively choosing to participate and that most often lack other funding.&lt;/li&gt;
&lt;li&gt;It is technically straightforward—no complex dependency graph or value-allocation algorithm is required.&lt;/li&gt;
&lt;li&gt;It remains transparent to the user: “If you choose this deployment option, your normal cloud usage may help support &lt;em&gt;this&lt;/em&gt; project.”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;More sophisticated multi-project attribution could be explored later if the community wants it. But the first version should deliberately prioritize the project that put the button in front of the user. That is usually the project that needs the support.&lt;/p&gt;

&lt;h3&gt;
  
  
  It does not have to be 1%
&lt;/h3&gt;

&lt;p&gt;1% is merely an example. The share could be 0.1%, 0.5%, 2%, or tiered. The essential principle is that it remains small relative to the consumption generated or influenced by the project.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Monthly cloud consumption&lt;/th&gt;
&lt;th&gt;1% OSS share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$1,000&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$10,000&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$100,000&lt;/td&gt;
&lt;td&gt;$1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$1 million&lt;/td&gt;
&lt;td&gt;$10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$10 million&lt;/td&gt;
&lt;td&gt;$100,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a successful project this can become meaningful funding. For the provider the percentage is tiny compared with the associated consumption. The precise economics can be tested experimentally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Existing vs. incremental consumption
&lt;/h3&gt;

&lt;p&gt;A distinction between attributed and incremental consumption is useful. If a customer already spending $10,000/month on Azure simply clicks the support button, the provider has not necessarily acquired new revenue. Different share rates (or time-limited payments) can therefore apply to new customers, new workloads, cloud switches, or true incremental consumption versus existing usage. A time-limited window—for example the first 12 months after deployment—would further position the program as a customer-acquisition and developer-ecosystem initiative rather than a permanent royalty.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open-source neutrality matters
&lt;/h3&gt;

&lt;p&gt;If a project offered “Deploy to us and we get 1%” buttons for AWS, Azure, and Google Cloud, it would have financial relationships with multiple providers. That can be healthy provided the project remains neutral. Provider neutrality should therefore be a core design principle: all participating clouds support the same public attribution standard and offer comparable participation mechanisms. The project can then present equal options without endorsing any single provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separate attribution from payment
&lt;/h3&gt;

&lt;p&gt;It is useful to establish an open attribution standard independently of any financial program—something along the lines of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSS Project ID + Repository ID + Deployment ID + Cloud Provider + Timestamp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Providers receive the metadata. Commercial agreements then decide whether and how much money is paid. This separation makes experimentation easier. Stakeholders need not agree immediately on a universal percentage; they can first agree on how to identify and measure open-source deployment influence. Once the data exists, different economic models can be tested.&lt;/p&gt;

&lt;h3&gt;
  
  
  What if open source became a cloud distribution channel?
&lt;/h3&gt;

&lt;p&gt;Today cloud providers compete for developers. Open-source projects already have those developers. If major projects could say “Deploy this on Azure / AWS / Google Cloud to support our project,” the provider would no longer be merely hosting open source—it would be economically partnering with it. The project would have a direct incentive to make cloud deployment easier, more reliable, and more discoverable. The result is a powerful alignment: providers want workloads, developers want easy deployment, and projects want sustainable funding.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let’s try it
&lt;/h3&gt;

&lt;p&gt;I am not asking providers to make cloud computing cheaper, donate billions, or raise customer prices. I am proposing something much smaller:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give open-source projects a way to participate in the cloud economics they help create.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Start with a limited experiment. Select a handful of major projects, give them a deployment attribution mechanism, allow transparent “Deploy to … to support this project” buttons, measure the resulting consumption, and return a small percentage of eligible usage. Then evaluate: Did the program drive incremental consumption? Influence cloud choice? Improve adoption or retention? Provide meaningful funding? If it works, expand it. If it does not, stop. Relative to the size of the cloud market, that is a modest experiment.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bigger opportunity
&lt;/h3&gt;

&lt;p&gt;The real opportunity may be larger than any particular percentage. Open-source projects form a major part of the developer distribution network. They influence what developers install, what technologies companies adopt, what infrastructure teams deploy, and ultimately where workloads run. Yet the economic value of that influence is largely invisible.&lt;/p&gt;

&lt;p&gt;Cloud providers measure customers, workloads, and consumption. Open-source communities measure downloads, stars, contributors, and deployments. What is missing is a bridge between those two worlds. A standardized attribution mechanism—&lt;strong&gt;open-source project → deployment → cloud consumption&lt;/strong&gt;—would create that bridge. Once the connection exists, many economic models become possible: 1%, 0.1%, fixed bounties for new customers, shares of incremental consumption, time-limited referral payments, and more. The exact model can evolve. The essential step is creating the connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  A call to action
&lt;/h3&gt;

&lt;p&gt;If you work at &lt;strong&gt;AWS, Azure, or Google Cloud&lt;/strong&gt; on developer relations, partnerships, cloud economics, Marketplace, open source, or growth: I would like to hear your thoughts.&lt;/p&gt;

&lt;p&gt;If you maintain an open-source project: Would you add a “Deploy to Cloud to support this project” button if it could generate recurring funding?&lt;/p&gt;

&lt;p&gt;If you are a cloud customer: Would knowing that your normal usage could help fund an open-source project influence which cloud you choose?&lt;/p&gt;

&lt;p&gt;Attribution may prove complicated. 1% may be too high or 0.1% may be sufficient. The economics may work only for new customers. Revenue sharing may not turn out to be the best model. But the underlying question is worth asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can we turn a small fraction of cloud consumption into a sustainable funding mechanism for the open-source software that makes that consumption possible?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cloud providers already have the customers. Open source already has the developers. The technology to attribute deployments is increasingly available. What is missing is the incentive model. Let’s build it.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>opensource</category>
      <category>discuss</category>
      <category>community</category>
    </item>
    <item>
      <title>I’m Looking for the Right Problem, Not the Right Job Title — Could It Be You?</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 29 Aug 2026 23:37:13 +0000</pubDate>
      <link>https://dev.to/remojansen/im-looking-for-the-right-problem-not-the-right-job-title-could-it-be-you-1baa</link>
      <guid>https://dev.to/remojansen/im-looking-for-the-right-problem-not-the-right-job-title-could-it-be-you-1baa</guid>
      <description>&lt;p&gt;This is a slightly unusual post.&lt;/p&gt;

&lt;p&gt;After almost &lt;strong&gt;20 years of writing software&lt;/strong&gt;, creating and leading an open-source project, writing multiple books, spending several years as a &lt;strong&gt;Microsoft MVP&lt;/strong&gt;, and generally spending far too much of my free time thinking about developer tools, I've reached a point where I think I know what I want to do next.&lt;/p&gt;

&lt;p&gt;And I'm not entirely sure what the job title is.&lt;/p&gt;

&lt;p&gt;So instead of starting with a job title, I'm going to describe the kind of work I'd love to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm looking for a role where I can combine technical depth, API design, developer experience, product thinking and technical leadership.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If that sounds like something your team needs, I'd love to hear from you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two decades of building software
&lt;/h2&gt;

&lt;p&gt;I've been coding for almost 20 years now.&lt;/p&gt;

&lt;p&gt;Over that time I've worked across quite a broad part of the software development landscape, but I've increasingly gravitated towards one particular problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How do we make software easier and more enjoyable for other developers to build?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've written multiple books, spent several years as a Microsoft MVP, spoken and written about technology, and built open-source software used by developers around the world.&lt;/p&gt;

&lt;p&gt;You can find some of my books &lt;a href="https://www.amazon.co.uk/stores/author/B015LX8AZM" rel="noopener noreferrer"&gt;on Amazon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Looking back, these experiences all taught me different parts of the same thing.&lt;/p&gt;

&lt;p&gt;Writing books taught me how to explain complex technical ideas.&lt;/p&gt;

&lt;p&gt;Being a Microsoft MVP taught me how much I enjoy sharing knowledge and participating in a technical community.&lt;/p&gt;

&lt;p&gt;And building open-source software taught me something I didn't expect: how much I enjoy designing and evolving developer tools as products and ecosystems.&lt;/p&gt;

&lt;p&gt;The project that has shaped me the most is &lt;strong&gt;Inversify&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Inversify
&lt;/h1&gt;

&lt;p&gt;I created Inversify and have developed it from the ground up.&lt;/p&gt;

&lt;p&gt;It started as an experiment around dependency injection in TypeScript and Node.js, but over the years it became a much bigger education in both technology and developer experience.&lt;/p&gt;

&lt;p&gt;Working on Inversify meant going very deep into things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript's type system&lt;/li&gt;
&lt;li&gt;decorators&lt;/li&gt;
&lt;li&gt;runtime metadata&lt;/li&gt;
&lt;li&gt;reflection&lt;/li&gt;
&lt;li&gt;compiler integration&lt;/li&gt;
&lt;li&gt;JavaScript and Node.js runtime behaviour&lt;/li&gt;
&lt;li&gt;module systems&lt;/li&gt;
&lt;li&gt;API design&lt;/li&gt;
&lt;li&gt;backwards compatibility&lt;/li&gt;
&lt;li&gt;versioning&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that isn't actually the part of the experience I value most.&lt;/p&gt;

&lt;p&gt;The other side of building Inversify was learning how to &lt;strong&gt;run and evolve an open-source developer ecosystem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When thousands of developers are using an API, designing the API is only part of the job.&lt;/p&gt;

&lt;p&gt;You have to learn how to listen to users without allowing the loudest user to define the roadmap.&lt;/p&gt;

&lt;p&gt;You have to distinguish:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I want this feature"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"There is actually a deeper problem with the abstraction."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You have to make pragmatic decisions when there isn't a perfect technical solution.&lt;/p&gt;

&lt;p&gt;You have to work with contributors.&lt;/p&gt;

&lt;p&gt;You have to communicate breaking changes.&lt;/p&gt;

&lt;p&gt;You have to think about migration paths.&lt;/p&gt;

&lt;p&gt;You have to maintain compatibility.&lt;/p&gt;

&lt;p&gt;You have to decide what &lt;em&gt;not&lt;/em&gt; to build.&lt;/p&gt;

&lt;p&gt;And you have to maintain trust with a community.&lt;/p&gt;

&lt;p&gt;In hindsight, Inversify became an accidental education in &lt;strong&gt;developer-tooling product and program management&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Experimenting with developer experience
&lt;/h1&gt;

&lt;p&gt;One of the things I've enjoyed most throughout this journey has been experimenting with new ways of making developers' lives easier.&lt;/p&gt;

&lt;p&gt;For example, &lt;strong&gt;inversify-express-utils&lt;/strong&gt; was one of my early experiments with decorator-based routing and controller APIs for Node.js.&lt;/p&gt;

&lt;p&gt;The basic idea was to let developers express an HTTP API using TypeScript classes and decorators:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;httpGet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the time, decorator-driven routing and controller APIs were still relatively novel in the Node.js/TypeScript ecosystem.&lt;/p&gt;

&lt;p&gt;Today, this style of API is completely mainstream.&lt;/p&gt;

&lt;p&gt;That experience was incredibly interesting to me, not because of the particular implementation, but because of the process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify a developer problem.&lt;/li&gt;
&lt;li&gt;Imagine a better API.&lt;/li&gt;
&lt;li&gt;Build a prototype.&lt;/li&gt;
&lt;li&gt;Put it in front of real developers.&lt;/li&gt;
&lt;li&gt;Listen to what they do with it.&lt;/li&gt;
&lt;li&gt;Discover where the abstraction works and where it doesn't.&lt;/li&gt;
&lt;li&gt;Iterate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I've gone through versions of that cycle repeatedly over the years.&lt;/p&gt;

&lt;p&gt;And I've realised that &lt;strong&gt;I really enjoy it.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  From Inversify to RFLCT
&lt;/h1&gt;

&lt;p&gt;More recently, I've started thinking about something much closer to the underlying language and tooling.&lt;/p&gt;

&lt;p&gt;Inversify has historically relied heavily on decorators and runtime metadata.&lt;/p&gt;

&lt;p&gt;After working with that model for years, I started wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if framework metadata could be expressed through TypeScript's type system instead?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question led me to start experimenting with &lt;strong&gt;RFLCT&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is still evolving, but imagine something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rflct&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Shape&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;sides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Polygon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Shape&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the compiler generates metadata automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;__RFLCT_Shape&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@acme/shapes@1|src/geo.ts|Shape&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Polygon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defineMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;design:paramtypes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__RFLCT_Shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defineMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;design:properties&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;color&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defineMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;design:paramtypes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;color&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__RFLCT_Shape&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;defineMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;design:symbols&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMetadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;design:symbols&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@acme/shapes@1|src/geo.ts|Shape&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;__RFLCT_Shape&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@acme/shapes@1|src/geo.ts|Polygon&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;Reflect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting part isn't really the syntax.&lt;/p&gt;

&lt;p&gt;It's the architectural question behind it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can a universal tooling layer understand relationships expressed through TypeScript's type system and turn them into runtime metadata, while leaving the meaning of that metadata entirely to the consuming framework?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inversify could define what &lt;code&gt;postConstruct&lt;/code&gt;, &lt;code&gt;preDestroy&lt;/code&gt;, &lt;code&gt;injectFromBase&lt;/code&gt;, &lt;code&gt;injectFromHierarchy&lt;/code&gt;, etc. mean.&lt;/p&gt;

&lt;p&gt;Another framework could define completely different metadata.&lt;/p&gt;

&lt;p&gt;RFLCT doesn't need to understand either framework.&lt;/p&gt;

&lt;p&gt;This is the kind of problem I've increasingly found myself drawn towards:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;the boundary between programming languages, frameworks, APIs, tooling and developer experience.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What I think I'm actually good at
&lt;/h1&gt;

&lt;p&gt;I've spent most of my career writing software, and I'm very comfortable doing it.&lt;/p&gt;

&lt;p&gt;But looking back at everything I've worked on, I think my highest-leverage skill is increasingly somewhere else.&lt;/p&gt;

&lt;p&gt;I really enjoy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;understanding difficult developer problems&lt;/li&gt;
&lt;li&gt;designing APIs&lt;/li&gt;
&lt;li&gt;designing abstractions&lt;/li&gt;
&lt;li&gt;thinking about programming-language constraints&lt;/li&gt;
&lt;li&gt;exploring new developer experiences&lt;/li&gt;
&lt;li&gt;talking to users and contributors&lt;/li&gt;
&lt;li&gt;collecting and interpreting feedback&lt;/li&gt;
&lt;li&gt;turning conflicting feedback into a coherent direction&lt;/li&gt;
&lt;li&gt;deciding what should and shouldn't be built&lt;/li&gt;
&lt;li&gt;prototyping ideas&lt;/li&gt;
&lt;li&gt;thinking about long-term API evolution&lt;/li&gt;
&lt;li&gt;connecting technical possibilities with actual developer needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still enjoy implementation.&lt;/p&gt;

&lt;p&gt;But increasingly, I think &lt;strong&gt;I can create more value by deciding what we should build and why, and by designing the abstraction that makes it possible.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don't want to become a non-technical product manager who throws requirements over the wall to engineers.&lt;/p&gt;

&lt;p&gt;Quite the opposite.&lt;/p&gt;

&lt;p&gt;I want to remain deeply technical.&lt;/p&gt;

&lt;p&gt;I want to be able to understand the compiler implications of an API, prototype something when necessary, discuss architecture with engineers, understand the constraints, and get into the code when that's the fastest way to answer a question.&lt;/p&gt;

&lt;p&gt;But I would like my &lt;strong&gt;primary leverage to come increasingly from technical design, product thinking and direction rather than from implementing every feature myself.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  So what am I looking for?
&lt;/h1&gt;

&lt;p&gt;I'm honestly not completely sure what the job title should be.&lt;/p&gt;

&lt;p&gt;It might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Technical Product Manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Experience Product Manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Platform Lead&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead / Principal Engineer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Tools Engineer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Productivity Engineer&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical Program Manager&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Ecosystem Lead&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architect&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;or something I haven't thought of yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The title matters less to me than the actual work.&lt;/p&gt;

&lt;p&gt;I'm looking for a role where I can sit at the intersection of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;developers × APIs × technology × product × developer experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and help figure out what the next thing should look like.&lt;/p&gt;

&lt;p&gt;I'm particularly interested in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript / JavaScript&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;developer tooling&lt;/li&gt;
&lt;li&gt;compilers and language tooling&lt;/li&gt;
&lt;li&gt;developer experience&lt;/li&gt;
&lt;li&gt;APIs and SDKs&lt;/li&gt;
&lt;li&gt;frameworks&lt;/li&gt;
&lt;li&gt;developer platforms&lt;/li&gt;
&lt;li&gt;programming-language-adjacent infrastructure&lt;/li&gt;
&lt;li&gt;open-source ecosystems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to work somewhere where &lt;strong&gt;developer tooling itself is the product&lt;/strong&gt;, rather than something that happens to be built internally.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I'd love to do
&lt;/h1&gt;

&lt;p&gt;My ideal day would probably involve some combination of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Developers are struggling with X. Why?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;followed by:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What would the API look like if we solved this properly?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;followed by:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can we actually make TypeScript, the compiler or the runtime do that?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;followed by:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let's prototype it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Let's put it in front of developers and see what happens."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I love that loop.&lt;/p&gt;

&lt;p&gt;I'd love to do it with a team of people who are much smarter than me in their respective areas, where I can contribute the combination of &lt;strong&gt;technical depth, API design, developer empathy and years of experience operating an open-source ecosystem.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What I bring
&lt;/h1&gt;

&lt;p&gt;I think my background gives me an unusual combination of experiences.&lt;/p&gt;

&lt;p&gt;I've spent more than 20 years writing software.&lt;/p&gt;

&lt;p&gt;I've created and built a major open-source TypeScript project from the ground up.&lt;/p&gt;

&lt;p&gt;I've spent years working directly with developers and contributors.&lt;/p&gt;

&lt;p&gt;I've designed APIs that have been used in real-world applications.&lt;/p&gt;

&lt;p&gt;I've experimented with new developer-experience patterns.&lt;/p&gt;

&lt;p&gt;I've written multiple technical books.&lt;/p&gt;

&lt;p&gt;I've been a Microsoft MVP.&lt;/p&gt;

&lt;p&gt;And along the way, I've ended up going very deep into areas I originally had no particular intention of becoming an expert in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;decorators, metadata, reflection, type systems, compiler integration and the relationship between compile-time types and runtime JavaScript.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't set out to become a TypeScript language/tooling expert.&lt;/p&gt;

&lt;p&gt;I was trying to build useful developer tools.&lt;/p&gt;

&lt;p&gt;The technical depth came from having to solve the problems those tools created.&lt;/p&gt;

&lt;p&gt;And I think that's an important part of what I can offer.&lt;/p&gt;




&lt;h1&gt;
  
  
  I'm looking for the right problem, not just the right title
&lt;/h1&gt;

&lt;p&gt;I could update my CV and start applying to jobs.&lt;/p&gt;

&lt;p&gt;But I'm not sure that's the best way to find this particular kind of role.&lt;/p&gt;

&lt;p&gt;I'm not looking for just any job.&lt;/p&gt;

&lt;p&gt;I'm looking for a team where this rather unusual combination of experience is useful.&lt;/p&gt;

&lt;p&gt;I've spent years building a developer tool from scratch, evolving its APIs, working with its community, dealing with real-world developer feedback and becoming deeply familiar with the technical machinery underneath TypeScript and Node.js.&lt;/p&gt;

&lt;p&gt;I suspect there are teams out there where that experience would be extremely useful.&lt;/p&gt;

&lt;p&gt;I just don't necessarily know where all of them are.&lt;/p&gt;

&lt;p&gt;So I'm hoping that someone reading this will think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Wait, this sounds like something our team needs."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe that's at a large company working on developer infrastructure.&lt;/p&gt;

&lt;p&gt;Maybe it's a team working on TypeScript, JavaScript, Node.js, VS Code, developer productivity or developer platforms.&lt;/p&gt;

&lt;p&gt;Maybe it's a company I've never heard of.&lt;/p&gt;

&lt;p&gt;Maybe it's a role that doesn't exist yet.&lt;/p&gt;




&lt;h1&gt;
  
  
  Where?
&lt;/h1&gt;

&lt;p&gt;I'm based in the &lt;strong&gt;Irish countryside&lt;/strong&gt;, so I can only consider &lt;strong&gt;fully remote roles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'm absolutely fine with occasional travel for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;team gatherings&lt;/li&gt;
&lt;li&gt;conferences&lt;/li&gt;
&lt;li&gt;planning sessions&lt;/li&gt;
&lt;li&gt;customer or developer meetings&lt;/li&gt;
&lt;li&gt;important face-to-face events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm just not looking for a role that requires regular commuting to an office.&lt;/p&gt;

&lt;p&gt;Remote-first is therefore an important constraint for me.&lt;/p&gt;




&lt;h1&gt;
  
  
  If this sounds like you
&lt;/h1&gt;

&lt;p&gt;If you work on developer tooling, TypeScript, Node.js, compilers, developer productivity, APIs, SDKs, frameworks or developer platforms, &lt;strong&gt;I'd genuinely love to hear from you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Especially if you work somewhere that values people who can move between:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;technical architecture ↔ API design ↔ developer experience ↔ product direction ↔ open-source/community&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you know of a team that might be a good fit, please reach out!&lt;/p&gt;

</description>
      <category>career</category>
      <category>typescript</category>
      <category>whoishiring</category>
      <category>devrel</category>
    </item>
    <item>
      <title>AI Code Is No Longer Slop</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Sat, 29 Aug 2026 07:39:55 +0000</pubDate>
      <link>https://dev.to/remojansen/ai-code-is-no-longer-slop-41hg</link>
      <guid>https://dev.to/remojansen/ai-code-is-no-longer-slop-41hg</guid>
      <description>&lt;p&gt;In December 2025 I wrote that Claude Opus 4.5 changed everything. I had been using AI coding tools since the beginning. They were useful, but they were also unreliable. The working pattern was defensive: stage every change, review every prompt, stay on feature branches, lean hard on CI, and be ready to roll back.&lt;/p&gt;

&lt;p&gt;Then I spent serious time with Opus 4.5.&lt;/p&gt;

&lt;p&gt;What shifted was not that the model suddenly produced perfect software. It still didn’t. What shifted was the economics of my own time. I could describe &lt;em&gt;why&lt;/em&gt; I wanted something instead of spelling out every implementation detail. The agent could plan, write, test, and iterate. I spent more of my day reviewing results, thinking about architecture, and deciding what should be built next.&lt;/p&gt;

&lt;p&gt;I wrote at the time:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Suddenly, when you are running 6 AI agents in parallel, it is like freaking horizontally scaling yourself.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was my personal inflection point — the moment AI-assisted development stopped feeling like a productivity experiment and started feeling like a fundamental change in how software could be built.&lt;/p&gt;

&lt;p&gt;It was still only my experience. I could have been unusually tolerant of AI-generated code. Then July 2026 happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Linux moment
&lt;/h2&gt;

&lt;p&gt;On July 14, 2026, Linus Torvalds replied to a discussion on the Linux kernel mailing list about LLM-based tooling for maintainers. The thread included familiar anti-LLM concerns and the question of whether such tools should simply be avoided.&lt;/p&gt;

&lt;p&gt;Torvalds was direct:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Linux is not one of those anti-AI projects”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI is a tool, just like other tools we use. And it’s clearly a useful one.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is not a random developer saying AI is handy. This is the person who created and still shepherds the Linux kernel.&lt;/p&gt;

&lt;p&gt;That is why this matters more than my December experience. My moment was personal. This is a project-level signal from one of the most consequential figures in open-source software.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the original
&lt;/h3&gt;

&lt;p&gt;I’m not going to paraphrase the email and pretend the surrounding context is irrelevant. Read the full message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Subject: Re: Linking Patchwork with Sashiko?&lt;br&gt;
Date: Tue, 14 Jul 2026 20:06:14 -0700 [thread overview]&lt;br&gt;
Message-ID:  (raw)&lt;br&gt;
In-Reply-To: &lt;a href="mailto:4928C919-7999-4E76-ADCB-F8643FED105B@linux.dev"&gt;4928C919-7999-4E76-ADCB-F8643FED105B@linux.dev&lt;/a&gt;&lt;br&gt;
On Tue, 14 Jul 2026 at 19:01, Roman Gushchin &lt;a href="mailto:roman.gushchin@linux.dev"&gt;roman.gushchin@linux.dev&lt;/a&gt; wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I think it makes the point of sashiko - helping maintainers - unachievable. If the point to not use&lt;br&gt;
LLMs in general, let’s discuss this, not how to make each use case more complex.&lt;/p&gt;

&lt;p&gt;It seems like [1]  expresses a very anti-LLM position in general&lt;br&gt;
Yes.&lt;br&gt;
And no, that's not the position of the Linux kernel.&lt;br&gt;
I realize that some people really dislike AI, but this is an area&lt;br&gt;
where I'm willing to absolutely put my foot down as the top-level&lt;br&gt;
maintainer.&lt;br&gt;
Linux is not one of those anti-AI projects, and if somebody has issues&lt;br&gt;
with that, they can do the open-source thing and fork it.&lt;br&gt;
Or just walk away.&lt;br&gt;
AI is a tool, just like other tools we use.  And it's clearly a useful one.&lt;br&gt;
It may not have been that "clearly" even just a year ago, but it's no&lt;br&gt;
longer in question today.&lt;br&gt;
There are other questions around AI (like what the economy of it will&lt;br&gt;
actually look like in the end), but "is it useful" is no longer one of&lt;br&gt;
those questions. Anybody who doubts that clearly hasn't actually used&lt;br&gt;
it.&lt;br&gt;
Yes, it can also be a somewhat painful tool, both for maintainer&lt;br&gt;
workloads and just from a "it keeps finding embarrassing bugs"&lt;br&gt;
standpoint.&lt;br&gt;
But the solution is not to put your head in the sand and sing "La La&lt;br&gt;
La, I can't hear you" at the top of your voice like some people seem&lt;br&gt;
to do.&lt;br&gt;
The solution is to make sure those LLM tools &lt;em&gt;help&lt;/em&gt; maintainers&lt;br&gt;
instead of just causing them pain. There's no question on that side.&lt;br&gt;
We're not forcing anybody to use it, but I will very loudly ignore&lt;br&gt;
people who try to argue against other people from using it.&lt;br&gt;
And no, AI isn't perfect. But Christ, anybody who points to the&lt;br&gt;
problems at AI had better be looking in the mirror and pointing at&lt;br&gt;
themselves at the same time.&lt;br&gt;
Because it's not like natural intelligence is always all that great either.&lt;br&gt;
The kernel project has been and will continue to be about the technology.&lt;br&gt;
Sure, the social angle of working on open source is important and&lt;br&gt;
often a very motivating part of the project, but in the end that's a&lt;br&gt;
side benefit, not the &lt;em&gt;point&lt;/em&gt; of the project.&lt;br&gt;
This is &lt;em&gt;NOT&lt;/em&gt; some kind of "social warrior" project, never has been,&lt;br&gt;
and never will be.&lt;br&gt;
In the kernel community we do open source because it results in better&lt;br&gt;
technology, not because of religious reasons.&lt;br&gt;
And so we make decisions primarily based on technical merit. Not fear&lt;br&gt;
of new tools.&lt;br&gt;
              Linus&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;What struck me most is that Torvalds does &lt;strong&gt;not&lt;/strong&gt; claim AI is perfect. He talks about the problems it creates — embarrassing bugs, extra workload for maintainers, the risk of noise. His conclusion is not “AI is dangerous, therefore ban it.” It is closer to “AI is useful, therefore figure out how to make it work.”&lt;/p&gt;

&lt;p&gt;That is a meaningful distinction.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI still produces bad code
&lt;/h2&gt;

&lt;p&gt;The conversation around “AI slop” has gone sideways.&lt;/p&gt;

&lt;p&gt;AI can still produce code that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unnecessarily complicated&lt;/li&gt;
&lt;li&gt;subtly wrong&lt;/li&gt;
&lt;li&gt;insecure&lt;/li&gt;
&lt;li&gt;poorly structured&lt;/li&gt;
&lt;li&gt;hard to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have seen all of those. I still review every change. I still rely on tests and CI. I still throw away AI-generated work when it is not good enough.&lt;/p&gt;

&lt;p&gt;None of that contradicts the claim that AI has become an extremely useful engineering tool. In some ways it is &lt;em&gt;why&lt;/em&gt; the tool is useful: we have gotten better at using it &lt;em&gt;despite&lt;/em&gt; its failure modes.&lt;/p&gt;

&lt;p&gt;The important fact is not that AI never makes mistakes. The important fact is that the cost of generating, evaluating, and discarding candidates has fallen far enough that the overall process is now productive.&lt;/p&gt;

&lt;h2&gt;
  
  
  “AI-generated” is not a quality metric
&lt;/h2&gt;

&lt;p&gt;Imagine opening a pull request and saying: “This was written by AI, so it’s slop.”&lt;/p&gt;

&lt;p&gt;That is not a technical review.&lt;/p&gt;

&lt;p&gt;A technical review asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the implementation correct?&lt;/li&gt;
&lt;li&gt;Does it meet the requirements?&lt;/li&gt;
&lt;li&gt;Is the architecture appropriate?&lt;/li&gt;
&lt;li&gt;Is it tested?&lt;/li&gt;
&lt;li&gt;Is it secure?&lt;/li&gt;
&lt;li&gt;Is it maintainable?&lt;/li&gt;
&lt;li&gt;Does it add unnecessary complexity?&lt;/li&gt;
&lt;li&gt;Does it fit the existing system?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Was an LLM involved?” can be useful context. It is not a quality judgment.&lt;/p&gt;

&lt;p&gt;Humans have produced terrible software for decades. We do not call it “human slop.” We call it bad code, review it, fix it, or delete it. The same standard should apply to AI-generated code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real change is the cost of another attempt
&lt;/h2&gt;

&lt;p&gt;The biggest shift is not that AI can write code. We have known that for years. The shift is that the cost of producing &lt;em&gt;another&lt;/em&gt; implementation has collapsed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want a different approach? Ask the agent.
&lt;/li&gt;
&lt;li&gt;Want to prototype an API? Ask the agent.
&lt;/li&gt;
&lt;li&gt;Want to migrate off a deprecated framework? Ask the agent.
&lt;/li&gt;
&lt;li&gt;Want to explore an unfamiliar codebase? Ask the agent.
&lt;/li&gt;
&lt;li&gt;Want tests for an edge case? Ask the agent.
&lt;/li&gt;
&lt;li&gt;Want to throw the whole thing away and try again? Do it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not make engineering judgment less important. It makes it &lt;em&gt;more&lt;/em&gt; important.&lt;/p&gt;

&lt;p&gt;When implementation becomes cheap, deciding &lt;em&gt;what&lt;/em&gt; to implement becomes more valuable. Architecture, requirements, code review, testing, domain knowledge, and the ability to recognize bad solutions all rise in relative value.&lt;/p&gt;

&lt;p&gt;In December 2025 the story was capability: multiple agents, dramatically higher throughput, less time spent on repetitive implementation, more time spent on product thinking and review.&lt;/p&gt;

&lt;p&gt;In July 2026 the story became acceptance: one of the world’s most important open-source projects is not going to reject the technology on ideological grounds.&lt;/p&gt;

&lt;p&gt;Capability plus acceptance is a stronger signal than either alone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>Developers that brand AI as slop will be left behind</title>
      <dc:creator>Remo H. Jansen</dc:creator>
      <pubDate>Fri, 28 Aug 2026 14:33:08 +0000</pubDate>
      <link>https://dev.to/remojansen/developers-that-brand-ai-as-slop-will-be-left-behind-2ki4</link>
      <guid>https://dev.to/remojansen/developers-that-brand-ai-as-slop-will-be-left-behind-2ki4</guid>
      <description>&lt;p&gt;A few days ago I &lt;a href="https://github.com/inversify/monorepo/issues/2086" rel="noopener noreferrer"&gt;shared&lt;/a&gt; an architectural proposal for InversifyJS on Reddit. It outlined an IPC-based type server that could help Inversify move beyond the legacy TypeScript decorator metadata APIs toward something compatible with TC39 decorators and TypeScript’s next-generation compiler.&lt;/p&gt;

&lt;p&gt;The first comment was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI slop&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I ignored it and went back to work.&lt;/p&gt;

&lt;p&gt;That night I built &lt;a href="https://github.com/remojansen/rflct" rel="noopener noreferrer"&gt;rflct&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It isn’t perfect. It’s an alpha with plenty of rough edges. But the fact that an architectural idea can become a working repository—with a runtime, compiler-side implementation, types, tests, examples, and a CLI—in a couple of hours is still mind-blowing to me.&lt;/p&gt;

&lt;p&gt;I have a particular perspective on this because I built Inversify from the ground up. It’s been a roughly ten-year journey. Early feedback was often negative. Plenty of things weren’t right, and plenty of things I didn’t know yet. Today Inversify has around 500,000 daily downloads and is used by projects including Elastic and the Eclipse Foundation.&lt;/p&gt;

&lt;p&gt;One of the things Inversify did well was listening to users. The best way to get that feedback is to put something real in their hands—not when it’s perfect, not when you’re completely proud of it, and not after months of polishing. Early. Sometimes so early it isn’t pretty yet.&lt;/p&gt;

&lt;p&gt;That is where AI changes software development most.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI makes experimentation cheap
&lt;/h2&gt;

&lt;p&gt;Before AI, turning an architectural hypothesis into something executable carried a real cost: research the APIs, design the architecture, write the code, debug it, build tests, and work through the edge cases. When experimentation is expensive, developers become conservative. You pick one idea, spend days or weeks on it, and only then discover whether it works.&lt;/p&gt;

&lt;p&gt;AI collapses that cost. It is no longer primarily about typing code faster. &lt;strong&gt;It is about making the loop from “I wonder if this would work?” to “Let’s build it and find out” dramatically cheaper.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the part many people are underestimating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Inversify problem is real
&lt;/h2&gt;

&lt;p&gt;Inversify was built around TypeScript’s experimental decorator and metadata capabilities. Constructor injection could infer parameter types and deliver a pleasant developer experience. But the ecosystem has moved on. TC39 decorators do not provide the same parameter decorator mechanism, and the &lt;code&gt;design:paramtypes&lt;/code&gt; metadata Inversify historically relied on belongs to the legacy decorator world. At the same time, TypeScript’s next-generation compiler (&lt;code&gt;tsgo&lt;/code&gt;) is introducing an IPC-based extensibility model.&lt;/p&gt;

&lt;p&gt;The RFC I shared explored whether a resident type server, queried over IPC, could recover the type information needed for dependency injection at build time. It was deliberately exploratory—open questions, things that needed prototyping, things that could be wrong. That’s the point of an RFC.&lt;/p&gt;

&lt;p&gt;Someone looked at it and decided the most useful feedback was “AI slop.”&lt;/p&gt;

&lt;p&gt;So I built something concrete instead.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rflct&lt;/code&gt; is an experiment in ahead-of-time reflection metadata for TypeScript 7. Instead of relying on runtime decorator metadata, it generates the metadata at build time. I didn’t need AI to identify the problem or decide the architectural questions were worth exploring. Those existed before the AI. What changed was the cost of turning the ideas into something I could run, test, and put in front of other developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The value moved up the stack
&lt;/h2&gt;

&lt;p&gt;When writing code becomes cheaper, writing code is no longer the scarce resource. The valuable part of the job moves upward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What problem are we solving?&lt;/li&gt;
&lt;li&gt;Is this the right problem?&lt;/li&gt;
&lt;li&gt;Is this architecture reasonable?&lt;/li&gt;
&lt;li&gt;What are the constraints and assumptions?&lt;/li&gt;
&lt;li&gt;What should be tested—and what should not be built?&lt;/li&gt;
&lt;li&gt;How do we know the result is correct?&lt;/li&gt;
&lt;li&gt;What happens in production, and what are the failure modes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An LLM can generate a function, a module, or an entire repository. Generating a lot of code does not tell you whether you should have generated any of it. That judgment is still yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  “But you didn’t write the code”
&lt;/h2&gt;

&lt;p&gt;We have spent decades building abstractions that generate code for us: compilers, IDEs, code generators, frameworks, and libraries containing millions of lines we do not personally maintain. Nobody asks whether a developer typed every instruction the CPU executes. We care whether the software works, whether it is maintainable, whether the architecture is sound, whether it solves the problem, and whether the person responsible understands what they are shipping.&lt;/p&gt;

&lt;p&gt;If you generate 20,000 lines with AI and understand none of it, you have a problem. If you use AI to explore an architecture, inspect the output, run it, test it, discard bad approaches, modify it, and ultimately understand the result, the provenance of individual keystrokes is not particularly interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  “AI slop” is not a technical critique
&lt;/h2&gt;

&lt;p&gt;AI slop is real. Developers are generating applications they do not understand. People are opening pull requests with thousands of unreviewed lines. Documentation confidently describes APIs that do not exist. People are building things because an LLM suggested them rather than because they understood the problem.&lt;/p&gt;

&lt;p&gt;None of that is controversial.&lt;/p&gt;

&lt;p&gt;There is a large difference, however, between observing that a lot of low-quality AI-generated software exists and declaring that AI-generated software &lt;em&gt;is&lt;/em&gt; slop. The first is an observation. The second is a prejudice.&lt;/p&gt;

&lt;p&gt;I have seen far worse code on GitHub than &lt;code&gt;rflct&lt;/code&gt;, and it was written entirely by humans. Unreviewed pull requests, copy-pasted Stack Overflow solutions, frameworks held together by wishful thinking, and entire applications whose authors clearly did not understand the systems they were shipping. Low quality is not a new invention of large language models. The difference is that AI makes it easier to produce more of it, faster. That is a real problem. It is not a reason to stop evaluating the actual architecture, the tests, or the trade-offs.&lt;/p&gt;

&lt;p&gt;If you think an architecture is wrong, say why. If the assumptions about TypeScript are flawed, show the evidence. If there is a race condition, a bad API, a performance problem, or a failure case, demonstrate it. That is how software engineering works.&lt;/p&gt;

&lt;p&gt;“AI slop” identifies none of those things. It tells you how the reviewer feels about the tool that was used. Feeling is not the same as review.&lt;/p&gt;

&lt;h2&gt;
  
  
  We have seen this movie before
&lt;/h2&gt;

&lt;p&gt;Software developers have a long history of dismissing new approaches before eventually adopting them: new languages, frameworks, paradigms, static typing, functional programming, managed runtimes, garbage collection, WebAssembly, containers, serverless. Each transition produces a group that correctly identifies real limitations. There is a difference, though, between understanding the limitations of a technology and refusing to engage with it because you dislike the technology.&lt;/p&gt;

&lt;p&gt;AI is going through the same process. The people who dismiss it completely are going to have a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The productivity gap will compound
&lt;/h2&gt;

&lt;p&gt;Imagine two developers.&lt;/p&gt;

&lt;p&gt;Developer A decides AI-generated code is inherently bad and refuses to use it.&lt;/p&gt;

&lt;p&gt;Developer B uses AI aggressively but reviews everything: generates prototypes, investigates unfamiliar APIs, writes tests, explores alternatives, throws away most of what is produced, keeps what works, and still understands the system.&lt;/p&gt;

&lt;p&gt;After one day, B may have explored five ideas while A has explored one. After a week the gap is larger. After a month it is larger still.&lt;/p&gt;

&lt;p&gt;The advantage compounds because the scarce resource is not typing speed. It is &lt;strong&gt;iteration speed&lt;/strong&gt;. The faster you can move from idea to evidence, the more ideas you can evaluate, and the more likely you are to find something valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI amplifies the developer
&lt;/h2&gt;

&lt;p&gt;This does not mean AI will make everyone a great developer. Quite the opposite. AI can make a bad developer dramatically more productive at producing bad software. If you do not understand architecture, AI can generate an architecture you do not understand even faster. If you cannot review code, AI simply gives you more code to fail to review.&lt;/p&gt;

&lt;p&gt;AI amplifies the developer. That is why engineering judgment becomes more important, not less.&lt;/p&gt;

&lt;p&gt;The future is not “AI writes the software and developers sit back.” It is closer to this: developers who know what they are doing can use AI to explore and execute at a speed that was not previously possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  I would rather build and be wrong
&lt;/h2&gt;

&lt;p&gt;Maybe &lt;code&gt;rflct&lt;/code&gt; is a terrible idea. Maybe the architecture needs to change completely. Maybe TypeScript 7 will evolve in a direction that makes the experiment irrelevant. That is fine.&lt;/p&gt;

&lt;p&gt;I now have something concrete that can be run, benchmarked, broken, changed, and inspected by others. That feedback loop is infinitely more useful than an argument on Reddit.&lt;/p&gt;

&lt;p&gt;AI has lowered the cost of turning ideas into software. We can try more things, fail faster, learn faster, and build things that previously were not worth the investment. Developers who spend their energy dismissing all of this as “AI slop” are going to discover that the world moved on without them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers that brand AI as slop will be left behind.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>opensource</category>
      <category>career</category>
    </item>
  </channel>
</rss>
