<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Early-stage startup engineering]]></title><description><![CDATA[Early-stage startup engineering]]></description><link>https://juraj.blog</link><image><url>https://substackcdn.com/image/fetch/$s_!-Ks1!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e47a6e7-1685-49da-bd5e-cfb9f0e0affc_721x721.png</url><title>Early-stage startup engineering</title><link>https://juraj.blog</link></image><generator>Substack</generator><lastBuildDate>Fri, 14 Aug 2026 22:11:20 GMT</lastBuildDate><atom:link href="https://juraj.blog/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Juraj Masar]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jurajmasar@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jurajmasar@substack.com]]></itunes:email><itunes:name><![CDATA[Juraj Masar]]></itunes:name></itunes:owner><itunes:author><![CDATA[Juraj Masar]]></itunes:author><googleplay:owner><![CDATA[jurajmasar@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jurajmasar@substack.com]]></googleplay:email><googleplay:author><![CDATA[Juraj Masar]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The no-bullshit guide to Agentic Engineering]]></title><description><![CDATA[Practical guide to shipping production-ready software in hours instead of months.]]></description><link>https://juraj.blog/p/the-no-bullshit-guide-to-agentic</link><guid isPermaLink="false">https://juraj.blog/p/the-no-bullshit-guide-to-agentic</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Wed, 29 Jul 2026 17:40:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Beb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Originally written for the engineering team at <a href="https://betterstack.com/careers">Better Stack</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Beb4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Beb4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 424w, https://substackcdn.com/image/fetch/$s_!Beb4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 848w, https://substackcdn.com/image/fetch/$s_!Beb4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 1272w, https://substackcdn.com/image/fetch/$s_!Beb4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Beb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png" width="1456" height="858" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:858,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:569532,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://juraj.blog/i/208983815?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Beb4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 424w, https://substackcdn.com/image/fetch/$s_!Beb4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 848w, https://substackcdn.com/image/fetch/$s_!Beb4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 1272w, https://substackcdn.com/image/fetch/$s_!Beb4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F426b9182-3a4f-4c8e-b21f-26478aa1c21c_2832x1668.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><strong>A practical mental model</strong></h2><p><strong>If you ever find yourself saying: &#8220;AI is not good enough yet to do [action]&#8221;, please automatically assume you&#8217;re wrong.</strong> It&#8217;s just practical to do so. <span>It forces you to think &#8220;*</span><strong>how*</strong><span>&nbsp;do I make AI do this?&#8221;</span></p><p>AI is ready today, except for real-time video calls. So the odds are you just don&#8217;t know how to configure it properly.</p><p>Just because you installed Claude Code doesn&#8217;t mean you&#8217;re leveraging the full power of AI for software development. </p><p><strong>Always be learning</strong>: specifically, keep asking other engineers to show you their CLAUDE.md.</p><h2><strong>What is &#8220;agentic engineering&#8221;?</strong></h2><p>It&#8217;s a combination of 2 things:</p><ol><li><p>system prompt design = CLAUDE.md</p></li><li><p>agentic loop design</p></li></ol><h2><strong>Is it just vibe coding?</strong></h2><p>No. </p><p><strong>Vibe coding</strong> produces insecure throwaway code for your weekend projects. It&#8217;s ideal for prototyping. It replaced Figma as a tool to visualize ideas.</p><p><strong><span>Agentic engineering</span></strong><span>&nbsp;produces secure, production-ready code that is of the same quality as code written by humans, or better.</span></p><h2><strong>Part 1: System prompt design = CLAUDE.md</strong></h2><p><strong>The real software engineering today happens in your CLAUDE.md.</strong></p><p><strong>CLAUDE.md is the highest return-on-investment file in your entire codebase</strong>. If this is the first CLAUDE.md you&#8217;re writing, spend hours designing it: sentence by sentence.</p><p><strong>Never have a personal, locally stored CLAUDE.md.</strong> Always share your CLAUDE.md with your entire team directly in Git in the codebase. CLAUDE.md is the new meta programming.</p><div class="callout-block" data-callout="true"><p><strong>Dear engineering managers</strong>: for the first time in the history of software engineering, you can now directly influence what kind of code your human colleagues contribute! Historically, your only option would be to write a GitHub pull request review comment &#8220;Bob, please prefer to do X over Y next time&#8221;. Today, you just re-configure everyone&#8217;s CLAUDE.md instead. Your team will continue using Claude Code the same way and magically produce better code!</p></div><h3><strong>Signs that your CLAUDE.md is incorrectly designed</strong></h3><h4><br>Claude will say &#8220;Exploring your code base to understand X&#8230;&#8221;</h4><p>Your CLAUDE.md doesn&#8217;t have a &#8216;routing table&#8217; section that would reference other markdown files for documentation, describe codebase components, and link to adjacent codebases.<br></p><h4>Claude will say &#8220;Writing a memory about X&#8230;&#8221;</h4><p>You haven&#8217;t configured Claude to write shared documentation in your codebase. This is problematic because your colleagues won&#8217;t be able to leverage the same agent memories when their agents run, so they&#8217;ll be running into the same mistakes you already did.</p><h3><strong>How to write your CLAUDE.md</strong></h3><p>Your CLAUDE.md must include 3 things:</p><ol><li><p><strong>Description</strong>: 1-sentence description of the codebase.</p></li><li><p><strong>Rules:</strong> Behaviors the agent should and shouldn&#8217;t do</p></li><li><p><strong>Routing table:</strong> References to where to find additional knowledge</p></li></ol><div class="callout-block" data-callout="true"><p><strong>Common mistake:</strong> Do not include specific knowledge in your CLAUDE.md. CLAUDE.md is for behavioral rules = meta programming in English; it&#8217;s not a place for product documentation. <br><br>Why? CLAUDE.md is your system prompt: it gets included at the start of every session of every sub-agent, always. Unless a particular fact is required for every single session, it doesn&#8217;t belong to CLAUDE.md. Irrelevant words in your CLAUDE.md can easily make your agents worse.</p></div><h3><strong>1. 1-sentence codebase description</strong></h3><p>Assume common sense and keep it concise. </p><blockquote><p>&#8220;This is a Ruby on Rails + PostgreSQL + Redis backend for an iOS application that &lt;&#8230;&gt;.&#8221;</p></blockquote><p>Don&#8217;t waste your tokens on general knowledge: No need to explain the Model-View-Controller pattern. Claude knows what a typical Rails codebase looks like.</p><h3><strong>2. Agent rules = meta-programming in English</strong></h3><p>Now the fun part. Personally, I find a properly designed CLAUDE.md to be way more impactful than an underlying model upgrade (e.g., Opus &#8594; Fable).</p><p>Below are a few fundamental rules I find incredibly helpful. </p><div class="callout-block" data-callout="true"><p>Do you use other tricks I haven&#8217;t mentioned here? <br>Please tweet at me at <a href="http://x.com/jurajmasar">x.com/jurajmasar</a>.</p></div><h4><strong>Rule #1: test-driven development </strong></h4><blockquote><p><strong>&#8220;Always use TDD: test-driven development&#8221;.</strong></p></blockquote><p>Thanks to TDD, your agents will keep getting better on their own as the codebase grows, feature by feature. The more tests, the more implicit rules for what the end result should look like.</p><p>Your agents are really good at writing very fast unit tests. They&#8217;re also amazing at selecting just the right subset of tests to run to validate a particular code change. You will thus see your agent launching tests on their own when implementing a new feature, detecting a failure and improving the code on their own, without any impact from you. <strong>That&#8217;s your first taste of an agentic loop!</strong> More on that later.</p><p>Even if a test is not executed, its definition alone describes how the software should work. When the agent loads the test file into the LLM context, it becomes implicit documentation for what the behavior should be.</p><p></p><h4><strong>Rule #2: 1-sentence class and method description </strong></h4><blockquote><p><strong>&#8220;Write a 1-sentence description on top of all classes and methods: Write a succinct but thorough summary of what a class or a method does right above its definition.&#8221;</strong></p></blockquote><p>In agentic coding, repetition is better than abstraction. The in-code documentation is helpful for humans interacting with the code, but, more importantly, it serves as an additional layer of context to ground the agent's execution.</p><p></p><h4><strong>Rule #3: Document non-trivial hacks </strong></h4><blockquote><p><strong>&#8220;Document all non-trivial hacks or monkey-patches directly in code if scattered among multiple files. Always reference the other related files.&#8221;</strong></p></blockquote><p>How does the agent know that a particular line of code is meant to be used with a different line of code in a different file? Excluding conventions, such as an MVC pattern, its only chance is to `grep` the code. But if grep doesn&#8217;t find it, it doesn&#8217;t exist. Mainly when using dynamic languages.<br><br>Hence if you don&#8217;t document directly in code in both files that these 2 lines serve the same purpose, that information will be forever lost. (It will be only implicitly stored in git commit history: the agent could theoretically find that the two lines were introduced in the same commit, but that&#8217;s way too much work so this fact will be missed unless the agent is specifically debugging an error and thinking with ultracode effort.)</p><h4><strong>Rule #4: Documentation</strong></h4><blockquote><p>&#8220;Write end-user documentation to docs/user_documentation.md. Write a public API documentation into docs/api_documentation.rb, make it production-ready so that it can be directly shared with customers; don&#8217;t include internal information there. Write a high-level internal documentation about the implementation into docs/internal_documentation.md. Never write any local memories. You must include the memories in one of these documentation markdown files instead. If needed, create additional files in the docs/#{topic}.md directory and add them to git.&#8221;</p></blockquote><p><strong>Repetition over abstraction</strong>. More documentation means more grounding for future sessions. Every new session is smarter than the previous one.</p><div class="callout-block" data-callout="true"><p>The documentation must not live directly in your precious Claude.md as it doesn&#8217;t need to be loaded with every session. You never edit this documentation manually.</p></div><p></p><h4><strong>Rule #5: Conventions</strong> </h4><blockquote><p>&#8220;<strong>Naming conventions:</strong> Always say &#8220;Sign in&#8221;, never &#8220;Log in&#8221;. Always say &#8220;team members&#8221;, never say &#8220;colleagues&#8221; or &#8220;users&#8221;. Always say &#8220;Remove&#8221;, never say &#8220;Delete&#8221;. Always say &#8220;We&#8217;ll&#8221;, never &#8220;we will&#8221;. Always say &#8220;e-mail&#8221;, never &#8220;email&#8221;. [others]<br><strong>UI conventions:</strong> The first &lt;input&gt; field on the page must always be focused when the page is loaded. All links going to hosts other than <a href="http://betterstack.com">betterstack.com</a> must always include target=&#8216;_blank&#8217; rel=&#8216;noopener&#8217; [&#8230;]&#8221;.</p></blockquote><p>Great products feel as if they were implemented by a single person. Consistency&#8217;s critical. You get a consistent product for free with agentic engineering, thanks to your Claude.md.</p><p></p><h4><strong>Rule #6: Examples of what great looks like</strong></h4><blockquote><p>&#8220;When implementing a form, make the page look like monitors#index. (another existing page in the product). When implementing a landing page, make the page similar to <a href="http://betterstack.com/tracing">betterstack.com/tracing</a>. [&#8230;]&#8221;</p></blockquote><p>If you don&#8217;t tell the agent where to get inspiration, it will pick a random part of your product and draw inspiration from there. You should tell it to target the highest-quality parts of your product for imitation. Otherwise, it will imitate the average code in your codebase &#8212; which is a common frustration for teams blindly using Claude Code.</p><p></p><h4><strong>Rule #7: End-to-end feature testing </strong></h4><blockquote><p>&#8220;After implementing a new feature, test it end-to-end with a browser by signing in as &#8216;<a href="mailto:juraj@betterstack.com">juraj@betterstack.com</a>&#8217;.&#8221;</p></blockquote><p>Think of how you try the feature right after implementing it, and make the same possible for your agent. This is critical, and a common mistake with naive Claude Code set-ups: if the agent can&#8217;t try out the output of its work, it&#8217;s blind even to the most obvious implementation bugs.</p><p></p><h4><strong>Rule #8: Quality criteria</strong></h4><blockquote><p>&#8220;<strong>Quality criteria: </strong>After implementing a feature, always ensure that every http request finishes end-to-end in 200 ms. Every page needs to be usable 250ms after load. Every page must be responsive and work in dark mode. Every page within /dashboard must be protected by authentication. Every feature must check for relevant RBAC flags. Regardless of what combination of links, forms or buttons the user clicks, even if illogical, the app must never return user-facing error 500: It should return a user-friendly error message instead and tell the user what to do differently.&#8221;</p></blockquote><p>You get what you ask for. If you don&#8217;t explicitly say the app needs to be fast, its implementation will be allowed to bloat.</p><p></p><h4><strong>Rule #9: MCP access to production telemetry </strong></h4><blockquote><p>&#8220;When debugging bugs, use the Better Stack MCP to access production error tracking, logs, and traces from source &lt;url&gt;. If prototyping a new feature, use the Better Stack MCP to access real-user monitoring data such as page views, and web vitals such as LCP.&#8221;</p></blockquote><p>Telemetry tools often provide all the necessary context to 1-shot a bugfix. Generally be reluctant to add many MCPs as they waste your context, but do implement one from your observability provider. If they don&#8217;t have a robust MCP, change your provider.</p><p></p><h4><strong>Rule #10: Safety classifiers</strong></h4><blockquote><p>&#8220;Never run a command on production servers without explicitly asking for permission first.&#8221;</p></blockquote><p>Fable-like models can go out of their way to get the job done, even if it means `ssh`-ing to a server. This is fine, as long as you&#8217;re in control. The `auto` mode in Claude got really good these days, but in case someone in your team runs Codex, it doesn&#8217;t hurt to mention this explicitly in your Claude.md.</p><p></p><h4><strong>Rule #11: For HTML prototypes specifically</strong></h4><blockquote><p>&#8220;Every .html page must be self-contained. Use Tailwind, don&#8217;t use any JavaScript framework.&#8221;</p></blockquote><p>Allows you to have concurrent sessions 10+ on top of a handful of HTML files.</p><p><strong>Other notable tricks for HTML prototyping:</strong></p><ul><li><p>Paste a PNG screenshot of an existing interface into Claude Code.</p></li><li><p>Use the Claude extension for Chrome and sign into your existing products. Then tell Claude: &#8220;Use design similar to page &lt;url&gt; opened in Chrome&#8221;</p></li><li><p>Agentic loop prompt for implementing designs: &#8220;Improve this HTML until the pixel drift from Figma is less than 1% of pixels.&#8221;</p></li></ul><h3>Bonus Claude tricks</h3><h4><strong>Install &amp; enable Claude extension for Chrome</strong></h4><p>Then sign in to that browser in your testing environment.<br></p><h4><strong>For OpenCode, Codex users: `ln -s CLAUDE.md AGENTS.md`</strong></h4><p>Someone on your team will inadvertently experiment with Codex or OpenCode. By default, harnesses other than Claude Code might ignore CLAUDE.md, so symlink it to AGENTS.md to prevent this.<br></p><h4><strong>Use Git for every project</strong></h4><p>Obvious but necessary to mention. The entire commit history over time provides additional context when debugging bugs, alongside useful tools such as Git bisect.<br></p><h4><strong>Directory-specific CLAUDE.mds in sub-directories</strong></h4><p>Large code base? Include a handful of directory-specific CLAUDE.md in sub-directories to explain the structure and conventions of a smaller pack. Combine with an approach similar to <a href="https://github.com/Shopify/packwerk">Packwerk</a> from Shopify for the best results.<br></p><h4><strong>Advanced: Access to censored &amp; read-only production data</strong></h4><p>It&#8217;s key context to debug production issues alongside production telemetry.</p><p>Needs additional engineering, depending on your tech stack. At Better Stack, we developed an equivalent to the `rails runner` command that automatically censors all passwords, tokens and sensitive PII.</p><p></p><h4><strong>Consider REST APIs over MCPs</strong></h4><p>MCPs can be great, and they can be terrible.</p><p>As an example, Linear&#8217;s GraphQL API is vastly superior to its MCP. Just tell Claude &#8220;Use Linear GraphQL API with this token &lt;token&gt; to&#8230;&#8221; and optionally link to its API documentation, and Claude will be able to use it without issues.</p><p></p><h4><strong>Sensitive testing data? Add CLAUDE.local.md to your .gitignore</strong></h4><p>Then include your personal tokens that will not be shared with your team. Querying credentials? Ask Claude to use 1Password command-line <code>op</code> utility.</p><p></p><h3><strong>3. CLAUDE.md Routing table </strong></h3><p>Add a markdown table or &lt;ul&gt; list into your CLAUDE.md with two columns:</p><ul><li><p>&#8220;When looking for&#8221;</p></li><li><p>&#8220;Look into&#8221;</p></li></ul><p><br>Tell Claude where to find adjacent information for </p><ul><li><p>key parts of the current code base</p></li><li><p>related code bases, e.g. backend for this frontend</p></li><li><p>relevant external documentation</p></li><li><p>production telemetry</p></li></ul><div class="callout-block" data-callout="true"><p>Whenever you see &#8220;Exploring your code base to understand X&#8230;&#8221; in the thinking chain, it&#8217;s your sign to expand your routing table.</p></div><p></p><h3><strong>General rules for writing your CLAUDE.md</strong></h3><p>Be succinct. Be explicit. </p><p>Use &#8220;good&#8221; and &#8220;bad&#8221; examples.</p><p></p><h3><strong>Your CLAUDE.md should get better over time</strong></h3><p><strong>Never give your agents one-off feedback on its work.</strong> </p><p>If it did something wrong, tell it to: </p><blockquote><p>&#8220;Remember in CLAUDE.md to always/never do X when Y.&#8221;</p></blockquote><p><strong>The real software engineering today happens in your CLAUDE.md.</strong></p><p>If your CLAUDE.md is strong, your prompts will be short, simple, and straight to the point.</p><p></p><h2><strong>Part 2: Agentic loop design</strong></h2><h3><strong>What is an agentic loop?</strong></h3><p>It&#8217;s Claude Code working for hours unattended, checking its own work. Design your loops right and get a 100x productivity boost. Neglect them, and you&#8217;re back to ad-hoc real-time prompting.<br></p><h3><strong>How do you design an agentic loop?</strong></h3><p>You must tell the agent in CLAUDE.md or in your prompt the <strong>objective</strong> <strong>conditions</strong> for the output you want. Being vague is the ultimate sin. If you can&#8217;t describe what &#8216;great&#8217; looks like, coding agents can&#8217;t build it.</p><p><strong>A part of our CLAUDE.md we wrote above already includes aspects of an agentic loop design</strong>: the &#8216;quality criteria&#8217; includes the requirements for page speed, following UI &amp; naming conventions, and the unit tests written by the test-driven development all aid Claude Code to validate the quality of the output without additional input from you.<br></p><h3><strong>Example of an agentic loop: <br>End-to-end development of a new backend feature</strong></h3><h4><strong>Prompt #1 design document</strong></h4><blockquote><p>&#8220;Write a design document to implement a managed load balancer into docs/design/load_balancer.md. Base it on HAProxy. The load balancer must be able to apply a new configuration with 0 downtime. Consider the attached screenshots of a competitor. Consider the public docs of competitors X,Y,Z. Interview me about key product choices.&#8221;</p></blockquote><p>This is not a standalone prompt to <span>run directly in&nbsp;Claude.ai</span>. <strong>You should only run this directly in Claude Code</strong>, from the product codebase, after the CLAUDE.md from Part 1 has already been implemented. This will allow Claude Code to consider your existing code and tailor the product definition to your existing product.</p><p>Once finished, read through the markdown design file word-by-word and make 2-3 rounds of feedback. Don&#8217;t edit the markdown file directly; simply tell Claude, &#8220;Skip UDP load balancing, scope the feature with Packwerk,&#8221; and reread the adjusted design doc word by word until you&#8217;re happy with it. </p><p><strong>Estimated Fable time: 30-60 minutes.</strong> <br><strong>Estimated human review: 30-60 minutes.</strong><br></p><h4><strong>Prompt #2: implementation</strong> </h4><p>Fable in a new Git worktree:</p><blockquote><p>&#8220;Implement docs/design/load_balancer.md&#8221;</p></blockquote><p><br><strong>Estimated Fable time: 1 hour</strong></p><p>Review the created files, skim method signatures, don&#8217;t read the code line by line.</p><p>If there&#8217;s any structural mistake, improve your CLAUDE.md &#8220;Remember in CLAUDE.md to never add the most recent NPM package versions. Always fix the version explicitly to a package version that has been released already for at least a week to prevent supply chain attacks.&#8221;</p><p>If anything specific to this feature looks off, tell Claude: &#8220;Simplify the TCP healthcheck by&#8230;.&#8221;</p><p><strong>Deploy to staging.</strong><br></p><h4><strong>Prompt #3: generate integration tests</strong></h4><blockquote><p>&#8220;What are all the properties and features we need to test on staging to make sure 100% of the feature works? Combine them into as few integration tests as possible and write complete prompts I can use in different sessions. Write 1 naive integration test to be ran before all others to make sure the feature works at at all. Automatically debug issues using staging error tracking, logs and traces using the Better Stack MCP [or alternative] and open a pull request and ask me to re-deploy to staging before continuing testing.&#8221;</p></blockquote><p><strong>Estimated Fable time: 15 minutes</strong></p><p></p><h4><strong>Prompt #4: naive integration test</strong></h4><p>Use Opus to run the naive integration test from the prior step to test the very basic functionality.</p><p><strong>Estimated Opus time, no need for Fable: &lt; 30 mins</strong>, expect 2-3 pull requests to get the feature to work at all.</p><p></p><h4><strong>Parallel prompts 5-15: copy &amp; paste the integration test prompts from Prompt #3 and run them in parallel</strong></h4><p>Skim pull requests when opened, re-deploy to staging, ask the session &#8220;redeployed, continue&#8221;.</p><p><strong>Estimated Opus time, no need for Fable: 2 hours.</strong> </p><p>Semi-attended. Expect 10-20 pull requests and staging re-deploys during this time. Could be unattended if you&#8217;re willing to let Claude Code redeploy to staging automatically.</p><div class="callout-block" data-callout="true"><p>Claude Code desktop UI with remote control in the iOS app works great for running multiple parallel long-running Claude Code sessions. Try it!</p></div><p>When all integration tests pass, you have something that:</p><ul><li><p>&#8220;looks like a duck&#8221;: the design markdown looks great, so does the file/class structure and method signatures</p></li><li><p>&#8220;quacks like a duck&#8221;: the integration tests on staging work</p></li></ul><p><strong>A close to complete product in ~5-6 hours.</strong> Including customer-facing API documentation, product documentation, and internal technical documentation.</p><h1>Appendix</h1><h3><strong>Garry Tan&#8217;s talk on a related note</strong></h3><div id="youtube2-eBUyTS7SzV4" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;eBUyTS7SzV4&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/eBUyTS7SzV4?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p></p><h3><strong>Keep iterating: delete your CLAUDE.md every 6 months</strong></h3><div class="instagram-embed-wrap" data-attrs="{&quot;instagram_id&quot;:&quot;DbWkIPuDKz6&quot;,&quot;title&quot;:&quot;Instagram&quot;,&quot;author_name&quot;:&quot;&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/__ss-rehost__IG-snapshot-DbWkIPuDKz6.jpg&quot;,&quot;like_count&quot;:null,&quot;comment_count&quot;:null,&quot;profile_pic_url&quot;:null,&quot;follower_count&quot;:null,&quot;timestamp&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="InstagramToDOM"></div><h1><strong>This is a request for comment</strong></h1><p>This is how we use agents at <a href="https://betterstack.com/">Better Stack</a>. It&#8217;s one way of the highway, but definitely not the only way. Doing something different and it works great? Tell me at <a href="mailto:juraj@betterstack.com">juraj@betterstack.com</a>.</p><h3>Interested in agentic engineering? </h3><p><a href="https://www.youtube.com/@betterstack">Subscribe to Better Stack on YouTube</a> or <a href="http://betterstack.com/careers">join the team</a>!</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Building lasting value post-AI #startups ]]></title><description><![CDATA[It&#8217;s never been easier to build software products. But if it&#8217;s easy for you, it&#8217;s easy for the next guy, too.]]></description><link>https://juraj.blog/p/building-lasting-value-post-ai-startups</link><guid isPermaLink="false">https://juraj.blog/p/building-lasting-value-post-ai-startups</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Tue, 09 Dec 2025 19:59:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Dd3W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Dd3W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Dd3W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Dd3W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Dd3W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Dd3W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Dd3W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:638971,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://juraj.blog/i/181171610?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Dd3W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Dd3W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Dd3W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Dd3W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7aa29593-5463-4263-9c16-db0788a70891_2848x1504.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>AI erased most product-level moats. So defensibility now comes from things that are intentionally hard to replicate.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><ul><li><p>brand &amp; distribution</p></li><li><p>being a &#8220;compound startup&#8221;</p></li><li><p>vertical integration</p></li><li><p>migration pain</p></li></ul><h3>Brand &amp; distribution</h3><p>The obvious one. Having an existing distribution is a game changer. Think <a href="https://growthcasestudies.com/p/slack-vs-microsoft-teams">Microsoft pushing terrible MS Teams to their existing user base to beat Slack&#8217;s usage numbers</a>.</p><p>Building a trusted brand perceived to be building quality products is priceless today. Your brand&#8217;s reputation takes years to build yet it&#8217;s trivial to lose.</p><h3>Being a &#8220;compound startup&#8221;</h3><p>Launching multiple tightly integrated products solving different problems for the same customer. <em>Single product startups</em> might be easier to build and faster to grow initially, but they&#8217;re a lot more vulnerable to competitors too.</p><p>&#8220;Compound startups&#8221; leverage that billing, reporting, authentication, onboarding, support, data models are all shared across multiple products, and you only need to build them once.</p><p>Being &#8220;a compound startup&#8221; means you can use product bundling to your advantage: you can compete on margins where it hurts your competitor but it doesn&#8217;t hurt you. Every company now pays for 30+ SaaS vendors. The bar for being the 31st is higher than ever, but selling one more product to existing customers? Easy!</p><p>But man building a compound startup is complicated! Different products mean different customers constantly pull you in different directions. If you found building a single product difficult, multi-product is a different level.</p><div id="youtube2-dhmJGjHRSJM" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;dhmJGjHRSJM&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/dhmJGjHRSJM?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3>Vertical integration</h3><p>How many new startups are building their own data centers today? Close to zero.<br>How many are hosting data in Supabase? Most.</p><p>There are things you can do with data in your own data center that you can&#8217;t do with Supabase. You can tailor your hardware to your software, not the other way around. You could optimize costs and capex/opex.</p><p>It&#8217;s an insane pain to host your own servers though. But that&#8217;s the point. <br>If it brings you a real benefit, it might be worth it even if super painful.</p><div id="youtube2-8iX_uJZ2QOc" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;8iX_uJZ2QOc&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/8iX_uJZ2QOc?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><h3>Migration pain</h3><p>Can you make your product easy to onboard while being difficult to rip out?</p><p>I don&#8217;t care if a vendor sells me on a <em>slightly</em> better or a cheaper product if I need to change workflows of an existing team or migrate a ton of data. Switching costs are not just technical; they are social, operational, and political.</p><h2>The point is there&#8217;s &#8220;no quick wins&#8221; anymore</h2><p>If you launch an obvious &amp; easy to build idea today, you&#8217;ll wake up to 17 competitors on Product Hunt tomorrow. AI removed most &#8220;easy&#8221; moats. The only durable ones left are the hard ones.</p><p>Aiming to build a lasting business? It might be easier to work on a hard problem than an easy one today.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Startups are intense]]></title><description><![CDATA[It's general knowledge that founders work harder than most employees. How much harder, though? 50% more? Twice as much?]]></description><link>https://juraj.blog/p/startups-are-intense</link><guid isPermaLink="false">https://juraj.blog/p/startups-are-intense</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Fri, 09 May 2025 03:48:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s calculate the number of work hours per year.</p><p><strong>Assumptions</strong>:</p><ul><li><p>typical European 4 weeks paid time off</p></li><li><p>10 public holidays excluding weekends</p></li><li><p>and 5 sick days per year</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XPOZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XPOZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 424w, https://substackcdn.com/image/fetch/$s_!XPOZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 848w, https://substackcdn.com/image/fetch/$s_!XPOZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 1272w, https://substackcdn.com/image/fetch/$s_!XPOZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XPOZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png" width="1276" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:608,&quot;width&quot;:1276,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110165,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://juraj.blog/i/163181595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XPOZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 424w, https://substackcdn.com/image/fetch/$s_!XPOZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 848w, https://substackcdn.com/image/fetch/$s_!XPOZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 1272w, https://substackcdn.com/image/fetch/$s_!XPOZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9b8e419c-e2ed-4662-959e-0262c86cb0d1_1276x608.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A typical employee in a corporate job putting in 6 work hours per day in a &#8216;chill mode&#8217; clocks about 1,356 hours per year.</p><p>What about others?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pRwl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pRwl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 424w, https://substackcdn.com/image/fetch/$s_!pRwl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 848w, https://substackcdn.com/image/fetch/$s_!pRwl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 1272w, https://substackcdn.com/image/fetch/$s_!pRwl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pRwl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png" width="1284" height="608" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:608,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:129013,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juraj.blog/i/163181595?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pRwl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 424w, https://substackcdn.com/image/fetch/$s_!pRwl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 848w, https://substackcdn.com/image/fetch/$s_!pRwl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 1272w, https://substackcdn.com/image/fetch/$s_!pRwl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F467d33d4-57b6-4680-8c3c-dc9289e256f8_1284x608.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>With <a href="https://www.bloomberg.com/news/articles/2022-11-16/musk-refers-to-vacationing-as-an-email-with-a-view?embedded-checkout=true">vacations being &#8216;an email with a view'</a>, working on the weekends, public holidays, and Christmas Eve, <strong>founders put in 3-4x more work hours per year than the average corporate employee</strong>.</p><p>Essentially doing the work of at least 4 corporate employees.</p><h3><strong>&#8220;Ok Juraj, but I work smart, I don&#8217;t need to work hard&#8221;</strong></h3><p>Imagine a competitor of yours somewhere in the world who&#8217;s exactly like you. <br>But they operate in &#8216;Founder mode&#8217; while you&#8217;re working on your business in &#8216;Chill mode&#8217;. <br>They&#8217;ll run twice as many experiments per year as you will! How will you win?</p><h3><strong>&#8220;That just makes you a workaholic&#8221;</strong></h3><p>Sort of. Think of startups as a high-performance sport. Would you tell an Olympian chasing a gold medal &#8220;chill out you&#8217;re training too much!&#8221;. Most people wouldn&#8217;t.</p><h3><strong>&#8220;Ok, but input &#8800; output. You can&#8217;t be productive if you work for 12-16 hours a day&#8221; [*]</strong></h3><p>It&#8217;s the output of your effort that counts.</p><p>The more hours you put in, the faster you learn. The faster you see what works and what doesn&#8217;t. The faster you <a href="https://en.wikipedia.org/wiki/Outliers_(book)#:~:text=Gladwell%20explains%20that%20reaching%20the,a%20week%20for%2010%20years.">master a skill</a>.</p><p>The effort compounds. Since you&#8217;re a lot more experienced because of working more, you&#8217;re able to get *more* done in a single hour of work over time, not less.</p><h3><strong>It&#8217;s a marathon, but you sprint the entire time</strong></h3><p>YC preaches &#8216;eat, sleep, build product and talk to your users&#8217;. This is fun for 3 months, but imagine keeping this up for 10 years straight. You have to love the game, otherwise any sensible person would quit.</p><h3><strong>It&#8217;s actually good news: this is how you start</strong></h3><p>Do you want to start a business, but you don&#8217;t have savings?</p><p>This is how you get your break: <a href="https://youtu.be/EhqZ0RU95d4?si=JDAKwmndt1YhlvWP&amp;t=710">&#8220;Work 9-5, spend a couple hours with the family, and 7pm to 2am in the morning is plenty of time to do the damage. [</a>&#8230;<a href="https://youtu.be/EhqZ0RU95d4?si=JDAKwmndt1YhlvWP&amp;t=710">] Everybody has time. Stop watching fucking Lost.&#8221;</a></p><p>Just be self-aware and understand what it takes.</p><div id="youtube2-tRy1kIEAD0E" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;tRy1kIEAD0E&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/tRy1kIEAD0E?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>[*] the Better Stack team works regular hours</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Do we still need programmers?]]></title><description><![CDATA["Is AI coding moving too fast? Sonnet 3.7? Claude Code? Is 'vibe coding' already easier and more impactful than regular way of writing code?"]]></description><link>https://juraj.blog/p/ai-programming</link><guid isPermaLink="false">https://juraj.blog/p/ai-programming</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Sun, 02 Mar 2025 16:39:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A good friend asked me about this.</p><blockquote><p>&#8230;&#8220;Feels like opening iterative pull requests, waiting 10 mins for CI, and deploying a +10/-7 PR is already outdated&#8221;</p></blockquote><p> So are programmers already out of a job? Are the best practices for shipping software such as continuous integration and pull request reviews already irrelevant?</p><p>Here&#8217;s my 2 cents as of March 2025.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vP32!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vP32!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 424w, https://substackcdn.com/image/fetch/$s_!vP32!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 848w, https://substackcdn.com/image/fetch/$s_!vP32!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 1272w, https://substackcdn.com/image/fetch/$s_!vP32!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vP32!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png" width="1456" height="1106" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1106,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1826122,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://juraj.blog/i/158219465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vP32!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 424w, https://substackcdn.com/image/fetch/$s_!vP32!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 848w, https://substackcdn.com/image/fetch/$s_!vP32!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 1272w, https://substackcdn.com/image/fetch/$s_!vP32!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c333ab3-ebf4-4004-89c9-315743419116_2960x2248.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Day-to-day impact of LLMs on software engineering</h3><p>In the last 2 years alone, software engineering changed more drastically than in the prior 20 years.</p><p>Starting with the obvious, <strong>Claude Sonnet 3.7 is insanely good</strong> <strong>for 1. debugging errors, and 2. prototyping initial concepts. </strong>Stack Overflow &amp; internet forums are dead. Your marketer is no longer hiring $5 fiverr gigs, they create the scripts they need themselves with Claude. </p><p><strong><a href="https://devin.ai">Devin</a> is a great concept</strong>, <strong>but the error rate is still too high for most tasks.</strong> This is where we&#8217;re going though &#8212; <strong>you simply tag your virtual colleague in Slack</strong> and wait for them to open a pull request.</p><p><strong><a href="https://www.youtube.com/watch?v=A9BiNPf34Z4">Cursor&#8217;s CMD+K</a> with Claude Sonnet is the single most important practical change in day-to-day engineering workflows since GPT-3.</strong> </p><p><strong>If you&#8217;re a full-stack engineer and you haven&#8217;t incorporated CMD+K into your workflow <a href="https://tomtunguz.com/ai-impact-curves/">you will soon become irrelevant</a></strong>. (It&#8217;s fascinating that existing IDEs like JetBrains are struggling to keep up!)</p><p><strong>Starting a new project? <a href="https://www.youtube.com/watch?v=r5T3h0BOiWw">Cursor&#8217;s composer mode is useful</a>, too</strong>. Although it becomes impractical as you cross 5-10k lines of code and the dependencies become too complex.</p><h3>Where we&#8217;re going</h3><p><strong><a href="https://www.youtube.com/watch?v=VWvV2-XwBMM">SWE Agents by GitHub</a> will likely shake things up next</strong> thanks to their tight integration with GitHub pull requests &amp; having the entire codebase. </p><p><strong>New models come with very large context windows.</strong> <a href="https://www.sergey.fyi/articles/gemini-flash-2">Gemini Flash 2.0&#8217;s 1 million context window</a> means that <strong>entire small codebases can be now completely included in a single prompt</strong>, leading to higher quality answers &amp; insights.</p><h3>Needs of engineering teams are different to cool demos</h3><p><strong><a href="https://www.youtube.com/watch?v=afN8U7kAiLc">Most &#8216;AI coding&#8217; demos</a> focus on 1. single page visual demos, and are 2. built from scratch by the model. And 3. models make many mistakes</strong>, so you need multiple attempts of tweaking your prompt before it does what you need.</p><p><strong>Software engineering teams deal, on the other hand, with:</strong></p><ol><li><p>numerous internal microservices and many repositories</p></li><li><p>millions of lines of existing code</p></li><li><p>they optimize for not breaking things when adding new features</p></li></ol><p>This is why the Devin experience of simply asking an agent to implement a feature in a complex existing codebase is still just a dream today. <strong>And why CMD+K in Cursor remains the key game-changer for existing software engineering teams.</strong></p><p><strong>There&#8217;s one other notable use-case for engineering teams: <a href="https://docs.cursor.com/chat/overview">chatting with code</a>.</strong> Imagine you need to integrate with a poorly documented Go library although you never worked with Go. <strong>You can ask Cursor Chat to explain the parts of the code base relevant to you</strong>: e.g. ask about what&#8217;s the structure of the API payload the service expects. This works exceptionally well.</p><p><strong>I think there are many existing workflows still waiting to be disrupted by LLMs:</strong> automations for triaging bugs and feature requests, code review assistants, UI copywriting assistants, UI convention checkers, QA testing, and workflows for resolving infrastructure incidents faster, to name a few. <a href="https://betterstack.com/careers">We&#8217;re working on some of these at Better Stack</a>, so if this sounds like an interesting challenge, join us!</p><h3>So what makes human engineers relevant today?<br>Experience + Low error rate.</h3><p><strong>We still need full-stack engineers with 1. a lot of experience, and 2. low error rate.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CNPV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CNPV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 424w, https://substackcdn.com/image/fetch/$s_!CNPV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 848w, https://substackcdn.com/image/fetch/$s_!CNPV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 1272w, https://substackcdn.com/image/fetch/$s_!CNPV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CNPV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png" width="1334" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1334,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:56622,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://juraj.blog/i/158219465?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CNPV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 424w, https://substackcdn.com/image/fetch/$s_!CNPV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 848w, https://substackcdn.com/image/fetch/$s_!CNPV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 1272w, https://substackcdn.com/image/fetch/$s_!CNPV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa48d22dc-1d37-47f7-921b-bf19b1f9a9aa_1334x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Experience</strong> is both the soft <strong>intuition</strong> <strong>built from years of building and fixing complex systems</strong> as well as <strong>hard knowledge</strong> of the existing systems.</p><p><strong>By &#8220;error rate&#8221; I mean the guard rails an engineer needs around them to be able to ship production-ready features.</strong> </p><p>Does your company have an army of manual QA testers? Is every pull request introducing a new feature followed by several hotfixes? Both signify an environment with a high tolerance for errors. Devin is coming for your job soon.</p><p><strong>&#8220;Full-stack engineer&#8221; is the main software engineering role still relevant today.</strong> If you perceive yourself as just a &#8220;Ruby engineer&#8221; or just a &#8220;JavaScript engineer&#8221; then play with Claude, Cursor &amp; Devin and reconsider.</p><p>Thanks for reading! <a href="https://x.com/jurajmasar">Follow me on Twitter</a> &amp; subscribe below for future posts.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Startup compensation]]></title><description><![CDATA[We could pay you a million a month, but I&#8217;d need you to have a tangible impact on the business on your first day.]]></description><link>https://juraj.blog/p/startup-compensation</link><guid isPermaLink="false">https://juraj.blog/p/startup-compensation</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Tue, 28 Jan 2025 18:12:31 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fmGn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>In the long-term, every team member needs to create more value than they take home</strong> as compensation. Otherwise a business would not be economically viable.</p><p><strong>In the short-term, they don&#8217;t.</strong> The rest of the team subsidizes a new colleague when they&#8217;re getting up to speed during onboarding.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fmGn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fmGn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!fmGn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!fmGn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!fmGn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fmGn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic" width="306" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:306,&quot;bytes&quot;:290208,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fmGn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!fmGn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!fmGn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!fmGn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8aeb7dd2-6b61-43af-adac-9c279051cd63_1024x1024.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p><strong>So when does &#8220;short-term&#8221; end and &#8220;long-term&#8221; begin? </strong></p><p><strong>That depends on the introductory compensation.</strong></p><p><strong>The introductory compensation is the responsibility of the person joining the company.</strong> An experienced engineer with 2 mortgages, 3 kids and a dog has different expectations to a fresh grad.</p><p><strong>But the higher the introductory compensation, the higher the expectations. </strong>And thus the shorter &#8220;time to enough value created&#8221;.</p><p>We could pay you a million a month, but I&#8217;d need you to have a tangible impact on the business on your first day.</p><p><strong>The long-term compensation, on the flip-side, is the responsibility of the company.</strong> <strong>And</strong> <strong>it&#8217;s in the company&#8217;s best interest to aggressively increase comp when appropriate.</strong></p><p>Imagine you have a colleague who&#8217;s simply killing it: the last thing you want is for them to start thinking about leaving because of a different company offering them more $.</p><p><strong>At <a href="https://betterstack.com/careers">Better Stack</a>, we revisit the compensation of every team member twice a year.</strong> That doesn&#8217;t mean we automatically increase everyone&#8217;s comp every 6 months. It means <strong>the company opens up the conversation</strong> about your comp with regards to your performance, the company&#8217;s overall performance, and the outside market, so that you don&#8217;t have to.</p><p>It&#8217;s in our best interests to aggressively increase compensation when appropriate. In the past, we increased the comp of our colleagues by 50%+ in three consecutive bi-annual reviews &#8212; <strong>effectively increasing the comp by more than 3.4x within 18 months</strong>. But at the same time, for different colleagues, we left the comp unchanged over the same 2-3 consecutive reviews. Because the comp should be proportional to the real value people create.</p><p><strong>Large bigtech corporations typically have no clue about who is actually creating a ton of value and who is not. </strong>But a nimble startup with technical leadership can recognize it &amp; reward it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[We’re hiring 42 engineers this year]]></title><description><![CDATA[Remember that time in high school when you were stuck with your math homework?]]></description><link>https://juraj.blog/p/we-are-hiring-42-engineers-this-year</link><guid isPermaLink="false">https://juraj.blog/p/we-are-hiring-42-engineers-this-year</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Tue, 09 Apr 2024 16:34:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xdOF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Remember that time in high school when you were stuck with your math homework?</p><p><strong>Imagine you&#8217;re tasked with deriving an equation for the very first time.</strong></p><p>You&#8217;re *really* focused on getting it done. You spend hours and hours thinking about how to solve the problem.</p><p>Yet, you eventually give up.</p><p><strong>Who is your go-to person you ask for help?</strong></p><p>Would you prefer to ask 100 first graders to help you or 1 university math student?</p><p>I&#8217;d go with the university student every single time.</p><p><strong>Yet, tech journalists, VCs, job applicants, and even tech recruiters ask me regularly: &#8220;How many engineers do you plan on hiring this year?&#8221;</strong></p><p>This question is fundamentally flawed.</p><p>Software engineering is remarkably similar to math in the sense that a really great mathematician can solve a thousand times more difficult math problem than an army of first graders.</p><p>9 women won&#8217;t give birth to a child in a month.</p><p>100 Cessna pilots won&#8217;t fly a fighter jet.</p><p>So let&#8217;s stop thinking of software engineers as a commodity. The best software builders are at least <a href="https://juraj.blog/p/100x-software-engineering">100x more productive</a> than the mediocre ones.</p><p><strong>You might not need a team of 50 engineers after all, you might just need a single really awesome engineer.</strong></p><p>So how many engineers are we looking to <a href="https://betterstack.com/careers">hire at Better Stack</a>?</p><p>Every single great one we can.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xdOF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xdOF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xdOF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xdOF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xdOF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xdOF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg" width="472" height="471.52988047808765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1003,&quot;width&quot;:1004,&quot;resizeWidth&quot;:472,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alternative text description for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="No alternative text description for this image" title="No alternative text description for this image" srcset="https://substackcdn.com/image/fetch/$s_!xdOF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xdOF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xdOF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xdOF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb47a51b1-9f4b-4e90-9b52-75013d0c73da_1004x1003.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Stolen from the amazing workchronicles.com</figcaption></figure></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Product 101: Consistency]]></title><description><![CDATA[One often-overlooked aspect of great software is that it feels like it was designed by a single person through & through. Or so it seems.]]></description><link>https://juraj.blog/p/consistency</link><guid isPermaLink="false">https://juraj.blog/p/consistency</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Mon, 28 Aug 2023 21:12:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pQiM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gzBi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gzBi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 424w, https://substackcdn.com/image/fetch/$s_!gzBi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 848w, https://substackcdn.com/image/fetch/$s_!gzBi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 1272w, https://substackcdn.com/image/fetch/$s_!gzBi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gzBi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png" width="270" height="403" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb157e84-301e-4854-8232-827178430917_270x403.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:403,&quot;width&quot;:270,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;UI Change&quot;,&quot;title&quot;:&quot;I know they said this change is permanent, but surely when they hear how much we're complaining someone will find a way to change things back.&quot;,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="UI Change" title="I know they said this change is permanent, but surely when they hear how much we're complaining someone will find a way to change things back." srcset="https://substackcdn.com/image/fetch/$s_!gzBi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 424w, https://substackcdn.com/image/fetch/$s_!gzBi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 848w, https://substackcdn.com/image/fetch/$s_!gzBi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 1272w, https://substackcdn.com/image/fetch/$s_!gzBi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb157e84-301e-4854-8232-827178430917_270x403.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Stolen from the amazing <a href="https://xkcd.com/1770/">XKCD</a></figcaption></figure></div><p>Things look, work, and mostly *feel* the same.</p><p>This is trivial at first when you&#8217;re the only developer but almost impossible later as your engineering, design, and product teams scale and new colleagues join.</p><p><strong>The following are my 8 recommendations on improving the design of your next product without adjusting the color of a single pixel.</strong></p><h4>1. Do not introduce new concepts recklessly</h4><p>&#8220;Sign in here&#8221; yet &#8220;Can&#8217;t log in?&#8221;.<br>&#8220;Register here&#8221; yet &#8220;Sign up with Google&#8221;.<br>Different words, same thing. <br><br>Do not ever use synonyms for the core product concepts of your app. </p><p>Instead, <strong>be uncompromisingly boring</strong>: either use &#8220;Sign in&#8221; and &#8220;Sign up&#8221;; or &#8220;Log in&#8221; and &#8220;Register&#8221; but never the other. </p><p><strong>Boring is great.</strong><br><br>Otherwise, your users will be left wondering: Is &#8220;user&#8221; the same thing as &#8220;customer&#8221; and &#8220;profile&#8221;? What about &#8220;team member&#8221;, &#8220;colleague&#8221;, and &#8220;teammate&#8221;?</p><h4>2. Period at the end of tooltips, flash messages, and error messages</h4><p>It&#8217;s often the small things that add up: Do tooltips end with a period or not? If some do and some don&#8217;t, just pick one and unify them.</p><h4><strong>3. Date formats</strong></h4><p>Have a set of defined date formats you use throughout the app.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pQiM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pQiM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 424w, https://substackcdn.com/image/fetch/$s_!pQiM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 848w, https://substackcdn.com/image/fetch/$s_!pQiM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 1272w, https://substackcdn.com/image/fetch/$s_!pQiM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pQiM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png" width="442" height="194.23828125" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:450,&quot;width&quot;:1024,&quot;resizeWidth&quot;:442,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted Graphic 1.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted Graphic 1.png" title="Pasted Graphic 1.png" srcset="https://substackcdn.com/image/fetch/$s_!pQiM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 424w, https://substackcdn.com/image/fetch/$s_!pQiM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 848w, https://substackcdn.com/image/fetch/$s_!pQiM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 1272w, https://substackcdn.com/image/fetch/$s_!pQiM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4fc66d51-57a7-424e-b53a-9ba0fff4041d_1024x450.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h4><strong>4. Consistent page layout</strong></h4><p>All pages ought to belong to one of a few categories: </p><ul><li><p>landing page</p></li><li><p>listing page</p></li><li><p>dashboard page</p></li><li><p>authentication page</p></li><li><p>form page</p><p></p></li></ul><p><strong>If none feels right, think twice</strong> if you really need to introduce a new behavior to your interface. All pages of the same type should feel and work the same. <br></p><h4><strong>5. Short or long-form English? Informal or formal?</strong></h4><p>Pick a voice and stick with it. I prefer a conversational professional tone: <br>an informal, friendly, and honest active voice.<br><br>&#9989; &#8220;You&#8217;ve successfully updated your profile.&#8221;<br>&#10060; &#8220;Profile was successfully updated.&#8221;</p><p></p><h4><strong>6. Copywriting 101<br></strong></h4><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EGLL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EGLL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 424w, https://substackcdn.com/image/fetch/$s_!EGLL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 848w, https://substackcdn.com/image/fetch/$s_!EGLL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 1272w, https://substackcdn.com/image/fetch/$s_!EGLL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EGLL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png" width="450" height="314.71215351812367" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:938,&quot;resizeWidth&quot;:450,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Pasted Graphic 2.png&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Pasted Graphic 2.png" title="Pasted Graphic 2.png" srcset="https://substackcdn.com/image/fetch/$s_!EGLL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 424w, https://substackcdn.com/image/fetch/$s_!EGLL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 848w, https://substackcdn.com/image/fetch/$s_!EGLL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 1272w, https://substackcdn.com/image/fetch/$s_!EGLL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e1807c0-39cc-4bae-8b5e-b90c8c744977_938x656.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Stolen from the awesome <a href="https://marketingexamples.com">Harry&#8217;s newsletter</a></figcaption></figure></div><h4><strong>7. Grammar mistakes</strong></h4><p>Your interface needs to sound native to your customers in the U.S. <br><br>Not a native speaker? Rewatch Suits on Netflix. Use Grammarly or leverage &#8220;Make the following sound native&#8221; Chat-GPT prompts.</p><h4><strong>8. Write it down</strong></h4><p>Codify your UI conventions by writing them down and make all new engineers, designers, and product managers read all of them before they start contributing.<br><br><strong>Focus on engineers.</strong> They&#8217;re the ones who typically make or break consistency. </p><p>No designers or product managers can design every possible error message of every form, so your engineers will have to improvise whether you make them focus on consistency or not.</p><h4><strong>Recommended resources</strong></h4><ul><li><p><a href="https://www.amazon.com/Dont-Make-Think-Revisited-Usability/dp/0321965515">Don&#8217;t make me think</a>.</p></li><li><p><a href="https://www.refactoringui.com">Refactoring UI</a>.</p></li><li><p><a href="https://www.youtube.com/watch?v=sz_LgBAGYyo">Kevin Hale on How to Build Products Users Love</a>.</p></li></ul><p>&#8230;<a href="http://betterstack.com/careers/engineering">or work with us</a> on the next product at Better Stack.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Early-stage startup engineering! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Management 101: Giving Feedback]]></title><description><![CDATA[You're a first-time manager, your team mate has made a mistake, and you need to tell them so. How do you go about it?]]></description><link>https://juraj.blog/p/giving-feedback</link><guid isPermaLink="false">https://juraj.blog/p/giving-feedback</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Mon, 05 Jun 2023 08:12:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/xLQSNB0kbPY" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>1. Don&#8217;t delay the conversation.</strong> Get ready and tell them tomorrow at the latest. It&#8217;s your responsibility. If you know someone&#8217;s screwing up and you don&#8217;t tell them right away, you become an accomplice. </p><p><strong>2. Praise publicly, and criticize privately.</strong> Schedule a private 1:1 session. Never criticize someone&#8217;s work publicly in front of other colleagues.</p><p><strong>3. Check on them first.</strong> Is everything fine with them at home? It&#8217;s your job to know if they need your support outside of work. Remember, work is just work.</p><p><strong>4. Have explicit examples.</strong> Be ready to discuss specifics. "Remember last Thursday when you did X? I'd really have preferred you to have done Y in that situation because of Z." Have screenshots ready, links to pull requests or Slack conversations you can reference. Nothing is worse than ambiguity when you're criticizing someone&#8217;s work.</p><p><strong>5. Cover everything in a single session.</strong> Once you're giving someone feedback, don&#8217;t be half-hearted. Otherwise, they&#8217;ll tell you &#8220;You didn&#8217;t mention that last time&#8221; the next time you talk.</p><p><strong>6. Is this a repeated mistake?</strong> <strong>Acknowledge that.</strong> "Remember when we were discussing X last week? We agreed that&#8230;&#8221;</p><p><strong>7. Be firm but kind.</strong> Never make it personal. Talk about &#8220;the work&#8221; they've done, not about the person themselves. Do not ever let your emotions get the better of you.</p><p><strong>8. Don&#8217;t leave anything unsaid or vague.</strong> If you&#8217;re not explicit enough, you can&#8217;t expect them to understand something you barely implied. Over-communicate rather than under-communicate.</p><p><strong>9. Reason from first principles.</strong> They might be operating on a different set of beliefs than you, for example, saying &#8220;That wasn&#8217;t my job&#8221;. Be ready to dig deep and get down to first principles if you need to: "Look, how would the business function if everyone was doing this?&#8221;</p><p><strong>10. The discussion takes as long as it takes.</strong> The meeting is scheduled for 30 minutes? Great. Make sure both of you have free time in the calendars afterward. Take your time when speaking, use silence to your advantage. It&#8217;s completely fine to breathe in and think for 5-10 seconds about what you want to say before you continue talking. If you discuss the issue in-depth enough, they should be able to acknowledge the problem in the end. If they&#8217;re not, delve into it with, &#8220;It feels like you&#8217;re getting a bit defensive. Do you think what I&#8217;m saying is not fair?&#8221;</p><p><strong>11. Be specific about what you want to happen next.</strong> Is this the last warning before you need to let them go? Tell them that.</p><p><strong>12. Be ready for extreme reactions.</strong> Prepare for every possible outcome of the conversation, regardless of how unlikely. They could laugh, cry, shout at you, or quit on the spot. What would you do if they did that?</p><p>Don't worry, you&#8217;ll do fine. Radical candor is an integral part of a well-functioning team. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Don&#8217;t be this guy:</p><div id="youtube2-xLQSNB0kbPY" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;xLQSNB0kbPY&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/xLQSNB0kbPY?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div>]]></content:encoded></item><item><title><![CDATA[Quick and Dirty vs. Polished and Perfect: The Two Sides of Engineering]]></title><description><![CDATA[Every great engineer knows how to toggle between two fundamentally different, yet equally important styles of work: "Let's wing it" hacking and corporate-level "measure twice, cut once" engineering.]]></description><link>https://juraj.blog/p/two-sides</link><guid isPermaLink="false">https://juraj.blog/p/two-sides</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Sat, 03 Jun 2023 14:15:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/76J3mHnHHOE" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As more people hop onto the software engineering bandwagon just for the paycheck and lifestyle perks rather than a true-bread love for technology, certain contrasts between the "tech virtuosos" and the "clock punchers" start to stand out.</p><div id="youtube2-76J3mHnHHOE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;76J3mHnHHOE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/76J3mHnHHOE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>One such distinction is knowing when to flip the switch between the two engineering approaches.</p><p>Here's the scoop: <strong>Traditional paths like universities, internships, and work experiences at mega-tech companies usually only teach engineers the ways of "polished and perfect engineering".</strong></p><ol><li><p>Don't mess things up!</p></li><li><p>You have to be a team player. Stick to a common code style, whip up unit tests, and give your code some good documentation.</p></li><li><p>Your code should be a breeze to maintain and enhance.</p></li><li><p>Long-winded commits and pull request messages? Bring 'em on.</p></li></ol><p><strong>But if programming is your hobby, chances are, you love playing around with the latest tech.</strong> You might find yourself churning out 50-100 line scripts just to test that shiny new API. Or maybe to scrape a list of rentals to snag the perfect apartment... or score the best car deal.</p><p>These are throwaway scripts that probably won't see the light of day again.</p><p><strong>That's why many self-taught coding enthusiasts often resort to a patchwork approach to make things work... and fast.</strong></p><blockquote><p><strong>There's a common misbelief that the "polished and perfect" style of engineering is always superior. But it's not.</strong> Tests for code that's gonna gather dust in some corner are just a waste of your time. Staging environments for pre-release software? That&#8217;s ridiculous.</p></blockquote><p>If you're an engineer at an early-stage startup, being able to prototype is a golden skill.</p><p><strong>What really sinks startups isn't ugly code.</strong> It's the failure to create something people are willing to pay for. That's why being able to prototype quickly, especially in the early stages, is super important.</p><p><strong>The cr&#232;me de la cr&#232;me of engineers can do both</strong>: whip up quick and dirty prototypes, validate their concepts at breakneck speed, and then spin those ideas into top-notch production code.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Work Multipliers: The Hidden Productivity Killers]]></title><description><![CDATA[How the seemingly harmless "hey, could you please add this one simple feature" can crush your team's delivery speed forever.]]></description><link>https://juraj.blog/p/work-multipliers</link><guid isPermaLink="false">https://juraj.blog/p/work-multipliers</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Sat, 03 Jun 2023 14:10:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Z_M5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Engineers and PMs are used to judging the typical cost-benefit ratio of a new feature: Simply weigh the potential benefit against the man-days needed to put the feature in place, prioritize the list, and start from the top. Seems right? Not quite.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z_M5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z_M5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Z_M5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Z_M5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Z_M5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z_M5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png" width="386" height="386" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:386,&quot;bytes&quot;:1905786,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z_M5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 424w, https://substackcdn.com/image/fetch/$s_!Z_M5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 848w, https://substackcdn.com/image/fetch/$s_!Z_M5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!Z_M5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5185a920-66bc-4d95-bd97-95c02e6b034e_1024x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Engineers often overlook how adding a feature impacts all future changes from that point on.</strong> Here's the truth:</p><p>Not all features are created equal. Some can literally tank your future productivity.</p><div><hr></div><p>"All of our competitors have dark mode, let's add it!"</p><p>"Let's translate our dashboard into other languages to break into European markets. How hard can it be?"</p><p>"Should we launch the responsive web app as a hybrid iOS app as well?"</p><p>"Don't forget about Android!"</p><p>"Could we convert parts of the web app into an Electron desktop app?"</p><div><hr></div><p>These suggestions sound harmless until you realize that <strong>every single feature added from that point on needs to accommodate all versions of your app</strong>.</p><p>Light &amp; dark, web &amp; iOS &amp; Android &amp; Electron, English &amp; German... <strong>that's 16 versions of the same page right there.</strong></p><p>Since it's not practical to check all page versions when adding a new feature, you'll end up with a user experience prone to errors and inconsistency, as well as a significant slowdown in development speed.</p><p>So the next time you're about to implement a feature, pause and ask yourself: <strong>could this be a work multiplier? </strong>Is it really worth it?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><strong>P.S.</strong> <strong><a href="https://betterstack.com/careers">We&#8217;re hiring</a></strong><a href="https://betterstack.com/careers"> at Better Stack</a>.</p>]]></content:encoded></item><item><title><![CDATA[100x Software Engineering]]></title><description><![CDATA[There's a subtle art to crafting amazing software at a pace that leaves your competition in the dust.]]></description><link>https://juraj.blog/p/100x-software-engineering</link><guid isPermaLink="false">https://juraj.blog/p/100x-software-engineering</guid><dc:creator><![CDATA[Juraj Masar]]></dc:creator><pubDate>Sat, 03 Jun 2023 14:04:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a20d61f-018f-4135-b33c-0485d6ca9adb_1080x721.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most of us get that there are top-tier software engineers who outperform their peers but fail to grasp by how much. And it's not about being 2x, 5x, or even 10x better. Some of the very best engineers are 100 times more productive than their peers.</p><p>Picture that: creating more value in a single day than a big-co engineer creates in 3 months.</p><h3>The examples are everywhere</h3><p>Google's initial team had just three people. Apple's crew was only 25-strong when they introduced the Apple II. At the point of its acquisition by Facebook, WhatsApp was serving 600 million users with a team of roughly 50 engineers. Instagram's tale is quite similar, boasting 30 million users with a mere 13 engineers at its $1 billion acquisition. And Basecamp? It began as a humble side project.</p><p>Similarly, at Better Stack we had only 3 software engineers writing code back in the day when we crossed $2 million in ARR, coupled with double-digit monthly growth. That's an impressive "revenue per engineer" ratio, if you ask me.</p><h3>It&#8217;s the art of doing less</h3><p><strong>Imagine a "1x engineer" as a fresh university grad</strong> who, given enough time, could build any software from scratch.</p><p><strong>Then the "10x engineer" is a seasoned pro with a refined intuition that helps them identify the part of code that should be implemented using an existing open-source library instead of building it from scratch.</strong> This doesn't mean they write superior code or type faster. Rather, they understand the immense time-saving potential of plugging in an existing open-source work rather than re-inventing the wheel. The key here, of course, is choosing the right library.</p><p>Who&#8217;s the mythical &#8220;100x engineer&#8221; then?</p><p>A "100x engineer" has a comprehensive understanding of the product roadmap, business model, competition, and common customer issues as well as a detailed knowledge of the work needed to implement a feature. As a result, <strong>they can judge the cost/benefit ratio of a feature better than the product manager.</strong> <strong>100x engineers push back on feature definitions. They&#8217;re able to cut the right 5% of the feature to simplify its implementation by 100x.</strong></p><p>100x engineers aren&#8217;t necessarily better at writing code. They better understand the context of everything absent in the task description.</p><p>They&#8217;re able to take a second to judge the cost/benefit ratio of a feature before they jump into implementation. They can often do so better than the product manager or the CEO.</p><p><strong>In the end, it's about everything an engineer doesn't have to do.</strong></p><p>Yet, pragmatism and thinking from first principles can be surprisingly rare among engineers. We've all been guilty of over-engineering, premature scaling, recreating existing libraries, and blindly following industry "best practices".</p><p>But when you manage to find a few of these 100x engineers, you're in for some real magic.</p><div id="youtube2-YaZJCOXprtE" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;YaZJCOXprtE&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/YaZJCOXprtE?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://juraj.blog/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for free to receive new posts.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>