<?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>Forem: Jim Fisher</title>
    <description>The latest articles on Forem by Jim Fisher (@jameshfisher).</description>
    <link>https://forem.com/jameshfisher</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F40587%2Ffa726e93-1157-4f49-8447-6fda6cd5f63a.jpeg</url>
      <title>Forem: Jim Fisher</title>
      <link>https://forem.com/jameshfisher</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jameshfisher"/>
    <language>en</language>
    <item>
      <title>How to evolve a product</title>
      <dc:creator>Jim Fisher</dc:creator>
      <pubDate>Fri, 28 Jun 2024 12:34:42 +0000</pubDate>
      <link>https://forem.com/jameshfisher/how-to-evolve-a-product-52l4</link>
      <guid>https://forem.com/jameshfisher/how-to-evolve-a-product-52l4</guid>
      <description>&lt;p&gt;So you started your startup — now how do you find a great product ASAP? At our startup, Granola, we rapidly &lt;em&gt;evolved&lt;/em&gt; a product using principles from natural selection! We made our software friendly to &lt;em&gt;mutation&lt;/em&gt; by using repetitive code, all in one blob, with no tests. For parallel &lt;em&gt;selection&lt;/em&gt; of the best variants, we manually sent programs to target users. And to make our variants friendly to &lt;em&gt;extinction&lt;/em&gt;, we avoided all launches, landing pages, and docs. Beware: big-company "best practices" make bad early-stage startups!&lt;/p&gt;

&lt;h2&gt;
  
  
  The greatest startup story of all time
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F1_pikaia.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F1_pikaia.avif" alt="Pikaia"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Pikaia (early screenshot)&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;This guy is &lt;em&gt;Pikaia&lt;/em&gt;. He lived around 500 million years ago, grew to around 4cm long, and perhaps swam like an eel. Shortly after, along with most other species, he disappeared.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F2_pioneer.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F2_pioneer.avif" alt="Pioneer plaque"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Pikaia sapiens?&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;And yet &lt;em&gt;Pikaia&lt;/em&gt; lives on: his descendants are you and me, rulers of this planet, with influence even beyond the solar system, their images engraved forever on the Pioneer spacecrafts! I believe &lt;strong&gt;the Cambrian explosion is the best startup story of all time&lt;/strong&gt;, full of rapid prototyping and forgotten pivots! Like our early-stage startup, natural selection is a search for new, better designs in a shifting landscape.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F3_pigeons.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F3_pigeons.avif" alt="Pigeons"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Victorian hackathons&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;Some believe that evolution has to be &lt;em&gt;slow&lt;/em&gt;, but that's just false. Darwin's theory was influenced by pigeon breeders, who were able to find wonderful new pigeon designs within strikingly short time periods. I like to think of good startups like these breeders: tastefully using &lt;strong&gt;mutation&lt;/strong&gt; and &lt;strong&gt;selection&lt;/strong&gt; to find wonderful new products. My claim: when designing startups, we can draw surprisingly concrete lessons from how natural selection works! For my first example: let's look at nature's attitude toward copy-paste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid abstractions. Use copy-paste-edit!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F4_williston.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F4_williston.avif" alt="Williston's law"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Fun fact: the snake went full circle.&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;How did your arms and legs come to be? Notice a difference between you and &lt;em&gt;Pikaia&lt;/em&gt;: &lt;em&gt;Pikaia&lt;/em&gt; has lots of repeated segments, but your body has just a few specialized segments. This happens so often in evolution that it has a name: it’s called Williston’s Law. Roughly, it says that &lt;strong&gt;nature loves to copy-paste and edit.&lt;/strong&gt; Nature takes a versatile body part like a leg or a tooth, duplicates it many times, gives each one a chance to specialize, then kills off the excess.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F4_hox_tree.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F4_hox_tree.avif" alt="Hox gene evolutionary tree"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    The more Hox genes you paste, the more shapes you can make!&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;Nature's love of copy-paste can be seen genetically as well. When you were still an embryo, your body plan was drawn out by 39 different "Hox" genes. Each Hox gene corresponds to one part of your body. But our early ancestors had just one Hox gene! Nature then copy-pasted and edited it many times, and now we have 39 of them, each with a different function. In Computer Science courses, they gave us clear, static requirements, and we were supposed to implement these with "clean code". But &lt;strong&gt;programs designed for certain, static requirements look very different to programs designed for uncertainty and change!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F4_copy_paste_edit.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F4_copy_paste_edit.avif" alt="Copy-paste-edit"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Say you want to add a new kind of "big button" component. Instead of introducing an abstract "button" concept, try duplicating the existing button component, and allowing it to evolve along its own path. Even if your "button" abstraction is &lt;em&gt;right&lt;/em&gt; under &lt;em&gt;current&lt;/em&gt; requirements, it can stop you from implementing &lt;em&gt;new&lt;/em&gt; requirements! What's more, repetitive copy-paste code is friendly to AI-assisted change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid splitting stuff up. Use one big blob!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F5_peacock.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F5_peacock.avif" alt="Peacock"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why does the peacock not ditch that stupid enormous tail? Well, the males can’t, because the females select for it. But the peahen can’t ditch her selection choice either: she'd have sons with small tails, who wouldn’t get selected!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F5_peacock_sequence_diagram.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F5_peacock_sequence_diagram.avif" alt="Peacock sequence diagram"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Peacock sequence diagram.&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protocols inhibit change,&lt;/strong&gt; and the peacock has a broken protocol that equates "large tails" with "fitness". An asexual peacock could ditch the tail. But with two sexes, there’s no way to change without global coordination. Nature's lesson for us: &lt;strong&gt;avoid splitting stuff up.&lt;/strong&gt; And especially avoid any splits that create distributed systems! It’s easier to change one big thing than to change many small things talking to each other. Your professor is not here to punish you any more. It's okay to keep everything in one file!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F6_client_api_db.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F6_client_api_db.avif" alt="Client, database, and API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even the earliest prototypes often look like this: a client, a database, and an API between them. But with this design, you’ve already introduced two splits!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F7_one_blob.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F7_one_blob.avif" alt="Initial version of Granola"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By contrast, &lt;strong&gt;the first prototype of Granola was an isolated desktop app.&lt;/strong&gt; It talks to the things it needs to, but is otherwise a single blob.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F7_client_db.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F7_client_db.avif" alt="Granola using Supabase"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We eventually had to have some server-side stuff. Typically this means building an API layer. But we avoided that by using Supabase, which lets clients directly interact with your central database. Instead of two interfaces slowing you down, we just had one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid auto-update. Use direct distribution!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F8_cambrian_species.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F8_cambrian_species.avif" alt="Cambrian species"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Btw, notice all the repeated segments.&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;Here are some of the bizarre life forms that lived alongside our ancestor &lt;em&gt;Pikaia&lt;/em&gt;. Life is always exploring many variants in parallel! That’s the only way to quickly explore a giant possibility space. Yet most software distribution is sequential. &lt;code&gt;v1&lt;/code&gt; then &lt;code&gt;v2&lt;/code&gt; then &lt;code&gt;v3&lt;/code&gt;, and so on. Web apps are constrained to a single “production” version being explored by users. Mobile apps are constrained to a single version published on an app store. Bad for exploration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F10_dmg.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F10_dmg.avif" alt="Direct software distribution via .dmg file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead, our app is directly distributed via a .dmg file. This means &lt;strong&gt;we can make some radical code changes, cut a new build, and send it to a single user.&lt;/strong&gt; This is great for evolving a product, because we're evaluating many versions in parallel.&lt;/p&gt;

&lt;p&gt;(You might be thinking: "But we have feature flags." Good, but you can't make &lt;em&gt;radical&lt;/em&gt; changes on a feature flag, because your single production version must act as a superposition of all possible software changes.) In early life, avoid linear auto-update. Instead, use direct distribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Help your software versions die
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F11_opabinia.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F11_opabinia.avif" alt="Opabinia"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Copy-pasted eyes.&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Opabinia&lt;/em&gt; lived alongside our ancestor. He had five eyes on stalks, and a single, central claw. But &lt;em&gt;Opabinia&lt;/em&gt;'s descendants are not alive today — perhaps because he was a stupid design. Most of the Cambrian forms were evolutionary dead ends.&lt;br&gt;
 Without death, natural selection doesn’t work! And yet much conventional advice makes it hard for us to kill our bad software versions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F12_references.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F12_references.avif" alt="References to software versions"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    (From left) Living Granola, dead Granola.&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;What is a "dead" software version? It's one with no more references to it. Think garbage collection. So, &lt;strong&gt;to let your software die, avoid unnecessary references to it.&lt;/strong&gt; Let's look at common references we can avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid automated tests. Test manually!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F13_tests.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F13_tests.avif" alt="Tests"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Hey, come back here!&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;So you’ve made a software change, but now the tests are broken. Don't feel bad: it's the tests' fault, not yours!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tests are chains, stopping your program from running free.&lt;/strong&gt; The tests say: "Bad code! Stop changing! Go back and be the previous program!" So avoid writing tests. Just test the things that are unlikely to change. Test everything else manually.&lt;/p&gt;

&lt;p&gt;(Note: type-checking is different. It tests correctness properties that apply to &lt;em&gt;any&lt;/em&gt; program. A good type-checker lets you move fast without breaking as many things.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid unnecessary users. Build for yourself!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F13_users.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F13_users.avif" alt="Users"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Please support us!&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;You've experienced this too: you want to remove something from your product, but some obscure users loudly complain, so you give in.  Conventional advice says to launch ASAP. But &lt;strong&gt;people using your software keep it alive, and so they can slow down change.&lt;/strong&gt; Instead, avoid all unnecessary users. Build for a small set of target users. (That target might just be yourself!)&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid landing pages. Onboard manually!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F13_resources.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F13_resources.avif" alt="User-facing resources"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    We'll remember you forever!&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;Conventional advice is to focus on top-of-funnel experience. Build a landing page to sell the product. Write docs and build a slick onboarding into the app. But all these user-facing resources reference a specific version of your product! And so they make it harder to kill that version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At Granola, we deliberately spent a long time pre-launch.&lt;/strong&gt; We targeted a small niche, and manually onboarded everyone. This reduced distractions, made it easier to throw stuff away, and helped us practice for when we eventually did build a landing page and onboarding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices for pre-launch software are very different
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F14_midwit.avif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.granola.so%2FblogImages%2Fevolve%2F14_midwit.avif" alt="Midwit meme"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
    Midwit meme for you to copy-pasta.&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;Conventional advice says that good code is "clean code" with high test coverage, and that teams prioritize early launches, continuous delivery, and top-of-funnel experience. But in an early startup, your sole focus is to search for a product, and these "best practices" can slow down this search. Try optimizing for change, by using low-abstraction copy-paste, all in one place, with no tests. Distribute your app manually, and onboard people manually. That's what we did. After 12 months, we now think we've found our product, and it might be time to re-evaluate our approach. If you’d like to join our journey, get in touch!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
