{
    "componentChunkName": "component---src-templates-post-template-js",
    "path": "/en/you-can-fork-a-package-but-can-you-own-it/",
    "result": {"data":{"post":{"id":"4c1b5e1d-76dc-5ae5-b1ee-4f1081f10063","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; height: auto\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/e6c27458745f718fad8a8b622583ec26/8fe94/2026-06-08-cover.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 67%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAAB2/lNSojI/8QAGhAAAgMBAQAAAAAAAAAAAAAAAAECBBEDFP/aAAgBAQABBQLlYlFO1h7GI3G4H//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABYRAQEBAAAAAAAAAAAAAAAAAAARAf/aAAgBAgEBPwGJj//EABkQAAIDAQAAAAAAAAAAAAAAAAABEBExcf/aAAgBAQAGPwKmYYh8HH//xAAbEAADAQEAAwAAAAAAAAAAAAABESEAMUFxgf/aAAgBAQABPyHoivHFud2h9wo1afvFH1W6zBT8Lf/aAAwDAQACAAMAAAAQYP8A/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAER/9oACAEDAQE/EKys/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/EEbD/8QAHRABAQACAgMBAAAAAAAAAAAAAREAIaGxMUFRYf/aAAgBAQABPxDQooq1T5ivY7BAD8twFi9WN94ghQPVXTgxPHARsNN9c4SREXQzP//Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"cover\"\n        title=\"cover\"\n        src=\"/static/e6c27458745f718fad8a8b622583ec26/c60e9/2026-06-08-cover.jpg\"\n        srcset=\"/static/e6c27458745f718fad8a8b622583ec26/37402/2026-06-08-cover.jpg 200w,\n/static/e6c27458745f718fad8a8b622583ec26/4cda9/2026-06-08-cover.jpg 400w,\n/static/e6c27458745f718fad8a8b622583ec26/c60e9/2026-06-08-cover.jpg 800w,\n/static/e6c27458745f718fad8a8b622583ec26/6c738/2026-06-08-cover.jpg 1200w,\n/static/e6c27458745f718fad8a8b622583ec26/56dca/2026-06-08-cover.jpg 1600w,\n/static/e6c27458745f718fad8a8b622583ec26/8fe94/2026-06-08-cover.jpg 2048w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<blockquote>\n<p>Fork your dependencies, trim them to only your use case, never update unless it breaks for your users. I’ve been vocal about this for 10+ years. I’ve always said that updating is way riskier than latent bugs (which can be tracked and CVEs monitored).</p>\n<p>If you are updating a dependency, it’s on you to analyze every single commit in the full transitive set of dependencies. If you dont see anything compelling, dont update!</p>\n<p>I remember at HashiCorp once in awhile an engineer would try to update a dep or replace a DIY lib with an external one and id always ask “show me the commit we need.” Dont update for the sake of it.</p>\n<p>Feeling pretty swell about this mentality with all the supply chain attacks happening.</p>\n</blockquote>\n<p><strong><a href=\"https://x.com/mitchellh/status/2057171518027887035\">That’s from Mitchell Hashimoto</a>. A friend sent it to me, and the first word he reached for was bold.</strong> Mine too. I mostly agree with him, honestly. But the second I read it, my head jumped to a caveat, and the caveat turned out to be the thing I actually wanted to write about.</p>\n<p><strong>You can fork a small library and trim it to what you use. I’ve done it, it’s fine. But could you fork React and maintain it?</strong> I couldn’t. I don’t think most teams could either. So “fork your dependencies” is wonderful advice right up to the point where the dependency is too big to hold in your hands, and then it quietly stops being advice at all.</p>\n<p>And that caveat says something about the advice itself. I think that it was never really about forking. It’s about knowing exactly what you’ve taken on and being willing to own it, and that’s the bit most of us skip. We don’t <em>decide</em> to take a dependency. We install one. And almost everything that goes wrong with dependencies:</p>\n<ul>\n<li>the supply chain attacks,</li>\n<li>the licence dramas,</li>\n<li>the half-finished SBOMs,</li>\n<li>the things you find out about only after they break</li>\n</ul>\n<p>comes back to that one move: we took dependence on someone else’s product without ever deciding to. Everything else here is a variation on it.</p>\n<h2 id=\"to-fork-or-not\" style=\"position:relative;\"><a href=\"#to-fork-or-not\" aria-label=\"to fork or not permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>To fork or not?</h2>\n<p>I was reminded of this not long ago. I was doing a live Q&#x26;A about my TypeScript port of some code, and a whole chunk of it was one question asked five different ways:</p>\n<blockquote>\n<p>Why did you write your own <code class=\"language-text\">deepEquals</code> instead of just pulling a <a href=\"https://www.npmjs.com/package/deep-equal\">package</a>?</p>\n</blockquote>\n<p>I tried to explain that it wasn’t laziness, and it wasn’t not-invented-here pride either. I explained that it’s the code I write once and forget. Of course, it’ll take some time, but not that long as you might think. The reception was, let’s say, mixed. I get it, it’s much easier to just install a package and outsource maintenance. Especially when you’re in a hurry, you don’t decide anything. You reach. And this reach can be a decent interim solution, but then you should reflect on yourself on the next step.</p>\n<p><strong>Why do I reach for my own code on the small stuff?</strong> Look at which packages actually get hit in all these supply chain attacks we keep reading about. It’s almost always the little ones. The one-liners. Remember the <a href=\"https://en.wikipedia.org/wiki/Npm_left-pad_incident\">Left-pad Incident</a>? It’s usually some tiny or low-level helper nobody thinks about. They’re everywhere, they’re trivial, and precisely because they’re trivial, nobody is watching them. Which is also exactly why they’re so easy to write yourself. So for me, handwriting a small helper isn’t paranoia. It’s the calmer option, and it’s one of the few cases where I know exactly what’s in my own system.</p>\n<p>That’s also why, in <a href=\"https://github.com/event-driven-io/emmett\">Emmett, my Event Sourcing library,</a> I’m almost stubborn about keeping the core package free of dependencies and limiting whatever I inject elsewhere. Probably too stubborn, if I’m honest. But I’d rather err that way, because when it goes wrong on the user’s side, it goes wrong far worse than a bit of code I maintain myself. It’s about responsibility for the outcome of your actions.</p>\n<p>If I had to compress what I believe into one line, it wouldn’t be “fork everything”, and it wouldn’t be “write everything yourself”. It would be something duller than both:</p>\n<p>Be precise about which dependencies you take on, look at how many dependencies your dependencies pull in, and treat that as part of the decision.</p>\n<p>The number itself isn’t the point. It just tells you how much you’re agreeing to own without ever seeing it.</p>\n<p>Because your direct dependencies were never the worst part. You chose those. Most of the time, you can read them, and you can follow what they’re doing. The scary part is the dependencies of your dependencies, and theirs, all the way down, the part you didn’t choose, can’t see, and have no say over.</p>\n<p>And I want to be careful here, because it’s easy to let this slide into another round of JavaScript-bashing, and that’s not what I mean. Every ecosystem has this. JS and TypeScript just sit at one far end of it, where there’s a package for absolutely everything. Which is good, in general, you’re not rebuilding the wheel every other week, the way you are in some other places. But it’s also how you end up with a node_modules you couldn’t fully explain if someone put a gun to your head.</p>\n<p>At the other extreme, there’s Microsoft and .NET, where the instinct runs so hard the opposite way that it tips into <a href=\"https://en.wikipedia.org/wiki/Not_invented_here\">Not Invented Here Syndrome</a>. Neither end is the “right” one. They’re both defaults people drift into without ever making a call.</p>\n<p><strong>So for me, it’s not about reaching zero dependencies. But having dependencies that we cautiously agreed upon.</strong></p>\n<p>Which takes me to the part that, in my experience, almost nobody does. You can’t make a call on what you can’t see, and if you don’t even have the basic knowledge (e.g. some list) of what you depend on, then every conversation about supply chain risk is a bit of theatre.</p>\n<h2 id=\"dependency-inventory\" style=\"position:relative;\"><a href=\"#dependency-inventory\" aria-label=\"dependency inventory permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Dependency Inventory</h2>\n<p><strong>In most of the environments, <a href=\"https://openssf.org/technical-initiatives/sbom-tools/\">there are tools</a> to generate the <a href=\"https://github.com/resources/articles/what-is-an-sbom-software-bill-of-materials\">Software Bill of Materials</a> - the inventory of your dependency tree.</strong> In some, they’re even built in. It’s easy to dunk on NPM, but it’d be better to do due diligence before doing so. Not many people seem to know this, but recent versions of npm ship an <a href=\"https://docs.npmjs.com/cli/v11/commands/npm-sbom\">npm sbom</a>. So the tooling exists, even in NPM. That isn’t the problem.</p>\n<p>The problem is that most organisations have never generated one in their life. No SBOM, no inventory, nothing written down anywhere. So the day the next <a href=\"https://en.wikipedia.org/wiki/Log4Shell\">Log4Shell</a> lands, and there will be a next one, they can’t answer the very first question anyone will ask them: do we run this, and if so, where?</p>\n<p><strong>On the other hand, tools often don’t help here, even those built to do so.</strong> <a href=\"https://overreacted.io/npm-audit-broken-by-design/\">NPM audit mostly does the opposite</a>. I honestly can’t remember the last time I installed something, and the audit didn’t immediately tell me to bump a stack of packages. Most of it is false positives, with no real attempt to say how dangerous any of it is. And that lands you in the oldest trap going: if it’s always red, you stop looking at red. So the one signal that was supposed to make you stop and decide ends up training everyone to decide nothing.</p>\n<h2 id=\"bus-factor-and-rug-pulls\" style=\"position:relative;\"><a href=\"#bus-factor-and-rug-pulls\" aria-label=\"bus factor and rug pulls permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Bus factor and rug pulls</h2>\n<p>There’s a related thing I can’t quite leave alone, so let me wander into it. I think a lot of teams spend their energy on the symptom and never once look at the source.</p>\n<p>Watch what happens in the .NET world whenever a popular package changes the deal. <a href=\"https://www.infoq.com/news/2025/01/fluent-assertions-v8-license/\">Fluent Assertions</a> went commercial. <a href=\"https://snyk.io/blog/moq-package-exfiltrates-user-emails/\">Moq shipped a thing that quietly hashed your git email and phoned it home</a>. MassTransit and <a href=\"https://www.jimmybogard.com/automapper-and-mediatr-going-commercial/\">AutoMapper</a> announced commercial licenses within the same stretch. And nearly every time, the reaction across .NET shops is identical. It’s a mixture of:</p>\n<ul>\n<li>let’s rip it out and write their own,</li>\n<li>search for a free alternative,</li>\n<li>Cry to Microsoft to buy the lib or provide a replacement,</li>\n</ul>\n<p>Essentially: a throw-the-baby-out-with-the-bathwater strategy.</p>\n<p>And for me, that’s solving the wrong thing entirely. The source isn’t that the package started charging money, or pulled a rug. <strong>The source is that we took on a critical dependency without ever admitting to ourselves that it was critical, and never once thought about what we’d do if the terms changed.</strong> We didn’t consider the bus factor, and we didn’t do due diligence to ensure the work on it was sustainable and could continue. Pulling it out and hand-rolling a replacement fixes none of that. It just resets the same trap, this time with only the code we maintain.</p>\n<p><a href=\"https://www.identityserver.com/articles/identityserver-vnext-duende-identityserver\">The IdentityServer episode</a> was the clearest version of it I’ve seen. People were upset that they had to pay suddenly. Then, in the next sentence, calling it a critical security component. Then, in the sentence after that, asking what the free alternatives were. A critical security component that you want for free and are ready to swap out overnight is, to my mind, asking for a security incident.</p>\n<p>And there’s a bit of maths that quietly settles most of these arguments, if anyone bothers to do it. Take what the licence costs you per year. Then take into account what it would cost to have an engineer build and maintain your own version. Put the two side by side.</p>\n<p>Almost every time, paying the maintainer comes out cheaper, and on top of that, you’ve lowered the bus factor on something you already lean on, which is its own kind of supply chain security. “We’d write it ourselves, but then we’d have to maintain it” is true. I just read it as the argument for paying the person who already does, not against it. If you depend on something, its survival is your problem too. That’s part of owning the decision.</p>\n<p><a href=\"https://www.architecture-weekly.com/p/why-open-source-isnt-always-fair\">I know this case too well</a>.</p>\n<h2 id=\"llm-as-a-fork\" style=\"position:relative;\"><a href=\"#llm-as-a-fork\" aria-label=\"llm as a fork permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>LLM as a fork</h2>\n<p>Getting back to Mitchell’s thought. The part I find most interesting is because of the moment we’re in. I keep hearing that LLMs change all of this, that writing your own small things is suddenly trivial, so the whole dependency question softens. I don’t buy it. It’s never that easy. Writing the small thing was never the hard part anyway. Owning it, understanding it, maintaining it, being the one on the hook when it breaks at 2 am, that’s the hard part, and no model takes that off your plate.</p>\n<p>I don’t see how LLMs can change the cost of owning code. They can (<a href=\"https://www.architecture-weekly.com/p/the-end-of-coding-wrong-question\">maybe</a>) change the cost of producing it. That doesn’t fix the “install without deciding”. The old move was install and move on. The new move is “vibe it” and move on. Same missing decision, new flavour. The same lack of responsibility and ownership.</p>\n<p>This trend isn’t new. It’s a classic <a href=\"https://en.wikipedia.org/wiki/Shadow_IT\">Shadow IT</a>. If you haven’t been around long enough to run into the term, Shadow IT refers to the tools and systems people build or adopt within a company without going through whoever is officially meant to approve them. The spreadsheet that quietly runs a whole department. The little script someone wrote on a Friday that half the team now depends on. The integration nobody in the platform group has ever heard of. It has always existed because people route around slow governance to get their job done, and most of the time, nobody notices until it breaks.</p>\n<p>With LLMs, it’s more tempting than it has ever been. Someone in sales promises a customer a feature the team supposedly needs. The team has no time, so they cobble a tool together from the API and ship it. It doesn’t work. The customer says they’re not paying for this. It escalates. The thing was unowned from the moment it was conceived; nobody decided to take it on, it just appeared, and the blame game is starting.</p>\n<p>And here’s where I think it all settles, because the corporate steamroller flattens everything in the end. Companies will dictate the allowed list, the way they always have. The cautious majority will stick to what’s known and popular: React, TypeScript, Python, Spring Boot. That’s what they did last time, and the time before. And the people who want to move faster will do it off the books, with an LLM, as Shadow IT. The declarative, standards-based frameworks that hide their complexity will do well in that world, because that style suits how these tools work, but it’s the same ceiling as before. You bet on React. You don’t own it. The small stuff you can hold; the big stuff stays as bet.</p>\n<h2 id=\"what-to-do-then\" style=\"position:relative;\"><a href=\"#what-to-do-then\" aria-label=\"what to do then permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>What to do then?</h2>\n<p>We cannot fix the entire software industry, but we can fix how our own engineering teams operate. Instead of waiting for automated audits to scream at us, or ripping out packages in an emotional panic, I suggest a simple, regular exercise for your organisation.</p>\n<p>Sit down and explicitly define your dependency posture:</p>\n<ol>\n<li><strong>Inventory:</strong> List the dependencies you use (even without peer dependencies). Use tools <code class=\"language-text\">npm-sbom</code> to actually see what you are pulling in.</li>\n<li><strong>Criticality:</strong> Identify which of these packages are absolutely critical to your system.</li>\n<li><strong>Lifecycle:</strong> Define a clear strategy for upgrading and versioning them. Are you updating just for the sake of it, or are you looking for specific commits like Mitchell suggests?</li>\n<li><strong>The Bus Factor:</strong> Ask yourself: what happens if the author of a critical package gets hit by a bus, burns out, or the tool becomes paid?</li>\n<li><strong>Mitigation:</strong> Decide on a concrete backup plan for that exact scenario. Do you fork it? Do you pay the license fee? Maybe pay earlier for support or help in another way to maintain it.</li>\n<li><strong>Response Time:</strong> Estimate how quickly you can upgrade and deploy the application if a major security breach occurs in a dependency. Also, if the strategy is to use replacement, then how fast will you be able to replace this dependency?</li>\n</ol>\n<p>Building reliable software requires intent. We don’t have to write everything from scratch, but we must be precise about what we bring into our software. Architecture is not just about writing code; it is about choosing which liabilities you are willing to own.</p>\n<p>Cheers!</p>\n<p>Oskar</p>\n<p>p.s. <strong>Ukraine is still under brutal Russian invasion. A lot of Ukrainian people are hurt, without shelter and need help.</strong> You can help in various ways, for instance, directly helping refugees, spreading awareness, putting pressure on your local government or companies. You can also support Ukraine by donating e.g. to <a href=\"https://www.icrc.org/en/donate/ukraine\">Red Cross</a>, <a href=\"https://savelife.in.ua/en/donate/\">Ukraine humanitarian organisation</a> or <a href=\"https://www.gofundme.com/f/help-to-save-the-lives-of-civilians-in-a-war-zone\">donate Ambulances for Ukraine</a>.</p>","excerpt":"Fork your dependencies, trim them to only your use case, never update unless it breaks for your users. I’ve been vocal about this for 1…","fields":{"slug":"/you-can-fork-a-package-but-can-you-own-it/","prefix":"2026-06-08","langKey":"en"},"frontmatter":{"title":"You can fork a package, but can you own it?","author":"oskar dudycz","category":"Software Architecture","disqusId":null,"useDefaultLangCanonical":null,"cover":{"childImageSharp":{"resize":{"src":"/static/e6c27458745f718fad8a8b622583ec26/4fe8c/2026-06-08-cover.jpg"}}}}},"authornote":{"id":"295c4649-a20b-5147-9ca5-5cb77fbcfe66","html":"<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; height: auto\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/f748655e118b2b9d5ce6b7dd6f9f4f85/d2429/2021-10-13-cover.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 55.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAIAAADwazoUAAAACXBIWXMAAA6cAAAOnAEHlFPdAAAChUlEQVQozyXOTU/acBwA4J+FFmgp/5RCX2AlFVgUgxTCYZNA6KZMooPSiAoaZ8bLjTmEbALRePAygyaLBEl0lyWePGji1YsnT8YDBxMTE+9+iiXu+QQPPDw8nJ2dtVqtZrNZr9cbjUYul8tkMvl8vt1un5yc3Nzc3N7eDofDu7u74+Pj+/v7x8fH6+vr8/NzGA6HOzs73W53f3+/0+mUSqVisbi3t3d0dNTv9w8PDy8uLnq93sHBQblcrtfrp6enl5eXrVarUqnA8/OzruvLy8uDwUDTtJmZmWw22+12Nzc3q9VqKpUqFovT09OFQsHr9SaTyZWVlVgspmlaoVCAl5cXRVE4jotGowghiqJIkpybm/N4PAsLCwghRVF0Xff5fHa7HQDi8Xg6nQaASCQCT09PwWAQXrEsa7VaZVlOp9NjY2Nut1uWZYIgWJYVRZEkSYZhLBaL0WgkCCIUCkGv1xMEAcMwo9EIABRFEQQhSVI0GhUEwWAw0DQ9OjqK4zhFUQzD2O12HMc5jhMEAa6urmRZRgglEgmHwzEyMuJyuXZ3d2u12tTUFAAQBOF0Onmep2mae2V6heM4bG1tIYR4nk8kEqIoAkAgEOh0OvF4XJIkADCZTDzPu1wuk8lks9kQQhiGmc1mkiTB65U5zun3+xFCPp+P5znaRquqGg6HcdyIYRiO4+VyeWlp6f+CpmmDwWAxm0VRAFX9kM3mVlfXJidDPv/bN24pHI4kkyrDMCRJjo8HJMnz6dNsq9W2WmmzhWRZB2W1BSaCmqbDxrfK9naj/r2az2fWvxTfvY98La2pakxRJuY/zy4u5jLZtPox/uPnxvp6YTalLurz7WZt8PvX3z/9f7APp/oT02NdAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"cover\"\n        title=\"cover\"\n        src=\"/static/f748655e118b2b9d5ce6b7dd6f9f4f85/a331c/2021-10-13-cover.png\"\n        srcset=\"/static/f748655e118b2b9d5ce6b7dd6f9f4f85/36ca5/2021-10-13-cover.png 200w,\n/static/f748655e118b2b9d5ce6b7dd6f9f4f85/a3397/2021-10-13-cover.png 400w,\n/static/f748655e118b2b9d5ce6b7dd6f9f4f85/a331c/2021-10-13-cover.png 800w,\n/static/f748655e118b2b9d5ce6b7dd6f9f4f85/d2429/2021-10-13-cover.png 805w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Through my window, I see the result of good plans but poor execution. Opposite my flat, there is a partially completed construction place. Buildings were supposed to be eye-catching Mediterranean style apartments.  Delivery date? Two years ago. Actual? More and more unknown.</p>\n<p>Some time ago, I heard that using Event Sourcing makes creating Event-Driven Architecture easier. The arguments were correct, that if we’re already publishing events to trigger business workflows, then at some point, we may want to also store events to not lose information. Agreed. However, I also heard that keeping the state as events will simplify things. We’ll have a source of truth with a record of the system behaviour. This will allow, e.g. to confront the results of the operations with the recorded state. I’d agree with that, with one distinction. It’s easier as long as you already know Event Sourcing.</p>\n<p>Many people in the DDD community claim that the essential is to properly break down the system into autonomous parts called bounded contexts. Once we have it, the rest is secondary and will sort itself out. For sure.</p>\n<p>Many seasoned programmers speak similarly about new technologies. They claim that they can translate past experience into new technologies. That’s true that by analogy, they can catch the big picture quicker. But isn’t it a bold assumption to say that Win.Forms specialist will learn Angular quickly?</p>\n<p>The end result may differ a lot from the initial ideas. I saw the plan of those buildings next to me. Now I can see the effects of the execution. Or actually, the lack.</p>\n<p>I believe that we should carefully acknowledge not only the point of view of our authorities but also their seating point. If we want to find out how to form a wall, do we ask an architect or a foreman? An architect may know the theory, but the practice is what we’re looking for. On the other hand, if you want to know where to put the wall, you prefer the architect to do measurements. At least if you don’t want to have the roof falling to your head.</p>\n<p>After I had torn a ligament in my knee, I went to two qualified orthopedists. One said I should have surgery and do a reconstruction. The second stated that there is no need for that; rehabilitation should be enough. Guess which one had a specialization in surgery and which in rehabilitation?</p>\n<p>People usually give us advice from the point where they’re currently standing. They are entitled to a biased view. An architect who rarely does programming will tend to downplay the value of implementation and tactical patterns. Midlevel developers will focus on technicalities instead of the global system impact. The team manager or consultant will emphasize the importance of soft skills (or esoteric techniques known only to them).</p>\n<p>The truth is that we need all of them. The excellent plan will fall on the bad execution. The best execution for the wrong case will be just a waste of time. We should carefully evaluate the advice considering what we need and what an expert can give us.</p>\n<p>Therefore, when we’re reading an article, watching a talk, let’s also pay attention to the place where the person is standing. The perspective from there may be much different from where we are right now. That can be good, as it may push us in the right direction. But it may also be misleading, as we accidentally take biases of this person without understanding the tradeoffs. Personally, I prefer to follow not only people from pedestal but also those that are closer to my position. A bit further in the journey, but not too far. That helps me to calibrate my view as those people are more relative to my daily struggles.</p>\n<p>Polish historical leader <a href=\"https://en.wikipedia.org/wiki/J%C3%B3zef_Pi%C5%82sudski\">Józef Piłsudzki</a> reportedly used to say: <em>“Right is like an ass, everyone has its own”</em>.</p>\n<p>Cheers!</p>\n<p>Oskar</p>"},"site":{"siteMetadata":{"facebook":{"appId":""}}}},"pageContext":{"slug":"/you-can-fork-a-package-but-can-you-own-it/","lang":"en","langKey":"en","prev":{"id":"74c6b051-31b9-593d-ad2c-2c3be70905d1","fields":{"slug":"/how-soon-is-now-in-postgresql/","prefix":"2026-05-25","source":"posts","langKey":"en"},"frontmatter":{"title":"How soon is now in PostgreSQL?","category":"PostgreSQL"}},"source":"posts"}},
    "staticQueryHashes": ["2742854296"]}