<?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: Damian Kao</title>
    <description>The latest articles on DEV Community by Damian Kao (@damian_kao).</description>
    <link>https://dev.to/damian_kao</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%2F4007124%2F7675b13c-fd5f-49d2-8b1c-6b98baa2b315.png</url>
      <title>DEV Community: Damian Kao</title>
      <link>https://dev.to/damian_kao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/damian_kao"/>
    <language>en</language>
    <item>
      <title>What I Built Inside a Live Company</title>
      <dc:creator>Damian Kao</dc:creator>
      <pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/damian_kao/what-i-built-inside-a-live-company-g4k</link>
      <guid>https://dev.to/damian_kao/what-i-built-inside-a-live-company-g4k</guid>
      <description>&lt;p&gt;I wrote a separate, more personal essay about what it &lt;em&gt;feels&lt;/em&gt; like to build software inside a company that's already running: the live wires, the no-staging discipline, the bug that's someone's morning instead of a ticket. You can read that one here: &lt;a href="https://damiankao.com/writing/building-inside-a-live-company" rel="noopener noreferrer"&gt;Building Inside a Live Company&lt;/a&gt;. This piece is its counterpart, and it is the one to read if you are going to build something similar yourself, because feelings do not transfer but decisions do. So here is the substance: what the constraint actually produced, and which of the choices behind it are worth stealing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are actually building
&lt;/h2&gt;

&lt;p&gt;Start by being clear about what kind of thing this is, because it changes how you build it. It is not an app. An app is a screen with some logic behind it. What a real operation needs is a connected platform: something that takes the business from a customer's first question all the way to a costed, production-ready order, and then learns from how that order actually went. The "and then learns" is the part that turns a tool into a system, and it is the part you have to design for from the start, not bolt on later.&lt;/p&gt;

&lt;p&gt;Underneath everything sits one product-and-cost engine. Parametric templates turn a product's dimensions into a real parts list. A cutting-layout optimizer packs those parts onto material sheets. From there the engine derives cost and price, with an audit trail on every change so you can always answer "why is this the number." Built on that same engine are the things a business actually runs on: quoting and estimates, a sales funnel, factory costing, an agentic layer that can read the system to make recommendations, and a self-service customer portal. The &lt;a href="https://damiankao.com/projects/operations-platform" rel="noopener noreferrer"&gt;full map of the pieces lives on the project page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That is the &lt;em&gt;what&lt;/em&gt;. If you are taking notes, though, copy the decisions, not the parts list. The parts will be different for your business. The decisions are the part that travels.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decisions that mattered, and the ones that will matter for you
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Build one engine, not many.&lt;/strong&gt; The most consequential choice was refusing to let pricing live in more than one place. Every surface, the internal quote builder, the customer portal, the reports, runs through the same costing logic. That is the entire reason a customer can build their own quote without anyone on the team ever fearing it will disagree with what they would have charged. The temptation you will feel is to write a second, simpler version of the logic for the new surface, because it is faster today. Do not. A second implementation of your core is a second source of truth, and it will drift until the gap shows up in front of a customer. I wrote that specific problem up in detail in &lt;a href="https://damiankao.com/writing/one-engine-two-audiences" rel="noopener noreferrer"&gt;one engine, two audiences&lt;/a&gt;. The deeper version of the idea, that pricing, scheduling, and sales all become &lt;em&gt;functions of product data&lt;/em&gt; once you decompose the product, is the whole thesis the &lt;a href="https://damiankao.com/framework" rel="noopener noreferrer"&gt;framework&lt;/a&gt; is built on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do the data before the intelligence.&lt;/strong&gt; If you are anything like me, you will want to build the impressive AI part first, because it is the part you can show people. The work will teach you the order is backwards. The intelligence is only ever as good as the decomposed data underneath it, so months of unglamorous decomposition have to come before anything that looks clever. I learned this the slow way and gave it &lt;a href="https://damiankao.com/notes/data-before-intelligence" rel="noopener noreferrer"&gt;its own note&lt;/a&gt;. The short version for your purposes: if you find yourself reaching for the model before the data is real, you are about to automate your guesses. Stop and do the boring part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ship in small, reversible pieces.&lt;/strong&gt; This one was forced on me by the live constraint, and it turned out to be a gift in disguise. There is no version where the new system appears one Monday. Every change is to a running machine, so it has to go out small enough to take back. That rules out the heroic rewrite, and it quietly produces a more honest architecture, because you only get to build the piece you can actually prove. Even if you are &lt;em&gt;not&lt;/em&gt; working under a live constraint, impose this one on yourself. The rewrite that ships all at once is the rewrite that fails all at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson that stuck
&lt;/h2&gt;

&lt;p&gt;If I could hand you only one thing from all of this, it would be this. Early on, I found a labor-time estimate I had quietly trusted for years was off by roughly threefold. Nobody had been careless. The number had simply never been made to meet reality. And it surfaced for exactly one reason: actual production data was flowing back and contradicting the estimate, out loud, where I could not ignore it.&lt;/p&gt;

&lt;p&gt;Here is the lesson, and it is the one I would give anyone running a custom shop: &lt;strong&gt;your estimates are wrong in ways you cannot see until reality writes them down.&lt;/strong&gt; Which means the most valuable thing you can build is not a smarter guess. It is the loop that records what actually happened and feeds it back into the next quote. This is why the framework treats &lt;a href="https://damiankao.com/framework" rel="noopener noreferrer"&gt;phases 5 to 7 as a feedback triangle&lt;/a&gt; instead of a pipeline: production truth, quote accuracy, and sales promises are supposed to keep correcting each other. If you build only the forward path, you get a system that quotes confidently and never learns. Wire the loop, and treat the end of every project as the start of the next estimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are building something similar
&lt;/h2&gt;

&lt;p&gt;If you are putting software inside a small operation rather than a greenfield, here is the short list, in the order it matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reuse one engine.&lt;/strong&gt; A second implementation of your core logic is a second source of truth, and it will drift. If a new surface tempts you to fork the logic, give it a new &lt;em&gt;shape&lt;/em&gt; instead, not new logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do the boring data work first.&lt;/strong&gt; It is the part nobody demos and the part everything else depends on. If you cannot price your product from your own notes, you are not ready to build on top of them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship small and reversible.&lt;/strong&gt; The constraint that feels like it is slowing you down is also the thing keeping you honest. If a change cannot be taken back easily, cut it smaller until it can.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the feedback loop early.&lt;/strong&gt; Let the system correct you, instead of trusting yourself to notice you were wrong. You will not notice. That is the whole point of the loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is exotic. It is just what holds up when the thing you are building has to keep working for real people while you are still changing it. None of it is meant to stay locked to one company, either. The reason I write the decisions down rather than just the code is that they should travel to any small manufacturer trying to build the same thing, which is &lt;a href="https://damiankao.com/working-toward" rel="noopener noreferrer"&gt;the larger aim behind all of this&lt;/a&gt;. If you want to see what all of these decisions add up to once they are in place, I wrote about &lt;a href="https://damiankao.com/writing/the-shape-of-the-system" rel="noopener noreferrer"&gt;the shape of the system&lt;/a&gt; the work produced.&lt;/p&gt;

</description>
      <category>operationssoftware</category>
      <category>manufacturing</category>
      <category>buildinginproduction</category>
    </item>
  </channel>
</rss>
