<?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[Jampa.dev]]></title><description><![CDATA[Everything related to Software Engineering, Management and AI!]]></description><link>https://www.jampa.dev</link><image><url>https://substackcdn.com/image/fetch/$s_!wPaW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f4d0c6-85e3-4fd4-b334-7fb1133b5fa4_460x460.png</url><title>Jampa.dev</title><link>https://www.jampa.dev</link></image><generator>Substack</generator><lastBuildDate>Wed, 15 Apr 2026 09:49:03 GMT</lastBuildDate><atom:link href="https://www.jampa.dev/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Jampa Uchoa]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[jampauchoa@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[jampauchoa@substack.com]]></itunes:email><itunes:name><![CDATA[Jampa Uchoa]]></itunes:name></itunes:owner><itunes:author><![CDATA[Jampa Uchoa]]></itunes:author><googleplay:owner><![CDATA[jampauchoa@substack.com]]></googleplay:owner><googleplay:email><![CDATA[jampauchoa@substack.com]]></googleplay:email><googleplay:author><![CDATA[Jampa Uchoa]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Things I still wouldn’t delegate to AI]]></title><description><![CDATA[When it comes to AI, I consider myself a &#8220;skeptical optimist.&#8221; I think it has evolved a long way.]]></description><link>https://www.jampa.dev/p/things-i-still-wouldnt-delegate-to</link><guid isPermaLink="false">https://www.jampa.dev/p/things-i-still-wouldnt-delegate-to</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Thu, 12 Mar 2026 13:03:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!crl_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When it comes to AI, I consider myself a &#8220;skeptical optimist.&#8221; I think it has evolved a long way. I even&nbsp;<a href="https://jampauchoa.substack.com/p/best-of-both-worlds-using-claude">(controversially) put it in my testing pipeline</a>. But sometimes, when I see how others use it, I wonder: are we going too far?</p><p>I&#8217;m not talking just about people simply&nbsp;<a href="https://techcrunch.com/2026/02/23/a-meta-ai-security-researcher-said-an-openclaw-agent-ran-amok-on-her-inbox/">handing over their email inbox to OpenClaw</a>. I&#8217;m referring to major incidents like how &#8220;<a href="https://www.ft.com/content/00c282de-ed14-4acd-a948-bc8d6bdb339d">AWS suffered ' at least two outages&#8217; caused by AI tools.</a>&#8221;&nbsp;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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>Code is cheap now, and we can fully delegate it to AI, <a href="https://www.jampa.dev/p/the-rise-of-one-pizza-engineering">but coding is only a small part of our jobs</a>. The others, like handling incidents caused by AI code, are not. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!crl_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!crl_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 424w, https://substackcdn.com/image/fetch/$s_!crl_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 848w, https://substackcdn.com/image/fetch/$s_!crl_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 1272w, https://substackcdn.com/image/fetch/$s_!crl_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!crl_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png" width="1456" height="631" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:631,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:722043,&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://www.jampa.dev/i/186326386?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.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_!crl_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 424w, https://substackcdn.com/image/fetch/$s_!crl_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 848w, https://substackcdn.com/image/fetch/$s_!crl_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.png 1272w, https://substackcdn.com/image/fetch/$s_!crl_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e7836bb-9bab-4d6a-aea6-f30e6b0f4e8d_5528x2396.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 role="img" 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><title></title><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>In all the situations below, you'll notice a pattern: people think &#8220;AI can handle most of it, so why not <em>all</em> of it?&#8221; and here&#8217;s how that leads to disaster.</p><h2>Hiring</h2><p>The misuse of automation in hiring predates the rise in LLMs. </p><p>Eleven years ago, I applied for a Django role and got rejected within&nbsp;<em>two minutes at 01 AM</em>, because I needed to know more about &#8220;Python&#8221; for the job. The email seemed to be written by a person. I submitted a new application with&nbsp;<strong>just one word added</strong>&nbsp;and received an interview invitation&#8230; The rejection was because the scanner didn&#8217;t find the word &#8216;Python&#8217;.&nbsp;</p><p>The main problem with companies that pull &#8220;clever&#8221; stunts like these is that they exclude great candidates. Not only that, but people will notice your flaws and share them publicly on platforms like Glassdoor, which can tank your reputation.</p><p>Some argue that automation is necessary because applicant volume can become overwhelming. I disagree. During the COVID hiring surge, I reviewed&nbsp;<strong>over 1,000 resumes a year&nbsp;</strong>and never considered automating screening. </p><p><strong>The reason why you shouldn't automate hiring is that it is the most important thing you do.</strong></p><blockquote><p>Hiring well is the most important thing in the universe. [&#8230;] Nothing else comes close. So when you&#8217;re working on hiring [&#8230;] everything else you could be doing is stupid and should be ignored! </p><p>&#8212; Valve New Employee Handbook</p></blockquote><p>Even with 300 applicants each month, you can review all the resumes in less than an hour by using better judgment than AI.&nbsp;<strong>That one hour spent is more valuable than dismissing a potentially great candidate</strong>. Finding the right candidate early also reduces the hours spent on interviews.</p><p>Now that people are embedding LLMs into the hiring process, the situation has worsened. I see many pitches for tools that claim to be better at evaluating candidates&#8217; interview performance than a human, which is simply absurd. </p><p><strong>Hiring is a human process</strong>: you need to understand not only what they say that makes sense, but also what excites and motivates them to see if they&#8217;ll be a good fit for the role.&nbsp;</p><p>You can&#8217;t measure qualities like enthusiasm and soft skills with AI. It will only accept what the candidate says at face value. </p><p>A candidate might claim they are passionate about working with bank accounting software in Assembly at your Assembly bank firm, but are they really?</p><h2>Code reviewing</h2><p>From my personal experience with AI review tools like CodeRabbit, Claude, and Gemini, I've noticed that a pull request with 12 issues results in 12 comments, but only about 6 are actual problems. The rest tend to be just noise or go unaddressed. </p><p>This doesn't mean those tools are useless. Letting them do an initial pass is very helpful, and some humans wouldn't catch some of the issues they find, especially the deep logical problems. </p><p><strong>The issue with automated review tools is that they are becoming the&nbsp;</strong><em><strong>de facto&nbsp;</strong></em><strong>gatekeepers&nbsp;</strong>for deploying code to production, leading to future outages and a low-quality codebase. The inmates have taken over the asylum, and we now have AI reviewing code generated by AI.</p><p>Review tools are very focused on checking whether your PR makes logical sense, such as whether you forgot to add auth behind a route, but they can't, for example, judge whether your code worsens the codebase.</p><p>They can't raise the bar, which is the best part of human reviews.&nbsp;<strong>Every time we create or review a PR, it's a chance to learn</strong>&nbsp;how to become a better engineer and to leave the codebase in a better state than we found it.</p><p>Comments from peers like &#8220;you are duplicating logic, you should DRY these components&#8221; encourage us to review our own code and improve as engineers. Relying only on AI review takes away that chance.</p><p>Most incidents I observe happen because AI struggles to evaluate second-order effects; it overlooks the Chesterton fence. For example, if you try to delete or change a downstream parameter, like a parameter needed and was removed by an LLM, which wasn&#8217;t caught by linting. This reflects a limitation of current models: they can't review your code across repos.</p><h2>Technical Writing</h2><p>I'm tired of reading AI-generated writing: it just doesn't respect the reader's time. I see many AI-produced texts that could be shortened by a quarter without losing any important information.</p><p>Reading emails, meeting notes, or technical documents filled with emoji spam and strange analogies (&#8220;it's not X, it's Y&#8221;) is tiring. When I see the words&nbsp;<a href="https://github.com/search?q=Executive+Summary%3A&amp;type=code">&#8220;Executive Summary</a>,&#8221; I often hesitate to read it.</p><blockquote><p><em>I would have written a shorter letter, but I did not have the time.</em></p><p>&#8212; Blaise Pascal</p></blockquote><p>There is power in simplicity and in respecting your reader's time. Most of my blog posts are cut by 50% just before I publish them. </p><p>Most people I know who use AI for communication do so because they believe their writing is not good.</p><p>But honestly, the&nbsp;<strong>goal of communication isn't grammar skills but to get the point across</strong>.&nbsp;</p><p>Good grammar is often overrated anyway. One of my favorite documents is the&nbsp;<a href="https://drive.google.com/file/d/1YaG9xpu-WQKBPUi8yQ4HaDYQLUSa7Y3J/view">leaked MrBeast memo PDF</a>, which is full of grammatical and punctuation errors but clearly communicates its message through a &#8220;braindump&#8221;, much better than any LLM ever could.</p><h2>Consumer research</h2><p>When you ask an LLM about your roadmap, you're likely querying what countless other companies with very different issues have already tried. The AI relies on patterns from its training data, and in my experience, those patterns tend to be too generic compared to the insights of a seasoned domain expert.</p><p>If your software is meant for hospital accountants, do you think they take time to blog about the frustrations of their workflow? The knowledge is stored in their minds, and you need to extract it. This vital knowledge is never documented and thus never accessible to an LLM.</p><p>I spent three years researching and working on accessibility for nonverbal individuals. If I ask the AI about what this industry lacks, it will start discussing the need for better UX solutions (there are countless papers on this, I even naively wrote one). Still, I saw multiple companies enter the market with great UX products only to crash and burn. </p><p>After a while, I realized that poor UX apps still dominate adoption because these companies invest millions in lobbying, partnerships with insurance companies, and training, which is the thing no one talks about.</p><h2>Management tools</h2><p>I get many messages from bots on Reddit and LinkedIn about AI management tools, but&nbsp;<a href="https://www.jampa.dev/i/184737278/9-trust-but-verify">as I mentioned before</a>, they lack context. The worst part is that they think they can make judgments with the limited context they have.</p><p>Here&#8217;s an example of a feedback tool output:</p><blockquote><p>&#8220;This engineer sucks, they do 40% fewer PRs than the median, I marked him as an <strong>underperformer</strong>&#8230; I also told your boss, HR and CTO about it, better do something!&#8221;</p><p>- Some tool with a fancy name and a &#8220;.io&#8221; domain</p></blockquote><p>But yet, that engineer is one of the best I have worked with.</p><p>The issue is that they try to outsmart the manager, which leads lazy managers to use the AI's suggestions as an excuse, resulting in poorly thought-out feedback because &#8220;<a href="https://www.youtube.com/watch?v=0n_Ty_72Qds">The computer says no</a>.&#8221;</p><h3>So, what should you delegate to AI?</h3><p>Think of the <strong>current LLMs as an &#8220;added value tool&#8221;</strong>, not a product, and definitely not an expert.</p><p>Most of what I wrote above is problematic because it overestimates what LLMs can do and enables them to operate unsupervised. You can't go back in time after AI makes a mistake, and there are no guardrails once a mistake is made.</p><p>I received a lot of criticism for my post about using&nbsp;<a href="https://www.jampa.dev/p/best-of-both-worlds-using-claude">AI to select E2E tests</a>&nbsp;in a PR pipeline. Yes, it sounds crazy, but this is the &#8220;added value&#8221; part: if the AI fails at selecting the right test, we will catch it before deployment. The value provided is that having it is better than having no pre-checks at all.</p><p>Before giving AI control, ask how resilient our system is when (not if) the AI screws up, and ensure you have stronger safety nets before delegating completely. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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[The rise of one-pizza engineering teams]]></title><description><![CDATA[AI has shifted the bottleneck and will now change the organizational chart.]]></description><link>https://www.jampa.dev/p/the-rise-of-one-pizza-engineering</link><guid isPermaLink="false">https://www.jampa.dev/p/the-rise-of-one-pizza-engineering</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Fri, 30 Jan 2026 17:29:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!sbwH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It is undeniable that using AI tools like Claude Code lets us write code faster now. </p><p>But the question is, how does that impact everything else? </p><p>In most teams, coding - reading, writing, and debugging code - used to be the part that took engineers the most time, but that is no longer the <strong>bottleneck</strong>.</p><p><a href="https://en.wikipedia.org/wiki/Theory_of_constraints">The Theory of Constraints</a>&nbsp;states that every system has a bottleneck, since without one, it would operate infinitely fast, which is impossible.</p><p>Let's see&nbsp;<strong>the new bottlenecks,</strong>&nbsp;their effect on the size and roles of engineering teams, and why Amazon's two-pizza-team rule&nbsp;<em>- &#8220;teams should be small enough to be fed by two large pizzas, ideally comprising 5-8 people&#8221;</em>&nbsp;- is being phased out.&nbsp;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sbwH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sbwH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 424w, https://substackcdn.com/image/fetch/$s_!sbwH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 848w, https://substackcdn.com/image/fetch/$s_!sbwH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 1272w, https://substackcdn.com/image/fetch/$s_!sbwH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sbwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png" width="1456" height="445" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:445,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1273483,&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://www.jampa.dev/i/184931317?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.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_!sbwH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 424w, https://substackcdn.com/image/fetch/$s_!sbwH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 848w, https://substackcdn.com/image/fetch/$s_!sbwH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.png 1272w, https://substackcdn.com/image/fetch/$s_!sbwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f7b7e98-6b0a-4326-8661-f89c9ff6a738_2769x846.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 role="img" 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><title></title><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">Designers and PMs will stay, but won&#8217;t be part of a specific team. This chart shows we still need designers.</figcaption></figure></div><h2>Product and design are the new bottlenecks</h2><p>Currently, LLMs are less useful for product managers and designers than for engineers. </p><p>On the Designer side, they struggle to create great prototypes. You notice how every AI product homepage looks the same. I believe this is a limitation of LLMs: they tend to generate ideas near the middle of their training data&#8217;s bell curve, which prevents bad design but also limits truly innovative concepts. </p><p>On the Product Manager (PM) side, LLMs can gather data and insights, but the most time-consuming part for the PM is communicating and talking with clients, which can't be automated as effectively.</p><p>This creates a new bottleneck: The project output starts to depend on the delivery speed of product specs and wireframes. </p><p>And it gets worse: generally, you have 4-7 engineers but a single (sometimes shared) PM and Designer in a team, creating an imbalance.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eXRr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eXRr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 424w, https://substackcdn.com/image/fetch/$s_!eXRr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 848w, https://substackcdn.com/image/fetch/$s_!eXRr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 1272w, https://substackcdn.com/image/fetch/$s_!eXRr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eXRr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png" width="522" height="341.6662087912088" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:953,&quot;width&quot;:1456,&quot;resizeWidth&quot;:522,&quot;bytes&quot;:608019,&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://www.jampa.dev/i/184931317?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.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_!eXRr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 424w, https://substackcdn.com/image/fetch/$s_!eXRr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 848w, https://substackcdn.com/image/fetch/$s_!eXRr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.png 1272w, https://substackcdn.com/image/fetch/$s_!eXRr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb220720f-cf33-4ecb-8fa5-544835be6f20_2602x1703.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 role="img" 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><title></title><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">AI coding caught every PM by surprise - &#8220;We're gonna need a bigger roadmap&#8221;.</figcaption></figure></div><h4>Sharing the Legos</h4><p>Some companies recognized this imbalance and&nbsp;<em>asked, &#8220;What if the engineers were involved in Product and Design instead of just receiving the product specs?&#8221;</em>&nbsp;Then they started hiring&nbsp;<strong>Product Engineers.&nbsp;</strong></p><p>This is not a new concept; the role has existed for over 16 years. But I am highlighting this because they are now more relevant than ever.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nmjG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nmjG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 424w, https://substackcdn.com/image/fetch/$s_!nmjG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 848w, https://substackcdn.com/image/fetch/$s_!nmjG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 1272w, https://substackcdn.com/image/fetch/$s_!nmjG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nmjG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png" width="586" height="346.40885860306645" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:694,&quot;width&quot;:1174,&quot;resizeWidth&quot;:586,&quot;bytes&quot;:63622,&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://www.jampa.dev/i/184931317?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.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_!nmjG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 424w, https://substackcdn.com/image/fetch/$s_!nmjG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 848w, https://substackcdn.com/image/fetch/$s_!nmjG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.png 1272w, https://substackcdn.com/image/fetch/$s_!nmjG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F46cb3014-aafa-47be-9d66-dff2900018eb_1174x694.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 role="img" 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><title></title><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">There is already a rise in hiring &#8220;Product Engineers&#8221;. Source: Hacker News <a href="https://console.cloud.google.com/marketplace/product/y-combinator/hacker-news">Big Query</a> table</figcaption></figure></div><p>Okay, so what are product engineers? They are software engineers empowered to handle some responsibilities of PMs and Designers, balancing the roles.</p><p>Product engineers assume traditional PM roles, including owning the roadmap, engaging with users, analyzing data, framing opportunities, and determining what to build.&nbsp;<em>However, they do not replace a PM</em>. The PM still provides context but is no longer the main driver of implementation.</p><p>On the designer side, they also assemble the building blocks of a design system. The designer still creates those blocks and collaborates on the UX flow, but they are no longer responsible for producing &#8220;pixel-perfect prototypes&#8221; that engineers must follow.</p><h2>The rise of specialists</h2><p>Not everyone should or will be a product engineer. </p><p>But the traditional software engineer who is "A jack of all trades, master of none" will not surpass an engineer who is a &#8220;master of one&#8221;.</p><p>AI is good at producing code of acceptable quality, but it is rarely excellent. You can't simply prompt and merge it into a mature codebase without in-depth human review.</p><p>There are many problems with AI coding:</p><ul><li><p>AI often approaches coding carelessly,&nbsp;<a href="https://fs.blog/chestertons-fence/">neglecting second-order effects</a>: it modifies or removes essential code without considering the consequences.</p></li><li><p>For an LLM to fix bugs, they need to make sense (and for the ones that pierce through the abstraction layers, they rarely do), so you can't just have a team entirely using AI without a solid understanding of the tools they use.</p></li><li><p>AI will replicate destructive patterns in your codebase, causing a decline in code quality over time because no one will detect and fix them. </p></li></ul><p>So,&nbsp;<strong>we need specialists</strong>&nbsp;to manage the platform code. It&#8217;s not that they won&#8217;t use AI, but they will act as gatekeepers during reviews and prevent bad patterns from being merged into the codebase.</p><p>We will probably see fewer full-stack engineer openings and more roles for back-end and front-end engineers. This doesn't mean they will do only one or the other, but they will be expected to be an expert in one area.</p><h2>Small Teams, Big Dreams</h2><p>Besides the previously mentioned imbalance, large teams also face two main challenges: communication overhead and the need to divide work so team members can work independently toward a shared goal. </p><p>For the second problem, it wasn't too bad. We could divide the work into epics that would take an engineer two weeks to finish, and they could work on them independently. But now two weeks feels like a long time. </p><p>Another issue is that AI performs best when given a wider context for a problem. This, in turn, makes dividing work even more difficult. </p><p>The ideal team size now appears to be&nbsp;<strong>2-3 engineers per project.&nbsp;</strong>Even with a larger team, you can divide it into smaller groups of 2 engineers for a set period and observe how quickly they progress.&nbsp;</p><p>However, <strong>avoid assigning large projects to a single person</strong>. Working alone for an extended period without anyone to brainstorm, review code, or collaborate can be challenging. </p><p>From my experience, an individual contributor's frustration tends to increase over time when they are on their own. Also, developers need to maintain and improve their communication skills, which are essential for growth.</p><h2>The engineering manager role is still needed, but has changed</h2><p>I get many DMs on Reddit and LinkedIn, pitching AI manager tools that track &#8220;productivity&#8221; and use AI to &#8220;evaluate&#8221; an engineer&#8217;s performance. </p><p>Most fail at the concept stage.<strong> </strong>Manager performance tools aren&#8217;t new, but they all fail by trying to outsmart the manager. <strong> </strong>AI will never have even 40% of the context a manager needs. <a href="https://www.jampa.dev/i/184737278/9-trust-but-verify">It can only evaluate &#8220;quantitative&#8221; metrics.</a></p><p><strong>But managers who don&#8217;t code will be rare</strong>: With smaller teams, their responsibility with the People pillar decreases, freeing up time for the &#8220;Programming&#8221; pillar. </p><p>I already explained that <a href="https://www.jampa.dev/p/lessons-learned-after-10-years-as">the &#8220;well-defined engineering manager role&#8221; is a myth</a>,<strong> </strong>and<strong> </strong>engineering management always involves adapting to a team, so that will always remain the same.</p><p>AI makes it easier for engineering managers to participate in coding. They already know how to break down a larger problem into smaller, reviewable goals, just like any senior engineer would.</p><p>So you prompt Claude, attend a meeting, and then review the code when you return!</p><p>But the role of a manager will differ from that of an engineer. They will not be assigned the same tasks&nbsp;<strong>because situations that demand a manager&#8217;s attention will always take priority</strong>. So it&#8217;s crucial to avoid work that could potentially block the team if halted.</p><h2>We won't stop there</h2><p>I believe this is just the first wave of changes. </p><p>My post assumes that AI won't improve much beyond its current state, which seems like a safe prediction. The progress isn't primarily from better AI models but from how we use them (tools, thinking capacity). </p><p>We're also seeing significant investment in designer and PM tooling where AI is not a centerpiece but a complement. I wonder how much more they can still improve. </p><p>There are many unknowns I haven&#8217;t addressed because they&#8217;re still uncertain, such as QA: How much can AI take over QA, and what will the roles of the QA Engineers be?</p><p>What else do you think is going to change? If you know, drop a comment.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! Subscribe for free to receive new posts about AI and Engineering.</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[Things I’ve learned in my 10 years as an engineering manager]]></title><description><![CDATA[Non-obvious advice that I wish I learned sooner.]]></description><link>https://www.jampa.dev/p/lessons-learned-after-10-years-as</link><guid isPermaLink="false">https://www.jampa.dev/p/lessons-learned-after-10-years-as</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Fri, 16 Jan 2026 16:46:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wPaW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f4d0c6-85e3-4fd4-b334-7fb1133b5fa4_460x460.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s been a while since my boss told me I needed to start hiring for my team. While I was at it, I should also handle onboarding... Since I knew the roadmap, I could take ownership of that... And because I knew the people, I could coach them in their careers.</p><p>I didn&#8217;t realize at the time, but he was dooming me to be an engineering manager.</p><p>Since then, I&#8217;ve worked across four companies as a manager, one as a founder, and another as a manager of managers. I will skip the <a href="https://taoem.com/">standard advice and lessons on Engineering Management</a> and focus on the non-obvious ones.</p><h2>1. The &#8220;well-defined engineering manager role&#8221; is a myth</h2><p>There is no standard definition for an Engineering Manager. If you pick two random managers, they can do very different things, even if they are at the same company.</p><p>In every company I&#8217;ve worked at, my role has never been the same. The only constant is that it&#8217;s defined by the team's needs, requiring you to balance across&nbsp;<a href="https://taoem.com/chapters/5/what-should-engineering-managers-be-doing">four pillars: Product, Process, People, and Programming</a>.</p><p> Some examples:</p><ul><li><p><strong>Large team?</strong> Say goodbye to programming. You&#8217;ll focus on building careers, coordinating efforts, and navigating the organization to get resources for your team.</p></li><li><p><strong>Small team? </strong>You&#8217;ll manage scope to match reality, and with less communication overhead, you might actually do some coding.</p></li><li><p><strong>No PM?</strong> You own the product completely: validating features, prioritizing the roadmap, and talking to clients. This takes up most of your time because shipping features that don&#8217;t offer user value makes everything else pointless.</p></li><li><p><strong>Reporting to the CEO?</strong> You&#8217;re now the link to sales, operations, and client communications.</p></li></ul><p>The key is to identify where your team&#8217;s bottleneck lies in your software development lifecycle. You&#8217;ll probably shift between pillars as circumstances change, and <strong>that&#8217;s the point</strong>: the role requires flexibility.</p><p><em>Tip: Never ask the interviewer what they expect from a manager. Some managers assume their experience is industry standard and might find that question odd. Instead, ask about their daily life and the challenges that take up most of their time.</em></p><h2>2. Everyone needs to care about the Product</h2><p>A few times in my career as a developer, I wondered, &#8220;Who is this feature even for? Who will use it?&#8221; No one on my team knew. We were doing it because&nbsp;<em>we were told to</em>. Morale was low. We felt we were working on things that didn&#8217;t matter - and we were. Eventually, our team disbanded, and engineers scattered across other projects.</p><p><strong>The most common reason companies fail is creating products that don&#8217;t deliver value to users, causing them not to pay.</strong></p><p>&#8220;Oh, but I have a PM for that,&#8221; you might say. But having a PM is not enough. Everyone needs to care about the product. Your team isn&#8217;t paid to just deliver code but to use it to&nbsp;<a href="https://taoem.com/chapters/7/the-engineering-role-in-shaping-product">solve problems</a>. </p><p>Code is valuable only when it benefits the end user. Sometimes, a no-code integration can outperform a custom solution. At times, it's better not to create a new feature at all to avoid maintaining a system. Teams that understand the problem, not just the spec, can pivot when necessary.</p><h2>3. There is no such thing as a free lunch when it comes to processes</h2><p>Every process trades time and attention for reliability or quality. The problem occurs when teams stop questioning if the trade is still worth it. Ceremonies become rituals. Metrics turn into goals. No one remembers why we spend an hour of our lives on this meeting.</p><p>Process bloat creeps in slowly. An engineer ships a broken UI to production. Designers complain, managers panic, and suddenly every PR requires designer approval. The whole team bears the cost of a single isolated incident.</p><blockquote><p>Good process serves you so you can serve customers. But if you&#8217;re not watchful, the process can become the thing. You stop looking at outcomes and just make sure you&#8217;re doing the process right. The process is not the thing. It's always worth asking, do we own the process or does the process own us?</p><p>&#8212; Jeff Bezos, 2016 Letter to Shareholders</p></blockquote><p>The right process varies based on context: team size, experience levels, and deadline pressure. What works for a mature team might not work for a new one. Keep questioning and iterating. <strong>If a process isn&#8217;t&nbsp;<a href="https://taoem.com/chapters/10/theres-no-free-lunch-with-engineering-process">improving delivery</a>, cut it.</strong></p><h2>4. Communicating downward requires transparency</h2><p>Your direct reports are the people who interact with you the most. They look to you for leadership and clarity, and trust that you&#8217;ll tell them what they need to know. </p><p>That&#8217;s why lying or withholding information that affects them causes irreversible damage. They might not leave immediately, but they will resent you. </p><p>I have a friend who still resents a manager for a lie told three years ago. They found another company, but they&#8217;re still angry about it.</p><blockquote><p>&#8220;Trust arrives on foot and leaves by horseback.&#8221; </p><p>- Old Dutch saying</p></blockquote><p>I've seen some managers describe the role as &#8220;a shield that blocks everything from above,&#8221; and I disagree. A good manager is more like a transparent umbrella. They protect the team from unnecessary stress and pressure, but don&#8217;t hide reality from them. </p><p>Telling the team: &#8220;Our users aren&#8217;t thrilled so far. We need to find ways to better serve them. The project risks cancellation if we don&#8217;t.&#8221; That&#8217;s fair game. They deserve to know.</p><p>When you do deliver hard news, state it clearly and focus on how the team will do about it. If you act scared, they&#8217;ll be scared too. Your goal is to get them thinking about the next steps.</p><h2>5. Communicating up requires a strategy</h2><p>I see managers walk into executive meetings saying, &#8220;We&#8217;re not sure what to do - maybe A, maybe B?&#8221; and then leave with orders to do Z, which doesn&#8217;t benefit the team or the project. </p><p>Executives can&#8217;t think of every possibility in detail - that responsibility lies with you and the person who owns the product (which, as we saw, could be you too). When a problem reaches the executives, it&#8217;s because a decision is needed, and they will make one. </p><p>People above you have limited time to focus on your specific issues. You can&#8217;t info dump on them. <strong>If they take a misguided action based on what you tell them, it will be your fault. </strong></p><p>If you believe in something, clearly state your case, including the advantages and disadvantages. Don&#8217;t expect higher-ups to think for you. It&#8217;s okay to bounce rough ideas off your direct manager, but beyond that, refine your thoughts - no one will think harder about your problems than you and your team.</p><p>If you need a guideline, a document should be: <strong>context &#8594; problem &#8594; plan / alternatives &#8594; what support you need</strong>. </p><h2>6. You are 10% player, 30% coach, and 60% cheerleader</h2><p><strong>Player (10%):</strong>&nbsp;Yes, only 10%. You might take on work your team isn&#8217;t excited about, but that matters: CI/CD improvements, flaky tests, process tooling. However, you need to stay off the critical path. As soon as you start handling essential tickets, you&#8217;ll block your team when managerial work pulls you away.&nbsp;</p><p><strong>Coach (30%):</strong>&nbsp;Your performance as a manager is the sum of your team&#8217;s output. Coaching involves preventing problematic behaviors from becoming normalized, such as toxicity, repeated mistakes, and consistent underperformance. </p><p>It also means supporting engineers' growth by challenging them appropriately, providing the right feedback, and helping them develop skills they&#8217;ll carry forward.</p><p><strong>Cheerleader (60%):</strong>&nbsp;Praise people more than you think you should. Validation is important. Most engineers prefer feeling appreciated over having a ping-pong table. </p><p>But give praise genuinely, not automatically. I once joined a team where retrospectives included 30 minutes of mutual praise - n-squared compliments every week. It felt hollow. Not every week has something extraordinary, and when praise becomes expected, it loses its impact. The&nbsp;<a href="https://en.wikipedia.org/wiki/Hedonic_treadmill">hedonic treadmill</a>&nbsp;is real.</p><p>Make your engineers&#8217; wins visible beyond your team. Encourage them to pursue impact outside the team, and celebrate their achievements when they do. </p><p>Every team operates like a small company within the larger organization. I find that its morale also exists independently of the company's overall morale.</p><h2>7. Your goal is for your team to thrive without you</h2><p>Most managers don&#8217;t plan to become bottlenecks. It happens gradually. A critical tool needs an owner, and you think, &#8220;I&#8217;ll handle this for now.&#8221; Someone needs to be the point of contact for another team, and it&#8217;s easiest if it&#8217;s you. Technical decisions keep landing on your desk because you&#8217;re the one with context. Before you know it, work stops without you.</p><p><strong>If you can&#8217;t take a month off and return to a well-functioning team, you need to work toward making that possible.</strong>&nbsp;</p><p>You&#8217;re too busy to be the bottleneck. If people keep reaching out to you for recurring tasks, delegate by teaching someone else to handle them. Point team members directly to each other or, even better, create group chats to facilitate natural discussions. </p><p>Don&#8217;t become the&nbsp;<a href="https://en.wikipedia.org/wiki/Bus_factor">bus factor</a>&nbsp;of 1. Train others so work continues smoothly even when you&#8217;re overwhelmed or unavailable. </p><p>Avoid making people feel they need your permission for small, reversible decisions. Empower them with agency. Request to stay informed about their decisions, but let them handle the technical side.</p><p>The reason you will do this is that managerial work can, and will, appear at the worst time. If you are the bus factor, you will be screwing your team when it happens. There are many engineers, but only one manager. Stay accessible for tasks that only you can handle.</p><h2>8. You can&#8217;t succeed without trusting your team</h2><p>Micromanagers micromanage because they don&#8217;t trust.</p><p>Ask yourself: can you trust every engineer on your team to do their best without you constantly watching? If not, something needs to change&#8212;either in you or in them. </p><p><strong>Trust isn&#8217;t about just technical skill.</strong> If I asked my current engineers (mobile and web developers) to build a Game Boy emulator from scratch, they wouldn&#8217;t know where to begin. They&#8217;d probably take months (some just weeks). But I&#8217;m sure they&#8217;d try their best to figure out how to run Pok&#233;mon Gold. </p><p>You need to trust both their abilities and their honesty:</p><ul><li><p>If you can&#8217;t trust their skills at their level of experience, it&#8217;s your job to help them get better. </p></li><li><p>If you can&#8217;t trust their honesty, and you have good reasons not to, then you need to part ways.</p></li></ul><h2>9. Trust, but verify</h2><p>Even great engineers get stuck without realizing it. Watching progress helps you spot when they need support before others see them as underperforming. </p><p>Processes like sprints and OKRs mainly focus on the &#8220;verify&#8221; stage <em>(see, your manager does this too)</em>. They serve as a shared interface to ensure work gets done. This isn&#8217;t about lack of trust but accountability. </p><p>Verification involves using metrics and evidence. There are two types: quantitative and qualitative. </p><p><strong>Quantitative is simple</strong>: PRs merged, points completed, code reviewed. You can glance at these, but decisions shouldn&#8217;t be based on them alone. If you could gauge engineer performance from numbers, managers wouldn&#8217;t be needed. </p><p><strong>Knowing the Qualitative metrics shows a manager's worth</strong>. &#8220;This engineer has fewer PRs, but they&#8217;re always watching Slack and hopping into calls to help others.&#8221; &#8220;This engineer always discusses tickets with product first - their output ends up far better than our original specs.&#8221; &#8220;This engineer explains complex concepts in ways everyone can understand and makes other teams use our tool better.&#8221; </p><p>These insights depend on truly knowing your team. That&#8217;s why <strong>most &#8220;management AI tools&#8221; are doomed to fail</strong>. They only focus on quantitative metrics. They don&#8217;t attend your standups, don&#8217;t conduct 1:1s for you, and don&#8217;t know who&#8217;s quietly holding the team together. A good manager does.</p><h2>10. Eventually delegate everything.</h2><p>Stop having pet projects; that&#8217;s a Staff Engineer&#8217;s domain. <strong>For a manager, every project is cattle</strong>: it needs to be completed, automated, delegated, or cancelled.</p><p>Managers hold on to projects for many reasons. Sometimes it&#8217;s comfort - you know this system, you built it, and it feels good to stay close to it. Sometimes it&#8217;s identity - you want to stay &#8220;technical&#8221; and not lose your edge. Sometimes it&#8217;s fear - you don&#8217;t trust it&#8217;ll be done right without you. None of these is a good reason to hold on.</p><p>The &#8220;I can do it faster myself&#8221; mindset might be accurate, but in the long run, it&#8217;s not sustainable. Every time you do it yourself, you rob someone else from learning and ensure you&#8217;ll be doing it forever.</p><h2>11. There is no free lunch when it comes to reducing risk</h2><p>Be risk-averse, not risk-paranoid. You can&#8217;t account for every variable. Some things can&#8217;t be anticipated, and overcorrecting may be worse than the original issue.</p><p>Hiring is where I see this most often. After a bad hire, managers start requiring referrals, but almost anyone, no matter how unskilled or dishonest, can find someone to vouch for them. Others add more interviewers to the panel, thinking more eyes means better vetting.</p><p>The opposite happens: each interviewer becomes more lax, expecting someone else to be &#8220;the bad guy.&#8221; Responsibility gets diluted. Three great interviews beat seven mediocre ones.</p><p><strong>Think about second-order effects too</strong>: while you&#8217;re scheduling that seventh round, good candidates are accepting offers elsewhere. The best talent moves quickly. A slow, risk-averse process filters out exactly the people you wanted to hire.</p><div><hr></div><p>If any of this resonated, my free online work-in-progress&nbsp;<a href="https://taoem.com/">book</a>&nbsp;goes deeper. If you&#8217;re a manager too, I&#8217;d love to hear what you&#8217;ve learned. Drop it in the comments!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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[Using LLM as a writing assistant (without the slop)]]></title><description><![CDATA[Why LLM generated text is so weird, and how to make it work]]></description><link>https://www.jampa.dev/p/writing-with-ai-without-the-slop</link><guid isPermaLink="false">https://www.jampa.dev/p/writing-with-ai-without-the-slop</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Fri, 24 Oct 2025 15:02:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QTR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I suck at writing. I open too many parentheses, and my thoughts scatter (everywhere).</p><p>So when ChatGPT launched, I thought it would finally replace Grammarly. </p><p>But LLMs have their own problems:</p><blockquote><p>&#8220;It&#8217;s not just x&#8212;it&#8217;s y,&#8221;</p><p>Rhetorical questions? Affirmative answers!</p><p>&#8220;Here&#8217;s the kicker&#8221;: That preface was entirely unnecessary,</p><p>And in the end, it ends with recaps &#8212; that repeat everything already said, now with bullet points.</p></blockquote><p><strong>The problem with AI text</strong> is that when you read it, your first thought is: &#8220;Did this person actually invest time in this, or did they write a two-line prompt and expect me to read something they never even thought about?&#8221;</p><p>And as some people put it: &#8220;I&#8217;d rather just read the prompt.&#8221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QTR1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QTR1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 424w, https://substackcdn.com/image/fetch/$s_!QTR1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 848w, https://substackcdn.com/image/fetch/$s_!QTR1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 1272w, https://substackcdn.com/image/fetch/$s_!QTR1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QTR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png" width="645" height="458.74822190611667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:703,&quot;resizeWidth&quot;:645,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&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="" srcset="https://substackcdn.com/image/fetch/$s_!QTR1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 424w, https://substackcdn.com/image/fetch/$s_!QTR1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 848w, https://substackcdn.com/image/fetch/$s_!QTR1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.png 1272w, https://substackcdn.com/image/fetch/$s_!QTR1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e72433f-e6cc-4736-93af-8b2c415cb5fc_703x500.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 role="img" 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><title></title><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">The current state of Reddit, basically.</figcaption></figure></div><p>LLMs can&#8217;t be genuine because they don&#8217;t know how to be a person. They read text from multiple public sources and average it out. They weren&#8217;t trained by eavesdropping on authentic conversations or messages. (At least I hope not)</p><p>The more the AI creates for you, the worse the output becomes.</p><p>That&#8217;s why when you ask it to&nbsp;<em>keep it casual,</em>&nbsp;it turns into &#8220;How do you do, fellow kids?&#8221; and when you ask for a <em>professional tone,</em> it becomes &#8220;Alas, who&#8217;d&#8217;ve done this?&#8221;.</p><h2>What You Need to Provide</h2><p>If you want LLMs to cook, you need to provide ingredients.</p><p>As a general writing (and cooking) tip, start it raw. Don&#8217;t use autocorrect. In fact, don&#8217;t even look at what you&#8217;re typing. Close your eyes and let raw ideas flow, along with grammatical mistakes and misconstrued sentences. Just make it coherent enough. Make bullet points to answer: &#8220;What&#8217;s the point of me writing this?&#8221;</p><p>Connect those bullet points with your personality, which dictates how you link sentences. A serious person uses serious connectors; a casual person throws in verbal expressions (and memes).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!my_G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!my_G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 424w, https://substackcdn.com/image/fetch/$s_!my_G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 848w, https://substackcdn.com/image/fetch/$s_!my_G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 1272w, https://substackcdn.com/image/fetch/$s_!my_G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!my_G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png" width="1326" height="738" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:1326,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1195880,&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://www.jampa.dev/i/176898215?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.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_!my_G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 424w, https://substackcdn.com/image/fetch/$s_!my_G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 848w, https://substackcdn.com/image/fetch/$s_!my_G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.png 1272w, https://substackcdn.com/image/fetch/$s_!my_G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c85350-312c-4faa-ae88-ac932f98cc0e_1326x738.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 role="img" 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><title></title><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>How LLMs can help</h2><p>When you have the first draft, the key is using the right edits. The biggest mistake people make is while prompting. If you prompt like a casual writer, it treats you like one.</p><p>Saying, "Improve the text below for my email,&#8221; makes the AI slopify everything: it accesses the neural latent space of &#8220;This person needs my help immensely.&#8221;.</p><p>You need to signal, &#8220;Hey, I know what I&#8217;m writing. I just need help improving the flow while keeping my own words.&#8221;</p><p>You can do this by using the verbiage editors and publishers use during the different editing phases, from solidifying the overall scope to minor edits like correcting grammar.</p><p>While the LLM won't write for you, it can help you immensely, because writing words is not the hard part once you get the hang of it. For me, <strong>the editing takes 80% of the overall time</strong>. Most people start as slow writers because they try to write and edit simultaneously.</p><h2>Types of editing (and how they help)</h2><p>With chain-of-thoughts in newer models, <strong>you don't need much prompt engineering anymore</strong>. You just need to know the right words so the LLM's thinking can go into the right embeddings. </p><p>When publishing a book, the editing steps go from the most destructive (major rewrites) to the least destructive (removing typos). </p><p><strong>Also, as a metaexample, I&#8217;ve added the editing phases of this article <a href="https://docs.google.com/document/d/1oRq7b7wbBAIZ_rsRs-B-pL1bcPAQqF3dOQw5xpfRK1k/edit?tab=t.0">here</a>. You can see how the content changed from draft to final edit. </strong></p><p>Let's go in that order as well:</p><h3>Content Editing</h3><p>Content editing improves flow, structure, and clarity. It is useful when you know what you want to say but are unsure how to connect thoughts. </p><p>It&#8217;s the most destructive, so it's better only to use it once.</p><blockquote><p><strong>Example Prompt:</strong> &#8220;You are a content editor. Improve the flow of the sentences and make the text stronger and more structured. &lt;content&gt;&#8221;</p></blockquote><p>The AI will make many edits to make your text &#8220;make sense&#8221;, and the places where the AI misunderstood your intentions will stick out like sore thumbs. You will need to adjust them and add points that solidify your premise. </p><p>As you add (and cut) content for a second draft, it's time to move to line editing.</p><h3>Line Editing</h3><p>Line editing is where AI shines, especially for short texts like announcements. Use this when you know what and how you want to say something, but specific words escape you, or phrasing could be simpler.</p><p>I spend most of my time here, line editing multiple times and rewriting content until no paragraph is a waste.</p><blockquote><p><strong>Example Prompt:</strong> &#8220;Line edit this (Slack message / blog post): &lt;content&gt;&#8221;</p></blockquote><h3>Proofreading</h3><p>Proofreading happens when you&#8217;ve &#8220;mastered&#8221; the copy. It&#8217;s always safe to run multiple times without fearing the AI will destroy your voice, because you will tempt yourself to write small additional bits here and there.</p><blockquote><p><strong>Example Prompt:</strong> &#8220;Fix any grammatical mistakes in the text:&#8221;</p></blockquote><p>This is basically a cheap Grammarly. </p><p>As you can see, <strong>&#8220;writing&#8221; is actually two things: drafting and editing</strong>. AI struggles with the first but can greatly help with the latter. Even with better models, I don&#8217;t think we&#8217;ll completely remove the AI scent from text generated during the drafting phase.</p><p>So we as humans will need to write until we&#8217;re exhausted and don&#8217;t even want to finish what we wro&#8212;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! Subscribe for free to receive new posts. (And avoid getting shot by a snip-</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[Things I’ve learned in my 7 Years implementing AI]]></title><description><![CDATA[Even though the impacts of LLMs have never been seen before, they feel familiar to earlier assumptions.]]></description><link>https://www.jampa.dev/p/llms-and-the-lessons-we-still-havent</link><guid isPermaLink="false">https://www.jampa.dev/p/llms-and-the-lessons-we-still-havent</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Mon, 13 Oct 2025 16:02:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!FJXo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Even though the impacts of LLMs have never been seen before, they feel familiar to earlier assumptions. </p><p>For context: I wasn&#8217;t the &#8220;PhD scientist,&#8221; working on models. I was the guy who worked on productionizing their proof-of-concept code and turning it into something people could actually use. I worked in industries ranging from software/hardware automated testing at <em>Motorola</em> to small startups dealing with accessibility and education.</p><p>So here is what I've learned:</p><h2>AI as a product isn&#8217;t viable: It&#8217;s either a tool or a feature</h2><p>This AI hype cycle is missing the mark by building ChatGPT-like bots and &#8220;&#10024;&#8221; buttons that perform single OpenAI API calls. </p><p>For example, Notion, Slack, and Airtable now lead with &#8220;AI&#8221; in their page titles instead of the core value they provide. Slack calls itself &#8220;AI Work Management &amp; Productivity Tools,&#8221; but has anyone chosen Slack for its AI features?</p><p>Most of these companies seem lost on how to implement AI. A simple vector semantic search on Slack would outperform what they&#8217;ve shipped as &#8220;AI&#8221; so far.</p><p>People don&#8217;t use these products due to these &#8220;&#10024;&#8221; AI solutions. The best AI applications work beneath the surface to empower users. Jeff Bezos comments about this<strong>&nbsp;(<a href="https://www.aboutamazon.com/news/company-news/2016-letter-to-shareholders">in 2016!</a>)</strong> </p><p>You don&#8217;t see AI as a chatbot on the Amazon homepage. You see it in <em>&#8220;demand forecasting, product search ranking, product and deals recommendations, merchandising placements, fraud detection, translations.&#8221;</em></p><p>That&#8217;s where AI comes in, <strong>not as </strong><em><strong>&#8220;the thing&#8221;</strong></em>&nbsp;but as &#8220;<em><strong>the tool that gets you to the thing</strong></em>.&#8221; </p><h2>The best use of AI is to trivialize hard problems</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zW4W!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zW4W!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 424w, https://substackcdn.com/image/fetch/$s_!zW4W!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 848w, https://substackcdn.com/image/fetch/$s_!zW4W!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 1272w, https://substackcdn.com/image/fetch/$s_!zW4W!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zW4W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png" width="219" height="367.46067415730334" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:448,&quot;width&quot;:267,&quot;resizeWidth&quot;:219,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Tasks&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="Tasks" title="Tasks" srcset="https://substackcdn.com/image/fetch/$s_!zW4W!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 424w, https://substackcdn.com/image/fetch/$s_!zW4W!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 848w, https://substackcdn.com/image/fetch/$s_!zW4W!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.png 1272w, https://substackcdn.com/image/fetch/$s_!zW4W!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c0bb330-3693-4452-a22c-45030a197ec2_267x448.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 role="img" 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><title></title><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">Relevant XKCD, which is not relevant anymore&#8230;</figcaption></figure></div><p>What if a problem that took a team of PhDs one year to solve could be solved better in four hours? That's when LLM shines:</p><p>When I worked on accessibility for nonverbal people, one of our projects aimed to make communication cards (&#8220;I want,&#8221; &#8220;Eat,&#8221; &#8220;Yes,&#8221; &#8220;No&#8221;) context-aware to allow nonverbals to express their desires faster, similar to an autocomplete.</p><p>For example, the user is home at 7 AM and taps &#8220;I want to eat&#8221; card. </p><p>The next cards should anticipate their needs (which are more likely to be breakfast items), but there are caveats: What a person typically eats for breakfast depends on their country, the type of establishment they are in (home, hotel, restaurant), the day of the week, and, of course, current personal preferences, which also change over time.</p><p>After a year of work, our team of researchers from two universities achieved a&nbsp;<strong>55% rate</strong>&nbsp;(of the suggested options). It was a massive success at the time. We even won an award for best accessibility solution.</p><p>When ChatGPT 3.5 was released, I replicated a solution for this project and, after hacking over the weekend, got an <strong>82% accuracy rate</strong> when running against the same test database.</p><h2>There&#8217;s a reason we&#8217;re not seeing a &#8220;Startup Boom&#8221;</h2><p>AI skeptics ask, <em>&#8220;If AI is so good, why don&#8217;t we see a lot of new startups?&#8221;</em> Ask any founder. Coding isn&#8217;t even close to the most challenging part of creating a startup.</p><p>What I do see is a boom in internal tools. </p><p>This year alone, I shipped projects that would never have been viable. As an engineering manager, spending weeks coding means neglecting the team. </p><p>The &#8220;Nice to have&#8221; bucket is when a project dies. It means there is no engineering capacity to tackle it, so it goes into the backlog limbo&#8212;until now.</p><p>Now, I can build these projects using Claude, running prompts, and reviewing the output between meetings. I see many people releasing new things that are incredibly helpful and productive, which would not have happened without Claude or Cursor.  </p><h2>LLMs won&#8217;t get much better, but that is okay</h2><p>Like with all tools before it, we&#8217;re coming closer to the top of the S-curve for LLMs:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FJXo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FJXo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 424w, https://substackcdn.com/image/fetch/$s_!FJXo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 848w, https://substackcdn.com/image/fetch/$s_!FJXo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 1272w, https://substackcdn.com/image/fetch/$s_!FJXo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FJXo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png" width="568" height="282.8296703296703" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:725,&quot;width&quot;:1456,&quot;resizeWidth&quot;:568,&quot;bytes&quot;:116752,&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://www.jampa.dev/i/175824043?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.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_!FJXo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 424w, https://substackcdn.com/image/fetch/$s_!FJXo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 848w, https://substackcdn.com/image/fetch/$s_!FJXo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.png 1272w, https://substackcdn.com/image/fetch/$s_!FJXo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb1dc51e-8b89-4b7d-bac8-de656fb2ecf9_1969x980.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 role="img" 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><title></title><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">Note: Take this graph with a grain of salt. It is hard to compare earlier models because most benchmarks came much later.</figcaption></figure></div><p>The last releases were unimpressive. Does anyone know a real application where ChatGPT 5 can do something that o3 could not?</p><p>The good news is that what we have is enough for most people. AI tools like KNNs are very limited but still valuable today. </p><p>This also kills the reverse FOMO: &#8220;If I wait for the technology to mature, I won&#8217;t have to deal with their earlier quirks,&#8221; is less relevant now.</p><p>But AI research is definitely not over: We will still see cheaper, faster, and open models, like those that can run on a mobile device and are as capable as ChatGPT 4o.</p><h2>Ignore people trying to mystify AI</h2><p><strong>Creating</strong> AI models is hard, but <strong>working</strong> <strong>with</strong> them is simple. I put off implementing earlier AI tools because I couldn&#8217;t grasp how neural networks, sigmoids, and all that worked. Then someone said, &#8220;What are you doing? If you want to apply the technology, just use Scikit-learn.&#8221;</p><p>If you&#8217;ve never used AI for coding, install Claude Code and start using it for small tasks. That gets you 70% of AI&#8217;s current benefits without diving into prompt optimization or chain-of-thought mechanics.</p><p>Eventually, you&#8217;ll need to learn to leverage LLMs better when you hit bottlenecks. You will realize that you will still need to review code and CLI commands. You will naturally be better at prompting. You will know when and when not to use it.</p><p>AI is the new Agile: something simple, that makes you faster but has limits, yet people will position it as the solution for every problem, preaching: &#8220;Oh, you&#8217;re using (AI / Agile) wrong. In fact, it seems like what you need is even more of (AI / Agile)&#8221;</p><p>The tool has limits, especially when breaking new ground. LLMs are limited by their training data. For example, when I tried to vibecode a mod for a recently released Unity game, the AI failed to complete even a basic hook.</p><h2>If You&#8217;re a Senior, You Won&#8217;t Be Replaced (It&#8217;s the Other Way Around)</h2><p>Automatic railway gates replaced crossing attendants. But if those gates worked 99% of the time (or even 99.99%), would that be good enough? </p><p>LLMs are very far from being 99% accurate. They fix problems, but they tend to miss the root cause. I see many cases where the LLM suggested a fix by adding multiple lines, which an experienced engineer did by removing one. </p><p>Recognizing this requires senior-level skills, such as valuing simplicity over complexity and knowledge gained from dealing with similar bugs in the past.</p><p>This creates a problem for juniors, who, when using LLMs<strong>,</strong> will have problem-solving done for them and won&#8217;t develop this skill, hurting their code reviewing abilities. I see many companies that have stopped hiring juniors altogether.</p><h2>Yes, we&#8217;re in a bubble, but that&#8217;s good for us</h2><p>The Internet was a bubble in 1999, and you know the result. <s>The internet died completely, but it was good for a while. Man, I miss the Internet.</s></p><p>But seriously, we are seeing great tools coming to boost productivity, a new era of AI memes, while VCs and Big Tech pay for most of them. It&#8217;s a win-win.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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>Also, here is my current favorite SORA video: (Warning: <strong>LOUD</strong>)</p><p>(I had to remove the video because a bug in Substack causes the space bar to play the video instead of scrolling down&#8212;sorry for the jumpscare. Here&#8217;s the Reddit link instead: <a href="https://www.reddit.com/r/SoraAi/comments/1nwcx9e/some_body_cam_footage/">https://www.reddit.com/r/SoraAi/comments/1nwcx9e/some_body_cam_footage/</a>)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bVkL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bVkL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 424w, https://substackcdn.com/image/fetch/$s_!bVkL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 848w, https://substackcdn.com/image/fetch/$s_!bVkL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 1272w, https://substackcdn.com/image/fetch/$s_!bVkL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bVkL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png" width="1468" height="846" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:846,&quot;width&quot;:1468,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:695055,&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://www.jampa.dev/i/175824043?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56a4b699-4ae3-4f82-a2ad-97d71af68d12_1468x846.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_!bVkL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 424w, https://substackcdn.com/image/fetch/$s_!bVkL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 848w, https://substackcdn.com/image/fetch/$s_!bVkL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.png 1272w, https://substackcdn.com/image/fetch/$s_!bVkL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02e01a7d-95be-404e-bdc0-bc7847c40fe6_1468x846.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 role="img" 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><title></title><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>]]></content:encoded></item><item><title><![CDATA[Using Claude Code SDK to Reduce E2E Test Time by 84%]]></title><description><![CDATA[Best of both worlds: Building an AI gatekeeper that knows exactly which tests to run for your code changes]]></description><link>https://www.jampa.dev/p/best-of-both-worlds-using-claude</link><guid isPermaLink="false">https://www.jampa.dev/p/best-of-both-worlds-using-claude</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Sat, 06 Sep 2025 02:41:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wPaW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f4d0c6-85e3-4fd4-b334-7fb1133b5fa4_460x460.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>End-to-end (E2E) tests sit at the top of the test pyramid because they're slow, fragile, and expensive. But they're also the only tests that completely verify complete user workflows actually work across systems. </p><p>Due to time constraints, most teams run E2E nightly to avoid CI bottlenecks. However, this means bugs can slip through to production and be harder to fix because there are so many changes to isolate the root cause.</p><p><strong>But what if we could run only the relevant E2E tests</strong> for specific code changes of a PR? </p><p>Instead of waiting hours for the entire suite, we could get the results in <strong>under 10 minutes</strong>, catch bugs before they ship, and keep our master branch always clean.</p><h2><strong>Thinking with globs</strong></h2><p>The first logical step toward running only relevant tests would be using glob patterns. We tell the system to test what changed by matching file paths.</p><p>Here's how a typical <code>./labeler.yml</code> could work:</p><pre><code><code>user-authentication-test: # Trigger this test
  # If any of these file changes
  - "src/auth/**/*"
  - "src/components/LoginForm.tsx"
  - "api/auth/**/*"

checkout-flow-test:
  - "src/pages/checkout/**/*"
  - "src/components/PaymentForm.tsx"
  - "api/payments/**/*"

admin-dashboard-test:
  - "src/admin/**/*"
  - "api/admin/**/*"</code></code></pre><p>But globs are very limited. They require constant maintenance as the codebase evolves. Every new feature would require updating the glob patterns file. </p><p>More importantly, they cast too wide a net. A change to <code>components/Button.tsx</code> might need to trigger every E2E test that involves any page with a button interaction, depending on how deep the change is.</p><h2><strong>Enter Claude Code SDK</strong></h2><p>So, how can we determine which E2E tests should run for a given PR with both coverage and precision? </p><ul><li><p>We need&nbsp;<strong>coverage</strong>&nbsp;because missing a critical test could let bugs slip through to production. </p></li><li><p>But we also need&nbsp;<strong>precision</strong> because running tests that will obviously pass just wastes time and resources.</p></li></ul><p>The naive approach might be to dump the entire repository and changes into an LLM and ask it to figure out which tests are relevant. But this completely falls apart in practice. Repositories can easily contain millions of tokens worth of code, which makes it impossible for all AI models.</p><p>Claude Code takes a fundamentally different approach because of one key differentiator: <em>tool calls</em>. Instead of trying to process your entire codebase, Claude Code strategically examines specific files, searches for patterns, traces dependencies, and incrementally builds up an understanding of your changes.</p><p>So here's the hypothesis: If I see a PR, I will know which E2E tests it should run because I know the codebase. The question is: Can Claude Code replicate my human intuition by searching for it?</p><p>Let's build and find out.</p><h2><strong>Building the gatekeeper</strong></h2><p>For the E2E selection to be successful, Claude needs to know what I know: the PR modifications, the E2E tests, and the codebase structure. We need to glue all three together in a well-crafted prompt.</p><h3><strong>PR modifications</strong></h3><p>This is perhaps the easiest piece - we can leverage git to get exactly what we need. We start with the basic command:</p><pre><code><code>git diff main...HEAD</code></code></pre><p>This gives us the changes of a branch, but we can do much better. First, we want git to be less verbose, so we add <code>--minimal --ignore-all-space</code> to focus on the actual code changes rather than whitespace noise.</p><p>We also don't care about deleted files since we'll need to remove references in existing files anyway (unless we don't care about those tests), so we add <code>--diff-filter=ACMR</code> to exclude deleted files and focus on (A)dded, (C)opied, (M)odified, and (R)enamed files.</p><p>Finally, we need some strategic excludes because there are generally large files in PRs like <code>package.lock</code> that would blow up our token count. We add <code>':(exclude)package.lock'</code> to keep things manageable.</p><p>Putting it all together:</p><pre><code><code>git diff main...HEAD --minimal --ignore-all-space --diff-filter=ACMR -- . ':(exclude)package.lock'</code></code></pre><p>The result is a clean diff showing the actual code modifications:</p><pre><code><code>diff --git a/src/components/LoginForm.tsx b/src/components/LoginForm.tsx
index 1234567..abcdefg 100644
--- a/src/components/LoginForm.tsx
+++ b/src/components/LoginForm.tsx
@@ -15,7 +15,7 @@ export const LoginForm = () =&gt; {
   const handleSubmit = async (values: LoginValues) =&gt; {
-    await authService.login(values.email, values.password);
+    await authService.loginWithValidation(values.email, values.password);
   };</code></code></pre><h3><strong>E2E test inventory</strong></h3><p>We could hardcode a list of test files in our prompt, but that violates the <em>single source of truth</em> principle. We already maintain this list for our daily benchmarks, so let's reuse it. For example, if the test configuration lives in a WebdriverIO (<code>wdio.conf.ts</code>) config file, we can extract it programmatically:</p><pre><code><code>bun -e "import('./wdio.conf.ts').then(m =&gt; console.log(JSON.stringify(m.config.suites.liveTests, null, 2)))"</code></code></pre><p>This script dynamically reads the <code>wdio.conf.ts</code> file and outputs our exact test suite configuration:</p><pre><code><code>[
  "./test/specs/Admin/Login.spec.ts",
  "./test/specs/Admin/Vendors.spec.ts", 
  ...rest of files
]</code></code></pre><h3><strong>Crafting the prompt</strong></h3><p>The prompt needs to be precise about what we want. We start by setting clear expectations:</p><pre><code><code>Read the "Branch git diff" below and match it against the active "Available E2E files" below, think deep, and inspect relevant files further to decide which E2E test should run.</code></code></pre><p>The key phrase here is <strong>"think deep"</strong>. This tells Claude Code not to be lazy with its analysis (while spending more thinking tokens). Without it, the output was very inconsistent. I used to joke that without it, Claude runs in &#8220;engineering manager mode&#8221; by delegating the work.</p><p>Next, we set boundaries:</p><pre><code><code>You should only run tests listed in "Available E2E files". If there's a reasonable chance a change could affect a test based on the actual code modifications, include it. When in doubt, **include the test**.</code></code></pre><p>The "only run tests listed" constraint was added because Claude was being "too smart," finding work-in-progress spec files and scheduling them to run. We added the last piece because it is better to run more specs than leave a test out.</p><h3><strong>Getting structured output</strong></h3><p>I initially asked for <em>JSON output</em>, and since I didn't want Claude's judgment to be a black box, I requested two keys: the <strong>list of tests to run</strong> and an <strong>explanation</strong>. This makes it easy to benchmark whether the reasoning is sound.</p><p>I initially tried using <em>JSON mode</em> and asking Claude to output only JSON:</p><pre><code><code>2. Output a JSON containing 2 keys, JSON only
- explanation: The explanation why you chose those E2E tests to run, be brief and concise, and use markdown format  
- tests: An array of spec file paths that should be run, like this, with no other explanation:
["./test/specs/Admin/Login.spec.ts", "./test/specs/Guest/Guest.spec.ts"]

REALLY JUST OUPUT JSON ONLY, NO YAPPIN, PLEASE DUDE JUST THE JSON</code></code></pre><p>But Claude has strong internal system instructions and <strong>couldn't stop adding commentary</strong>. I initially fixed this with a regex JSON parser to remove the commentaries, but when you use regex to solve a problem, you get two problems.</p><p>But then I realized: Claude Code is used to write files, <em>duh</em></p><p>So instead of fighting with JSON mode and regex, I asked:</p><pre><code><code>Create a file called test-recommendations.json in the @/gatekeeper directory</code></code></pre><p>Works every time!</p><h3><strong>Stitching it all together</strong></h3><p>The final pipeline combines everything with what might be the ugliest bash command known to humankind:</p><pre><code><code>"e2e:gatekeeper":

cat ./gatekeeper/analysis-prompt.md \
  &lt;(echo '\n Available E2E files: \n') \
  &lt;(bun list-e2e-tests) \
  &lt;(echo '\n Branch git diff: \n') \
  &lt;(bun git-diff)</code></code></pre><p>The result command is piped to Claude:</p><pre><code><code>bun e2e:gatekeeper | claude -p --allowedTools "Edit Write"</code></code></pre><p>We add <code>--allowedTools "Edit Write", </code>So it can write our <code>test-recommendations.json</code> file.</p><p>By the way<strong>, you should never use </strong><code>--skip-dangerous-permissions </code>which gives all permissions, including <code>Fetch</code>. <strong>I am surprised by how many people are taught to do this</strong>. If we did add this flag, someone could write in the prompt file and instruct Claude to read our environment variables and send them to a URL using Fetch(). </p><p>Since the CI runs on a PR open, not a merge, this would be similar to a &#8220;0-click&#8221; exploit.</p><h2><strong>Results: 44 minutes down to 7 minutes</strong></h2><p>I won't lie - this exceeded my expectations. We used to run all core tests, which took 44 minutes (and now it would take us more than 2 hours, since we keep adding tests). Most PRs complete E2E testing in less than 7 minutes, even for larger changes. </p><p>Even if it performed worse, it would still be an incredible success because our system has so many complexities that other types of tests (unit and integration) are nowhere near as effective as E2E.</p><p>The solution scales well because adding E2E test names consumes few tokens, and PR changes are mostly constant. Claude doesn't read all test files: it focuses on the ones with semantic naming and explores modified file patterns, which is surprisingly effective.</p><p><strong>Did Claude catch all the edge cases?</strong> Yes, and I'm not exaggerating. Claude never missed a relevant E2E test. But it tends to run more tests than needed, which is fine - better safe than sorry.</p><p><strong>How much does it cost? </strong>Without getting into sensitive details, the solution costs about $30 per contributor per month. Despite the steep price, it actually saves money on mobile device farm runners. And I expect these costs will drop as models become cheaper.</p><p>Overall, we're saving money, developer time, and preventing bugs that would make it to production. So it's a win-win-win!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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><item><title><![CDATA[My advice to the new generation of software engineers]]></title><description><![CDATA[The job market is tough for junior engineers right now, and many companies have drastically reduced hiring for these roles.]]></description><link>https://www.jampa.dev/p/my-advice-to-junior-engineers</link><guid isPermaLink="false">https://www.jampa.dev/p/my-advice-to-junior-engineers</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Thu, 21 Aug 2025 06:34:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wPaW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f4d0c6-85e3-4fd4-b334-7fb1133b5fa4_460x460.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The job market is tough for junior engineers right now, and many companies have drastically reduced hiring for these roles. Some claim this is due to AI, which still needs someone to operate it. Others blame outsourcing, a practice that's been part of the industry since, well, forever.</p><p>But the truth is, junior engineers have never had it easy. When I first started applying, I had seven years of experience writing software as a hobby and still struggled to get an interview. </p><p>It wasn't until I was on the other side of the table, hiring juniors myself, that I finally understood what I had been doing wrong.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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><h2>But why has the industry stopped hiring juniors?</h2><p>Ironically, the current situation is worse for juniors because, just a few years ago, things were <em>too</em> easy for everyone. Let's rewind to the COVID era.</p><ul><li><p>Governments initiated a ZIRP (Zero-Interest-Rate Policy), meaning "safe investments" like bonds became less attractive. Investors with a lot of cash lying around needed another avenue to generate returns. As a result, tech startups became a huge target for investment.</p></li><li><p>Also, during COVID, people needed to digitize their processes. Tools like Zoom, which were rarely used in person, suddenly became multibillion-dollar companies. </p></li><li><p>And, with more people at home, industries like advertising, entertainment, and gaming also saw a massive infusion of cash.</p></li></ul><p>These factors caused companies to hire like crazy, causing a shortage of software engineers.</p><p>With few senior engineers available, the high tide raised all the boats, and companies started poaching engineers from each other, including juniors. Recruiters were reaching even for boot camp graduates. I had a friend who was being paid and had a job offer lined up if he <strong>attended</strong> a boot camp.</p><p>However, the hiring frenzy created a long-term problem for juniors. </p><p>Everyone realized they were losing their junior engineers to other companies. Since juniors require training and would quickly get an offer elsewhere as &#8220;Senior" and leave anyway, companies stopped hiring them.</p><p>With the interest rates up, our industry is in a downturn (unless you slap &#8220;AI&#8221; in your product). I still believe juniors will make a comeback. The core principles of breaking into this industry haven't changed, and the demand for software engineers still exists. </p><p>So, how do you do that when the odds are stacked against you?</p><h3>Stand out or Wash out</h3><p>Even before COVID, many computer science graduates left the industry after getting their degrees. The problem was that many of them focused only on getting good grades and forgot about the actual craft of programming.</p><p>Imagine yourself as an employer reading resumes. What would set a candidate apart: their GPA or the fact that they worked on live projects that people are actually using?</p><p>I worked at a company that hired many juniors. When we reviewed their resumes, they mostly fell into two buckets, with a very imbalanced split:</p><ul><li><p>95% of resumes just listed a bootcamp certificate or a college GPA. The rest of the space was filled with fun facts, big headshots, and flashy modern designs.</p></li><li><p>The other 5% listed side projects, college research assistant work, public GitHub repos, Jupyter notebooks, or personal websites.</p></li></ul><p>We only interviewed candidates from that 5% bucket. We knew there were capable people with high potential in the 95% pile, but like most companies, we didn't have the budget or time to interview everyone.</p><h3>Getting into the 5% Bucket</h3><p>It used to be that you got the job, and then you got the experience. Now, it's the other way around.</p><p>If you're in college, you're in the perfect place to build connections and find opportunities, but very few students take advantage of them. Don't wait until your final semester or when you desperately need an internship to start thinking about your career.</p><p>Unless you plan to be a researcher and pursue a master's degree, college is primarily a launchpad for your employment prospects. It's also a chance to taste different areas of computer science. Most bootcamp grads end up as mobile, front-end, or back-end engineers, but in college, you can explore other segments like working with embedded devices, firmware, or even game development.</p><p>While you're there, find other students interested in building cool stuff. Many of the biggest tech unicorns were founded by people who met in college and shared a passion. You can also pursue research opportunities with professors. You'll learn a ton, and some have valuable industry contacts who can provide strong referrals.</p><p>If you're not in college, you can start your career by doing "odd jobs" instead of only pursuing full-time employment. For example, try creating a startup. Even if the idea is bad, it's the fastest way to learn.</p><p>Freelancing is one possibility, like doing a product for that friend-of-a-friend who owns a business. This path isn't for everyone, though. After a while, you might spend more time on business and negotiation than on becoming a better coder. Those are important skills, but they can get boring if your passion is the code itself.</p><p>Another option, if you're in a country where college is cheap or free, is to go to college and apply the advice I mentioned earlier. That's what I did, I knew how to code, but wanted to learn more.</p><p><strong>The most important thing is to keep making things</strong> and sharing them. It doesn't need to be a viable business or make a single cent. It can just be something you find helpful that might be useful to others, too.</p><p>Even when you "fail," you meet many new people. Even silly projects can lead to amazing things. I enjoy making scrapers, so back when Pok&#233;mon Go was at its peak, I built a map for my city. </p><p>One of my first users was the CTO of one of the biggest companies in my city, who encouraged me to apply to his company.</p><p>If you do enough of that, your resume will eventually cross the 95%/5% gap, and people will start calling you for interviews.</p><p>These "odd jobs" are career-defining. You will be forced to learn about optimization, caching, Redis, N+1 queries, microservices, and DevOps. You can also drop their links in your resume.</p><p>So, after a while, you will start to get interviews! Which is only half the battle.</p><h3>You Will Flop Your First Interviews</h3><p>Interviewing is a skill that has almost nothing to do with your actual skill as a programmer, but LeetCode-style problems aren't going away. You need to read at least the *Cracking the Coding Interview*, even if you aren't aiming for a FAANG job.</p><p>And even after you've read it, prepare to flop a few interviews. Remember that CTO who invited me to interview? I totally blew it. They asked me how I would design a database system using the Windows filesystem and folders. I basically told them the idea was silly. <em>"Why would you create a production database with TXT files on Windows? If you need a NoSQL-style system, why not use an actual RDBMS and avoid the Windows overhead?"</em> That's exactly how their system was built, and they didn't appreciate my candidness.</p><p>You will make mistakes in your first interviews. That's fine. It's how you learn to navigate the corporate world. You'll learn what you can say and, more importantly, what you can't. In the end, despite no one saying so, most interviewers aren't looking for the best candidate. They're more concerned with avoiding hiring the worst ones.</p><p>Once you land that first job offer and accumulate years of real-world experience, finding the next job gets easier. (It's never easy, of course, unless you have great connections).</p><p>One final piece of advice: don't focus on money too early in your career. Career growth is way more important. Joining a large enterprise might offer more job security, but a startup often gives you more opportunities to shine and get promoted faster.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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[Testing the Big Five LLMs: Which AI Can Better Redesign My Landing Page?]]></title><description><![CDATA[We compare Gemini, o1 Pro, Grok3, DeepSeek R1, and Claude 3.7 at improving my current book webpage.]]></description><link>https://www.jampa.dev/p/should-i-get-a-designer-an-llm-benchmark</link><guid isPermaLink="false">https://www.jampa.dev/p/should-i-get-a-designer-an-llm-benchmark</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Tue, 01 Apr 2025 05:40:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zco1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The best thing about AI is that it can code snippets I am not passionate about. I am glad that I no longer need to think as hard to write Javascript .reduce() or any Swift code.</p><p>With the new Flagship models coming in hot this month, like Gemini 2.5 and o1-pro, I thought it would be perfect to try those out in one category I suck most: <strong>visual design</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_!zco1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zco1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zco1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zco1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zco1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zco1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg" width="410" height="257.48" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1000,&quot;resizeWidth&quot;:410,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;graphics design is my passion | Figma&quot;,&quot;title&quot;:null,&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="graphics design is my passion | Figma" title="graphics design is my passion | Figma" srcset="https://substackcdn.com/image/fetch/$s_!zco1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zco1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zco1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zco1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85f50b63-d0df-4e86-bb79-0a47302601c7_1000x628.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 role="img" 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><title></title><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>This is the perfect opportunity for me to replace the designer in me who is terrible with hand-eye coordination and always got bad grades in art classes because my teacher thought I was &#8220;not taking it seriously enough.&#8221; However, it is cheaper to benchmark LLMs than to go to therapy.</p><h2>The Problem</h2><p>I am writing a <a href="https://taoem.com/">FOSS book about Engineering Management</a>, and I have created a monstrosity of a home page below&#8212;as you can clearly see, <em>I should get a designer</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_!edXY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!edXY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 424w, https://substackcdn.com/image/fetch/$s_!edXY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 848w, https://substackcdn.com/image/fetch/$s_!edXY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 1272w, https://substackcdn.com/image/fetch/$s_!edXY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!edXY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png" width="1456" height="1193" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1193,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!edXY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 424w, https://substackcdn.com/image/fetch/$s_!edXY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 848w, https://substackcdn.com/image/fetch/$s_!edXY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.png 1272w, https://substackcdn.com/image/fetch/$s_!edXY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf0bd064-cfd1-419e-85d4-fccb19e7a83e_1600x1311.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 role="img" 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><title></title><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>Job to be done</h3><p>We will take a screenshot and the code of the current homepage and feed it to multiple flagship AI models to ask them to make it less horrible. </p><p>The most popular reasoning models currently are <strong>Google Gemini 2.5, OpenAI o1 Pro High, xAI Grok3 Think,  DeepSeek R1</strong>, and <strong>Claude 3.7 Sonnet</strong>, so we are going with those. </p><h4>System Prompt</h4><p>I tweaked the system prompt in some preemptive benchmarks to improve common confusion points and things I missed. </p><p>I find this prompt good enough, even for non-reasoning models:</p><pre><code>You are taking the role of a professional website designer. Your task is to restructure the home page of a book called &#8220;The Art of Engineering Management&#8221; to be more visually attractive.

For reference, the attached image shows the website's current rendering.

The website has a Header, an Intro with a call to action, and a table of contents. Below is a skeleton of the web page with JSX components and SCSS files. The SCSS file for the table of contents is empty.

You may use any popular JavaScript libraries such as Three.js, or custom illustrations by creating SVGs if you want to. However, you may not use any CSS frameworks like Tailwind.

Your objective is to return modified files that will improve the landing page's visual appeal and attractiveness. Return only the modified files without additional explanations. Nothing should be a "TODO." You will be judged by how well your design is after the original files are overwritten.</code></pre><p>One thing I am learning with system prompts is that <strong>if you ask LLM too much, they start failing catastrophically</strong>. </p><p>For example, it is okay to ask an LLM agent to create a unit test for a component, but if you ask: &#8220;create all missing units tests in my codebase,&#8221; it shits the bed terribly. So I am going to keep it simple.</p><h2>Scorecard</h2><p>Let's establish a system to evaluate the AI results. I have created a scorecard system to evaluate what we want the most:</p><p><strong>Visual Design</strong> (50 points) - This is what we came for, so it should be half of the overall score</p><p><strong>Interactivity</strong> (25 points) - Relates to mouse button hovers and scroll animations, basically &#8220;making it pop.&#8221;</p><p><strong>Code quality</strong> (15 Points) - We should judge the code since having visual improvements is good and shouldn't come at the cost of code maintainability</p><p><strong>Dark mode compatibility</strong> (10 points) - A &#8220;nice to have&#8221;: Our prompt doesn't even mention it so that we can focus on the above. If the AI messes this up, it is a quick fix.</p><h3>Let's go!</h3><p>I ran my current code against all the models and will share the code and the prompt when possible. Here is the <a href="https://github.com/JampaUchoa/the-art-of-engineering-management/tree/ai-experiment">original branch from which the code is used</a>.</p><h3>Deepseek R1</h3><p>Let's start with the oldest one (I cannot believe I am calling an LLM released in January old). Deepseek produced a great concept with a few caveats.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;ef2bc28d-e71b-4c71-a44f-9f471371faba&quot;,&quot;duration&quot;:null}"></div><p>The art doesn't mean much. The links with the underlines under them are fugly, and, most important, the shadows are terrible, and the hover effect of a shadow is dated. </p><p>But at least it works with dark mode!</p><p>The&nbsp;<a href="https://github.com/JampaUchoa/the-art-of-engineering-management/compare/master...ai-exp-deepseek-r1">code is also not bad;</a>&nbsp;it adds a lot of SCSS, but it is expected.</p><p><strong>Result: Visual Design: 30 | Interactivity: 15 | Dark mode: 10 | Code Quality 10</strong></p><div><hr></div><h3>Gemini 2.5</h3><p>Google's new LLM has performed very well in many of my benchmarks. It makes the best even with the worst prompts.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;7f4d5c6f-3c23-4ab0-bc6f-0b8d78b6abdd&quot;,&quot;duration&quot;:null}"></div><p>This is very good. I have a few complaints about this design. I don't like the double columns of the chapters, but that is about it. </p><p>The hovering is great and presents the chapter in a very solid way!</p><p>In terms of&nbsp;<a href="https://github.com/JampaUchoa/the-art-of-engineering-management/compare/master...ai-exp-gemini-2.5-pro">code</a>, it did surprisingly well, and it even fixed my bad dark mode logic, but on the other hand, it had a lot of unnecessary comments, which would not be ideal for pushing to the main as is.</p><p><strong>Visual Design: 40 | Interactivity: 25 | Dark mode: 10 | Code Quality 10</strong></p><h3>Grok 3</h3><p>Grok is the first one to disappoint me so far, but at least it made me feel better about my own design.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;f26bc2cb-dcf8-4808-8949-23d8a6c58f56&quot;,&quot;duration&quot;:null}"></div><p>It repeated the book icon, &#8220;locked&#8221; the chapters as if I was selling a SaaS plan, and visually nested the cards too much. </p><p>Overall, there were some small changes, but none were positive. </p><p>It's also not stellar on the <a href="https://github.com/JampaUchoa/the-art-of-engineering-management/compare/master...ai-exp-grok3-think">code side</a> either, but at least I don't see any negative downsides.</p><p><strong>Visual Design: 10 | Interactivity: 15 | Dark mode: 5 | Code Quality 10</strong></p><h3>o1 Pro High</h3><p>o1 knows the key to my heart: I love blue and gradients. Maybe the fact that it did exactly how I liked it without me asking creeps me out.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;a72caec8-85cd-4060-ad6e-a822420109b6&quot;,&quot;duration&quot;:null}"></div><p>I really like the header&#8212;it draws more attention than others. And instead of adding a generic SVG, it went with the best approach with the current LLM capabilities. </p><p>The chapter's menu is also not bad. I like that it starts over the banner, so it flows better. </p><p>The padding around the chapter's card could be better, and the broken white padding around the whole site might have been a mistake. </p><p>The dark mode is utterly broken.</p><p>On the <a href="https://github.com/JampaUchoa/the-art-of-engineering-management/compare/master...ai-exp-o1-pro-high-reason">code side</a>, it is nothing bad; I could merge this as is. </p><p><strong>Visual Design: 40 | Interactivity: 25 | Dark mode: 0 | Code Quality 15</strong></p><h3>Con&#8230; Oh wait, it's Claude Sonnet 3.7, with a steel chair!</h3><p>I almost forgot Claude, to be honest. I always hear compliments on the code quality and how people prefer to use it on Cursor and Windsurf.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;dad7a342-f6d9-4a9d-8bc6-7c844504fa96&quot;,&quot;duration&quot;:null}"></div><p>I am glad to see its greatness in UI design as well. That gradient is super sleek, and the subtle blue backdrop is also cool. The SVG, while not the most incredible one, was at least the most relevant.</p><p>I just didn't like that it added the famous &#8220;3 boxes with icons&#8221; that you see in every landing page template. Also, the bullet points and double columns are not visually pleasing.</p><p>Ironically, since Claude LLMs are praised for their code quality, I <a href="https://github.com/JampaUchoa/the-art-of-engineering-management/compare/master...ai-exp-claude-sonnet-3.7">expected more</a>; it tried to import a new font and tried to make the book's page flip, which clearly did not work.</p><p><strong>Visual Design: 35 | Interactivity: 20 | Dark mode: 15 | Code Quality 5</strong></p><h2>Conclusion</h2><p>The results are in:</p><ol><li><p><strong>Gemini 2.5:</strong> 40 + 25 + 10 + 10 = <strong>85 points</strong></p></li><li><p><strong>o1 Pro High:</strong> 40 + 25 + 0 + 15 = <strong>80 points</strong></p></li><li><p><strong>Claude 3.7 Sonnet:</strong> 35 + 20 + 15 + 5 = <strong>75 points</strong></p></li><li><p><strong>Deepseek R1:</strong> 30 + 15 + 10 + 10 = <strong>65 points</strong></p></li><li><p><strong>Grok 3:</strong> 10 + 15 + 5 + 10 = <strong>40 points</strong></p></li></ol><p>One thing I missed in all the LLMs was improving the header text. I know that my callout is terrible because I am very bad at selling things. The system prompt even mentioned this, but all LLMs ignored it. But at least all the LLMs were successful in fixing 2 grammatical errors!</p><p>It is impressive that the AI &#8220;knows&#8221; how to better design a website without any visual aid to validate it afterward. Sure, it's not the Linear home page, and it won't win any Awwards, but in the end, I think that is the current LLM limitation. It is a blender of text absorbed by the corpus, resulting in an average of all designs worldwide.</p><p>I am also impressed by how the AI advanced. If I had tried this a few months ago, the results wouldn't be ready-to-run code. There would be just a few improvements in the code, but mostly not visual. </p><p>In the end, yes, any of those LLMs except for Grok would improve the current landing page, and I should have just applied the improvements instead of writing an article. However, I don't want an average book page. Even if I don't get paid for it, I want an excellent one. </p><p>So, for that reason, I am still getting a designer.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 my blog! Subscribe for free to receive new posts about AI and Tech Careers content.</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[The Battle for Attention]]></title><description><![CDATA[LinkedIn shows that I have six notifications, I know that none are interesting, but I click on them anyway.]]></description><link>https://www.jampa.dev/p/the-battle-for-attention</link><guid isPermaLink="false">https://www.jampa.dev/p/the-battle-for-attention</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Mon, 31 Mar 2025 15:29:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ijn1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>LinkedIn shows that I have six notifications, I know that none are interesting, but I click on them anyway. Like an empty fridge, I always fall for it. If I don't read it, it will start sending me emails.</p><p>Speaking about emails, I am unsure when I last had a real conversation using them. Most of them just want to tell me that their company exists. </p><p>&#8220;We are updating our privacy policy.&#8221; &#8212; We both know that's not why you are emailing me. No one, not even you, cares about your privacy policy.  </p><p>Email shadow advertising also takes many forms: like &#8220;How did we do? Give us feedback that we won't ever read&#8221; and &#8220;Your package has updates! (It is transit city that doesn't matter.)&#8221;</p><h2>Social media</h2><p>When we talk about attention, we always think about social media, which tries to get you addicted to it somehow. </p><p>If you want to test this, create a new account on Twitter / TikTok / Instagram and see what the algorithm feed "seed&#8221; posts are. They are always<strong> </strong>quasi-nudity, religion, public fights, hustlebros, or politics.</p><p>It is bad even when there is no algorithmic feed. Some years ago, Reddit's &#8220;all&#8221; page was used to entertain and have interesting news, but not anymore. If I open my Reddit /r/all page, all the posts are about &lt;x&gt; destroying the world, but what can I do? </p><p>None of those posts offer anything interesting or actionable. Most are rage-bait relationship stories written by AI and &#8220;clever comebacks&#8221; at a boomer politician who doesn't even know what an &#8220;ecks&#8221; is.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ijn1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ijn1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 424w, https://substackcdn.com/image/fetch/$s_!Ijn1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 848w, https://substackcdn.com/image/fetch/$s_!Ijn1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Ijn1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ijn1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png" width="348" height="464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:576,&quot;resizeWidth&quot;:348,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Arieh Kovler on X: \&quot;Do your part! https://t.co/o3ERJxBZ7N  https://t.co/vxlsoHpY9O\&quot; / X&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="Arieh Kovler on X: &quot;Do your part! https://t.co/o3ERJxBZ7N  https://t.co/vxlsoHpY9O&quot; / X" title="Arieh Kovler on X: &quot;Do your part! https://t.co/o3ERJxBZ7N  https://t.co/vxlsoHpY9O&quot; / X" srcset="https://substackcdn.com/image/fetch/$s_!Ijn1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 424w, https://substackcdn.com/image/fetch/$s_!Ijn1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 848w, https://substackcdn.com/image/fetch/$s_!Ijn1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.png 1272w, https://substackcdn.com/image/fetch/$s_!Ijn1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37a72777-f8b7-40b3-a900-a2e5703e0680_576x768.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 role="img" 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><title></title><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">Source: ExtraFabulousComics</figcaption></figure></div><h2>It is bad, even for creators</h2><p>The problem is that it didn't even click with me until I started a startup, but attention is more valuable than short-term financial success. </p><p>Views and signups are cool, but it is better if the user returns to you daily and you spend a lot of time in your app. Later, you can figure out how to turn this attention into money. </p><p>There is no limit to wealth, but there is to people's lives and how much of it they spend on your app.</p><h4>Using the software before it uses you</h4><p>If you want to show the world something you made, you need to gather that attention&#8212;&#8220;Build and they will come&#8221; is BS for anyone who ever created something. </p><p>And if you want that attention, you need to piggyback on existing platforms to try syndicating some of their attention. But they will always get the last laugh when they rug pull you, when &#8220;your attention&#8221; is stolen back into the &#8220;platform's attention.&#8221;</p><p>For example, if I post on LinkedIn with a link attached, no one will ever see the post because LinkedIn doesn't want people to click links that get you out of the website. </p><p>If you are a YouTube creator, you know that the people subscribing is not enough&#8212;you have to ask them to hit the bell. The algorithm sometimes won't prioritize your videos to your subscribers and will prefer random videos instead. </p><p>Ironically, even Substack (this platform) does this. When I go into Substack.com, my home is not the dashboard but other unrelated people's blogs, which are nothing close to things I care about.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!84Gs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!84Gs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 424w, https://substackcdn.com/image/fetch/$s_!84Gs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 848w, https://substackcdn.com/image/fetch/$s_!84Gs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 1272w, https://substackcdn.com/image/fetch/$s_!84Gs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!84Gs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png" width="525" height="329.92788461538464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:915,&quot;width&quot;:1456,&quot;resizeWidth&quot;:525,&quot;bytes&quot;:758574,&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://jampauchoa.substack.com/i/160167837?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.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_!84Gs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 424w, https://substackcdn.com/image/fetch/$s_!84Gs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 848w, https://substackcdn.com/image/fetch/$s_!84Gs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.png 1272w, https://substackcdn.com/image/fetch/$s_!84Gs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4f58e6de-2518-45af-966b-95068b4c901f_1724x1084.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 role="img" 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><title></title><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">Why Substack, why are you not opening my Dashboard by default?</figcaption></figure></div><p></p><h2>What can we do?</h2><p>The only way out of this hell is to treat your time as a currency. &#8220;Time is money&#8221; is now on a whole new meaning. Now, <strong>your time is someone else's money</strong>. </p><p>Now, I have the same disregard for people who want to steal my time as I do for people trying to scam me out of my money. </p><p>Send me an AI cold email, and I report it as spam. Have fun getting deservedly banned by GMail. Mobile notifications are a privilege not given to any social media.  Attention-seeking spam keeps coming in, but I slowly push it out.</p><p>Nowadays, I limit my social media to Subscribed Subreddits and Hacker News, but honestly, I can't resist sometimes going to Reddit's /r/all page and my local news websites and regretting it. </p><p>But like a diet, I know I might improve if I consume fewer garbage products.</p>]]></content:encoded></item><item><title><![CDATA[How promotions happens after Senior]]></title><description><![CDATA[How a promotion happens &#8212; and how to be prepared for it]]></description><link>https://www.jampa.dev/p/how-promotions-happens-after-senior</link><guid isPermaLink="false">https://www.jampa.dev/p/how-promotions-happens-after-senior</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Mon, 10 Mar 2025 17:07:46 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wPaW!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67f4d0c6-85e3-4fd4-b334-7fb1133b5fa4_460x460.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From junior to senior level, promotions depend mainly on meeting the proficiency bar for technical skills and communication abilities. But after reaching a senior level, whether your next step is toward Staff or Manager, clearing the proficiency bar alone isn't enough&#8212;there must also be a clear "business need." Positions typically become available when your company expands, someone leaves, or new initiatives emerge.</p><h3>Betting on the right horse</h3><p>The "business need" means that advancing beyond senior relies not just on you but also on your company's circumstances. This makes getting promoted in companies that aren't growing much harder because new roles or opportunities are rarely created.  And when a new senior role does open up, many internal candidates will compete for it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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>This is what makes growing companies attractive. They constantly need to find new ways to capture more market share, resulting in frequent hiring, formation of new teams and initiatives, and consequently, more senior+ roles.</p><p>If you want to accelerate your career growth, consider joining a rapidly growing startup. You'll likely have greater opportunities to handle significant challenges and rapidly develop your skills. The trade-off is usually stability and possibly a lower salary.</p><h4>How to know if a company is growing? </h4><p>Before accepting a new role, take the time to research the company's growth trajectory. Publicly available metrics such as headcount growth, Glassdoor reviews, funding rounds, and media coverage are good indicators of a company's health.</p><p>For larger companies, you can also assess their long-term potential by reviewing customer experiences on Reddit or other forums. Generally, satisfied customers point out a positive trajectory for the company.</p><h3>Being the CEO of your career</h3><p>It's important not to take a passive approach to your career advancement. There's a well-known saying in Western culture: "The squeaky wheel gets the grease." In conversations with friends who mentioned deep frustrations at work, I would often ask, "What does your manager say when you discuss it?" Surprisingly often, they had never even brought it up.</p><p>Ideally, your manager should initiate conversations about your career development at least every six months. Unfortunately, many managers never discuss career development, meaning you'll likely need to be the one to bring up the discussions.</p><p>Nobody is more invested in your career than you &#8212; Be explicit about your career goals during your one-on-ones with your manager. Doing so enables more relevant feedback tailored to your desired path and helps identify skills to focus on.</p><p>If your current manager understands your goals for advancement beyond senior, they can more effectively mentor you by highlighting relevant lessons from situations that arise. Without an awareness of your aspirations, they may miss opportunities to provide valuable context or guidance.</p><p>Proactively seek opportunities with your manager to learn essential skills relevant to your desired path&#8212;whether it's interviewing candidates, running meetings effectively, strategic thinking, or directly interacting with customers.</p><p>If possible, schedule occasional skip-level meetings with your director. These conversations offer insight into the company's higher-level challenges. It also doubles as a opportunity to know and build rapport with someone who could potentially become your future boss.</p><h3>Showing signs of leadership</h3><p>Senior leaders generally know exactly which individual contributors (ICs) on their teams are fully prepared to step into higher-level roles if needed. </p><p>Typically, these people are highly competent senior ICs who teammates naturally approach when they need help. They're effective communicators, strong mentors, and skilled at analyzing business requirements alongside technical tradeoffs; this makes them "go-to" advisors for their colleagues.</p><p>Another invaluable trait senior leadership looks for is curiosity, essential when offering feedback constructively. For instance, if a colleague takes an unusual approach in their work, instead of calling them out directly, ask why they chose that method rather than the accepted 'ideal' approach. Framing your concern as a question demonstrates trust in their abilities and encourages them to reflect and learn.</p><h3>Force multiplier</h3><p>One of the most powerful actions you can take if you're seeking career growth is to position yourself as a "force multiplier." Although this concept often goes unnoticed, it significantly impacts a project's success. Force multiplier is work that once completed, enables others on the team to deliver faster and more effectively.</p><p>Whether you aspire to become a Staff-level engineer or Manager, becoming a force multiplier is an essential milestone you'll need to achieve. Staff-level leaders don't necessarily do 2&#8211;10 times the direct work of a senior individual contributor. Instead, they identify the most impactful opportunities, remove critical roadblocks, or improve infrastructure, making their teams significantly more productive.</p><p>For example, if frequent production bugs constantly stall your team's progress, implementing critical automated testing can be a significant multiplier. This ensures improvements can safely ship and saves hours of debugging later.</p><p>Another scenario could be a situation where shifting requirements frequently force team members to redo their work repeatedly. One individual who effectively communicates with stakeholders and creates comprehensive specifications before the team's efforts begin can save many hours of redundant work.</p><p>Force multiplier efforts increase everyone's efficiency. Imagine you reduce your teammates' task times by 5 minutes each, and they complete around 3 tasks per day. Across a 5-person team, you've effectively added up to **375 working days per year** to your team's productivity!</p><p>Identifying possible multipliers can be challenging since they're often highly specific to a particular context or team dynamic. However, common areas worth exploring include:</p><p>* Overly complex processes or architecture forcing team members to duplicate effort across multiple areas, introducing errors.</p><p>* Lack of robust quality checks that slow team efforts due to manual testing and debugging cycles.</p><p>* Outdated or inefficient tools complicating maintenance and hindering effective troubleshooting or productivity.</p><p>* Non-technical process inefficiencies, like unclear task definitions or ineffective planning meetings which add unnecessary overhead.</p><p>The greater the number of people impacted by your improvement, the stronger the multiplier effect.</p><p>Look proactively for gaps within your team's workflow or processes. Your manager can help you spot these bottlenecks, but as someone actively involved in day-to-day work, you're perfectly placed to notice inefficiencies firsthand. Asking your teammates directly what they like or dislike about the project can also yield valuable insights.</p><h3>Getting your foot in the door</h3><p>Strive to progressively take on additional responsibilities through incremental trust-building with your manager and teammates. Promotions to Staff+ roles appear to happen overnight but take months of gradual progression.</p><p>Like many others, I started as an individual contributor at a growing startup, and my responsibilities gradually shifted&#8212;from technical tasks to hiring, mentoring, planning, and client interaction. Eventually, I found myself spending most of my time guiding and leading rather than executing individually.</p><p>When it became clear that I was essentially doing the higher-level work without official recognition, I approached my senior leadership about it. Shortly afterward, I received the official recognition and title, along with greater strategic responsibilities.</p><p>Finally, even if promotion opportunities don't happen in your current company, the skills and experiences you develop make excellent talking points when interviewing elsewhere.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 Jampa.dev! 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><item><title><![CDATA[Becoming a force multiplier]]></title><description><![CDATA[One of the most impactful things you can do is aim to become a force multiplier.]]></description><link>https://www.jampa.dev/p/becoming-a-force-multiplier</link><guid isPermaLink="false">https://www.jampa.dev/p/becoming-a-force-multiplier</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Wed, 29 Jan 2025 16:20:57 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/baf08c52-2c3a-455f-a86b-50301e0b9078_400x253.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the most impactful things you can do is aim to become a force multiplier. This concept is under-noticed among engineers but can make a sizable difference in a project. Force multiplier work is one that, when delivered, will allow other people to deliver faster. </p><p>Whether you want to be a Staff Engineer or an Engineering Manager, this is the most crucial bar you need to clear. A staff engineer or an architect does not do 2-10x the work of senior engineers. Still, they make teams 2-10x more productive by working on areas that will improve productivity.</p><p>Force multiplier work is one that, when delivered, will allow other people to deliver faster.</p><p>If you make a specific improvement that reduces by 5 minutes of your engineer's time in each task, and if they perform about 3 tasks in a working day. In a team with 5 people, you just gave your team <strong>375 days of work in a year</strong>. There is no 10x engineer, but there is work done by one that can have a 10x impact. </p><p>For example, a team impacted by constantly shipped bugs leads an engineer to create critical automated testing. This results in fewer bugs breaking production and speeds up every engineer on the team by reassuring them that their tickets will not break when shipping, also saving hours of debugging.</p><p>Another case would be a team that has to work back and forth frequently because new technical requirements constantly change. However, one engineer can produce excellent technical specifications by communicating effectively with stakeholders before writing the first line of code, saving the team hours of rewriting code.</p><p>The larger the number of people impacted by a positive change, the more critical the multiplier aspect is. Not every change needs to be so dramatic, but some can be even more productive, especially the ones that remove a communication overhead. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VtIk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VtIk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 424w, https://substackcdn.com/image/fetch/$s_!VtIk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 848w, https://substackcdn.com/image/fetch/$s_!VtIk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 1272w, https://substackcdn.com/image/fetch/$s_!VtIk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VtIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png" width="400" height="253" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3902790a-7d95-472b-a999-356584f1e914_400x253.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:253,&quot;width&quot;:400,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Route Setting Tips and Techniques: Ergonomics, Part 2: Movement and Levers&quot;,&quot;title&quot;:null,&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="Route Setting Tips and Techniques: Ergonomics, Part 2: Movement and Levers" title="Route Setting Tips and Techniques: Ergonomics, Part 2: Movement and Levers" srcset="https://substackcdn.com/image/fetch/$s_!VtIk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 424w, https://substackcdn.com/image/fetch/$s_!VtIk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 848w, https://substackcdn.com/image/fetch/$s_!VtIk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.png 1272w, https://substackcdn.com/image/fetch/$s_!VtIk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3902790a-7d95-472b-a999-356584f1e914_400x253.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 role="img" 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><title></title><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>Seeking opportunities</h3><p>Force multipliers are difficult to detect because they are specific to a team and codebase. But as a general rule, good potential candidates are bottlenecks and inefficiencies that drive daily aspects of the engineer's work, for example:</p><ul><li><p>Overengineered code architecture that requires the engineer to write duplicated code across codebases, with some occasional bugs.</p></li><li><p>Quality control gaps, especially in automation, make the engineers take more time testing their tickets or shipping bugs requiring new tickets to fix.</p></li><li><p>Outdated or reinvent-the-wheel code that introduces a lot of bugs, requires constant attention and makes it hard to find solutions to problems online due to documentation only supporting newer versions.</p></li><li><p>There are also non-technical cases, such as proposing improvements to the shipping process, such as ticket structure and ceremonies, to avoid additional meeting overhead.</p></li></ul><p>Therefore, look for gaps in your team. Your manager can help you identify those, but as someone working actively in the code, you are privileged to know how things are. Asking your fellow engineers what they dislike but have to spend their time on the project is also a good way to get that information.</p><div><hr></div><p>I am writing an open-source book for engineering managers (EMs) seeking to enhance their skills and senior engineers aspiring to transition into an EM role. If that is your thing, check out the <a href="https://github.com/JampaUchoa/the-art-of-engineering-management">Github</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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 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[Google AI tools are surprisingly underrated]]></title><description><![CDATA[Apparently a 2.2 trillion dollar company tools has not enought visibility]]></description><link>https://www.jampa.dev/p/google-ai-tools-are-surprisingly</link><guid isPermaLink="false">https://www.jampa.dev/p/google-ai-tools-are-surprisingly</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Tue, 12 Nov 2024 16:29:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bGSE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Google has a problem releasing: they start by announcing the product, which generates a lot of hype, but all we get is a landing page and a paper. After a few months, when people stop caring, Google quietly releases the tool&#8230; but it is a slow rollout in the US only. &#129318; </p><p>Compare this with the OpenAI strategy. They create hype long before releasing, then casually drop it with a closed beta, with a public release right after. </p><p>It's also Google's fault that nobody follows its tools&#8212;the names change occasionally: They invested millions in Bard just to change to Gemini. </p><p>Gemini also has multiple tiers and versions with caveats, like &#8220;1.5 Pro&#8221; is better than &#8220;1.0 Ultra&#8221;. There are multiple tiers and versions, like 1.5 Pro 002&#8212;the last number being extra padded with 2 zeros means more will come to confuse everyone. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bGSE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bGSE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bGSE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bGSE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bGSE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bGSE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg" width="728" height="482.5279383429672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:688,&quot;width&quot;:1038,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:220183,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bGSE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bGSE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bGSE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bGSE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c254069-892a-45ce-b99a-a18818d11536_1038x688.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 role="img" 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><title></title><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">A &#8220;Bard&#8221; ad I saw in Shibuya, Japan. So much money wasted on brand recognition&#8230;</figcaption></figure></div><p>So, why should you care about them? Their AI is far from capable like ChatGPT 4o's &#8212; Gemini feels more like GPT 3.5. Well, because it excels in the needle-in-haystack problems. </p><p>ChatGPT fumbles a lot of its tokens. It theoretically gives you 16k tokens in GPT-4o, which seems like a lot, but it tends to forget the earlier tokens, the more tokens you feed it. This is probably because it might use a &#8220;rolling-window&#8221; approach, so it does not consider those earlier tokens as much as it should, but you still pay for all of them.</p><p>If you want to use Gemini tools, you must also use different websites with generic names that will probably change twice before the project gets killed. The tools are&nbsp;<strong>Notebook LLM</strong>&nbsp;and&nbsp;<strong>AI Studio</strong>. Not to be confused with&nbsp;<em>LLM Studio</em>, a popular FOSS tool not made by Google &#8212; I&nbsp;told you it was confusing.</p><h2>Notebook LLM</h2><p>Notebook LLM sells itself short. It claims to be a tool for studying and brainstorming ideas using your documents. They also claim they can turn documents into an AI podcast(?). At first, it seems like things a student would use to <s>cheat</s> help with their exams. But the tool shines by being an excellent &#8220;<strong>Google Search for your documents</strong>.&#8221; </p><p>If you feed it with large documents, it can retrieve information and make interesting critiques. For example, I am using this tool extensively for my new engineering manager book. </p><p>Having the AI do extensive critiques with sources to back them up helps me write better and not lose my agency as an author by turning things into slop. I don't want to use GenAI since it only gives generic advice from SEO-hungry websites. Using NotebookLLM means I am still in control of my writing. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NxXQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NxXQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 424w, https://substackcdn.com/image/fetch/$s_!NxXQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 848w, https://substackcdn.com/image/fetch/$s_!NxXQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!NxXQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NxXQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png" width="1456" height="659" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:659,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:348712,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NxXQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 424w, https://substackcdn.com/image/fetch/$s_!NxXQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 848w, https://substackcdn.com/image/fetch/$s_!NxXQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!NxXQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86e22003-19ec-47c6-860a-597af264f00c_2386x1080.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 role="img" 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><title></title><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">Unlike ChatGPT, which is always positive, feedback from Notebook LLM provides a good critique that is sometimes very humbling.</figcaption></figure></div><h2>AI Studio</h2><p>What Notebook LLM can do for large documents, AI Studio can do for large videos. It is very useful to extract details from any media you have and seems to be the only tool to do so.</p><p>I imagine this tool being a game changer for people who use video to document things, like scouts for filming locations or real estate agents looking to write a pitch.</p><p>I sent 3 videos I made for later reference when I visited a house. I asked them to write a pitch for those videos. One thing that amazed me is that it saw a grapevine and used it for the pitch!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!flk4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!flk4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 424w, https://substackcdn.com/image/fetch/$s_!flk4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 848w, https://substackcdn.com/image/fetch/$s_!flk4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 1272w, https://substackcdn.com/image/fetch/$s_!flk4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!flk4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png" width="1456" height="458" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:458,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:288559,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!flk4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 424w, https://substackcdn.com/image/fetch/$s_!flk4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 848w, https://substackcdn.com/image/fetch/$s_!flk4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.png 1272w, https://substackcdn.com/image/fetch/$s_!flk4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1104ef5c-3d78-41c5-b457-5e5050063c2c_1826x574.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 role="img" 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><title></title><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">Overhyped pitch aside, it was impressive how well it gathered features from the property.</figcaption></figure></div><p>I've been using this tool for transcribing and annotating video evidence. My house inspection is 17 minutes long, and there was no way I was ever going back to watch the whole thing again. This transcription helps a lot to get the action points.</p><p>Something is very strange with it, though: Since the Lite mode worked so well. I thought the &#8220;Pro&#8221; model would work even better, but surprisingly, it was way worse. I don't have an explanation for this.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kqcj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kqcj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 424w, https://substackcdn.com/image/fetch/$s_!Kqcj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 848w, https://substackcdn.com/image/fetch/$s_!Kqcj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!Kqcj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kqcj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png" width="622" height="464.2974504249292" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1054,&quot;width&quot;:1412,&quot;resizeWidth&quot;:622,&quot;bytes&quot;:203910,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Kqcj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 424w, https://substackcdn.com/image/fetch/$s_!Kqcj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 848w, https://substackcdn.com/image/fetch/$s_!Kqcj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.png 1272w, https://substackcdn.com/image/fetch/$s_!Kqcj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3586eb8-23e0-438e-a776-9288a9cee70b_1412x1054.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 role="img" 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><title></title><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">Gemini Flash 1.5: It was surprisingly good despite its verbosity&#8230; So the Gemini Pro 1.5 should be even better, right?</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_9_e!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_9_e!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_9_e!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_9_e!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_9_e!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_9_e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png" width="628" height="463.976911976912" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1386,&quot;resizeWidth&quot;:628,&quot;bytes&quot;:188973,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_9_e!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 424w, https://substackcdn.com/image/fetch/$s_!_9_e!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 848w, https://substackcdn.com/image/fetch/$s_!_9_e!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!_9_e!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F661cf8d9-1d61-488c-a4d4-45ea8883300b_1386x1024.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 role="img" 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><title></title><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">Gemini 1.5 Pro: Not only did it take 1:20 minutes to run this, but the output is more incomplete than the Flash version, and it triggered a content warning for no reason.</figcaption></figure></div><p>Another limitation from Google is that the model is fine-tuned towards <em>safety</em>. Some very casual videos I've uploaded triggered the warning that I might have been breaking the ToS. </p><p>It also uses the word &#8220;diverse&#8221; a lot; it probably means that, in its internal token, it should focus on diversity, but it starts using this word for everything from &#8220;diversity of rooms&#8221; to &#8220;diverse problems.&#8221; It uses this word like ChatGPT uses &#8220;delve.&#8221;</p><p>Gemini is far from beating ChatGPT and perhaps even Claude Sonnet. They are playing safe with what they have, but we should not count them out of the game. Those tools are currently free, and NotebookLLM does not train on your data. With ChatGPT, segmenting these documents/videos into tokens/images is prohibitively expensive. The thing left for us to decide is how long "free&#8221; will last&#8230;</p><div><hr></div><p>If you are interested in the engineering manager book, I will send you the first chapters for free. These chapters will include the best and worst parts, how to succeed in the manager interview, and how the role differs in every company. If you provide feedback, I will send you the digital version of the book for free once it is released!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/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"></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[Wardriving for a place to live]]></title><description><![CDATA[Looking for high tech scalable solution for a low-tech city]]></description><link>https://www.jampa.dev/p/wardriving-for-place-to-live</link><guid isPermaLink="false">https://www.jampa.dev/p/wardriving-for-place-to-live</guid><dc:creator><![CDATA[Jampa Uchoa]]></dc:creator><pubDate>Wed, 21 Aug 2024 19:39:37 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%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I moved into a small city where I don't know anyone, and now I want to buy a place. Problem is: there are no listings anywhere, almost no real estate agents, and no updated information on the web. </p><p>In a city where you have to call to order deliveries, and Google Maps won't give you their number, how can I find a place to live? Moving to a high-quality neighborhood here would cost way less than in a normal one in a big city, so searching for it would be worth it, especially for a first-time buy</p><p>By driving around, I see there are a lot of properties "for sale" announced in a sign with a number and without a real estate agency attached.&nbsp;I could find one by just driving it. But the city is big, with too many streets to go, and too many unmapped dead ends. It has expanded organically. And the high and low infrastructure places are just one street apart.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WMOq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WMOq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 424w, https://substackcdn.com/image/fetch/$s_!WMOq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 848w, https://substackcdn.com/image/fetch/$s_!WMOq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!WMOq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WMOq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png" width="1456" height="835" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:835,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1166120,&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_!WMOq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 424w, https://substackcdn.com/image/fetch/$s_!WMOq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 848w, https://substackcdn.com/image/fetch/$s_!WMOq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.png 1272w, https://substackcdn.com/image/fetch/$s_!WMOq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc5d3f8a2-6206-4b12-8f3a-eee4bb00b4fc_1820x1044.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 role="img" 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><title></title><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">The city is a colonial-era city where the main export was/is sugarcane, near a major highway, with a lot of dead-ends with no urban planning.</figcaption></figure></div><p>With Street View, you can see the &#8220;good parts&#8221; of the town. But that is still too much work and honestly, I can barely remember where I "drove" later.&nbsp;</p><p>If there was a way to "cull" neighborhoods I would know where the potential home places are without driving into dangerous places. Afterward, I can narrow my search to only those places.&nbsp;</p><h3>The plan(TM):</h3><ol><li><p>Get all streets in the city area and points equally distributed along the road.</p></li><li><p>Get all the Street View pictures</p></li><li><p>Make GPT4 the judge of the neighborhoods.</p></li><li><p>Plot on a map!</p></li></ol><p>I did not bother with Google Maps at first because it just had too many "false" streets, and would probably cost something. It would take years of my time to download the 30MB on JS bundle of the Google Cloud Console and navigate their menus.</p><p>So I asked ChatGPT to generate code for me using OpenStreetMaps. Not gonna lie, I didn't even want to bother reading the code it made: "I just want the .exe" I said. But the ChatGPT got horribly wrong and wouldn't bother fixing it. So like a caveman, I had to read it and fix it.&nbsp;</p><p></p><pre><code>async function getStreetNetwork(north: number, south: number, east: number, west: number): Promise&lt;OverpassElement[]&gt; {
    const url = `http://overpass-api.de/api/interpreter?data=[out:json];way(${south},${west},${north},${east})[highway];out geom;`;
    const response = await fetch(url);
    const data: OverpassResponse = await response.json();
    return data.elements;
}

function getPoints(street: OverpassElement, interval: number, boundingPolygon: Feature&lt;Polygon, GeoJsonProperties&gt;): Point[] {
    const points: Point[] = [];
    const line = turf.lineString(street.geometry.map((coord: any) =&gt; [coord.lon, coord.lat]));
    const length = turf.length(line, { units: 'meters' });

    for (let i = 1; i &lt;= length / interval; i++) {
        const distance = i * interval
        const curPoint = turf.along(line, distance, { units: 'meters' });
        const angle = calculateAngleAtPoint(line, distance);
        if (turf.booleanPointInPolygon(curPoint, boundingPolygon)) {
            points.push([curPoint.geometry.coordinates[1], curPoint.geometry.coordinates[0], angle]);
        }
    }

    return points;
}

export default async function getStreetPoints(north: number, south: number, east: number, west: number): Promise&lt;Point[]&gt; {
    const points: Point[] = [];
    const interval = 70;  // meters

    // Define the coordinates of the bounding box
    const coordinates = [
        [
            [west, north], // Top-left corner
            [east, north], // Top-right corner
            [east, south], // Bottom-right corner
            [west, south], // Bottom-left corner
            [west, north]  // Closing the polygon by returning to the starting point
        ]
    ];

    // Create the polygon using Turf.js
    const boundingPolygon = turf.polygon(coordinates);

    const streets = await getStreetNetwork(north, south, east, west);

    for (const street of streets) {
            points.push(...getPoints(street, interval, boundingPolygon));
        
    }

    // Filter near 40m
    const filteredPoints = filterCloseGPSPoints(points, 40);

    for (const point of filteredPoints) {
        console.log(`[${point[0]}, ${point[1]}, ${point[2]}],`);
    }
    return filteredPoints;
}
</code></pre><p>For the roads I marked the points at every 70m, in imperial units that is 0.76 football fields, I had a &#8220;bug&#8221; that every point at the intersection on the road was marked. But it was due that the intersection is the "beginning of the road". Duh!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VLFR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VLFR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 424w, https://substackcdn.com/image/fetch/$s_!VLFR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 848w, https://substackcdn.com/image/fetch/$s_!VLFR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!VLFR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VLFR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png" width="1456" height="866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:866,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1217281,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VLFR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 424w, https://substackcdn.com/image/fetch/$s_!VLFR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 848w, https://substackcdn.com/image/fetch/$s_!VLFR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!VLFR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b744c34-4aa5-4907-a503-1ddeac9cc5f8_1816x1080.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 role="img" 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><title></title><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><h3>2. Getting the Street View photos</h3><p>It is super duper expensive now to use Google APIs. And Playwright is easier than reading Google documentation, so I am cashing the favor for contributing long enough to Google Maps.&nbsp;</p><p>One huge tip is to make the dimension of the image a multiple of 512 for OpenAI, a <strong>512x512 image costs 4x less than a 513 x 513 one</strong>. It says in the documentation that it splits the image in 512 x 512 chunks, or 85 tokens each, we do 1024x512, so it is wide and only 2 tiles!</p><pre><code>// Generate 2 angles to capture
const points = pointCloud.map(([lat, lng, deg]) =&gt; {
    return [
        [lat, lng, deg % 360],
        [lat, lng, (deg + 180) % 360],
    ];
}).flat();

// Set up Playwright Chromium browser
const browser = await chromium.launch({headless: false});

// So we spend only 2 tiles!
const context = await browser.newContext({viewport: {width: 1024, height: 512}});

const promises = points.map(([lat, lng, deg]) =&gt; limit(() =&gt; getPhoto(context, lat, lng, deg)));
await Promise.all(promises);


// Screenshot code

const filename = `screenshots/screenshot_${lat}=${lng}=${deg}`.replace(/\./g, '_') + ".png";
if (fs.existsSync(filename)) {
    console.log(`Skipping ${filename}.png`);
    return fs.readFileSync(filename);
}

const page = await context.newPage();

const url = `http://maps.google.com/maps?q=&amp;layer=c&amp;cbll=${lat},${lng}&amp;cbp=11,${deg},0,0,0`;
console.log(`Navigating to: ${url}`);
await page.goto(url);

// Wait for the page to load (wasteful, I know)
await page.waitForTimeout(5000);

// Run the script to delete children except for 'id-scene'
await page.evaluate(() =&gt; {
    const container = document.querySelector('.id-content-container');
    if (container) {
        container.querySelectorAll(':scope &gt; :not(.id-scene)').forEach(child =&gt; child.remove());
    }
});

// Take the screenshot
const screenshot = await page.screenshot({ path: filename, fullPage: true, type: 'png' });
</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zK4Z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zK4Z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!zK4Z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!zK4Z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!zK4Z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zK4Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png" width="1024" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:835811,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zK4Z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!zK4Z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!zK4Z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!zK4Z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e98768c-811e-44c5-9fa1-82c9bf2d6667_1024x512.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 role="img" 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><title></title><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><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rt9v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rt9v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!Rt9v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!Rt9v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!Rt9v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rt9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png" width="1024" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:824924,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rt9v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!Rt9v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!Rt9v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!Rt9v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd90eea3c-d516-4305-a505-d56b82fef5bd_1024x512.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 role="img" 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><title></title><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">Made sure to capture one angle along the road and the other inverted by 180 to avoid bias. Separately the first image ranks higher than the second despite it being 2 angles of the same point.</figcaption></figure></div><p>After the images were downloaded I spent hours promptly writing and got mad that the first short draft I made was the best one. GPT4 gets biased if you give too many details, like if it is Brazil mentioned, it starts to sugarcoat how bad the street is: </p><div class="pullquote"><p>"This precarious street without sidewalk [&#8230;] is typical of a Brazilian suburb - <strong>I give</strong> <strong>4 / 5</strong>" - GPT with more context. Was that a roast? Was the AI being ironic?</p></div><p>If you add what factors to consider to the prompt, it will hyperfocus on looking for a positive aspect in the input. A street with an abandoned lot was given credit for its &#8220;greenery&#8221;. Probably ChatGPT has instructions for it to be positive with what you give in the prompt and this case is not ideal.</p><p>Another good surprise is that the new structured output is awesome, you don&#8217;t need to YELL at the AI to not over-explain things, or safeguard it, and it spared a lot of time not calibrating the prompt.</p><pre><code>const images: ChatCompletionContentPartImage[] = photosPath.map(file =&gt; {
    const image = typeof file === "string" ? 
        convertImageToBase64(path.join(SCREENSHOT_DIR, file)) : 
        file.toString("base64");
    return {
        type: "image_url",
        image_url: {
            url: `data:image/jpeg;base64,${image}`,
        }
    };
});

const completion = await openai.beta.chat.completions.parse({
    model: "gpt-4o-2024-08-06",
    messages: [
        {
            role: "system",
            content: `
Your task involves receiving street view images and classifying the neighborhood infrastructure on a scale from 0 to 5. 
You will evaluate the neighborhood based on the average quality of its housing and pricing and translate that to a level. 
A low level (0) might represent a street with dirt roads and unfinished houses with exposed bricks.
A high level (5) would indicate a well-developed area with asphalt roads and high-quality houses.
`
        },
        {
            role: "user", content: images,
        },
    ],
    response_format: {
        type: "json_schema",
        json_schema: schema
    },
});

if (completion.choices[0].message.refusal) {
    throw new Error(`API refused to rate pointPhotos: ${lat}, ${lng}`);
}

return completion.choices[0].message.parsed as any as Response;
</code></pre><h3>3. Mo data mo problems</h3><p>Last thing, there are some loose spots, where there are some few good houses in an overall bad street. Those are not ideal candidates, I used something similar to KNN to remove that "noise". Yes, I made a O(n**2) code since my time is worth more than the energy that my Mac will use.</p><pre><code>// Function to find the 4 nearest neighbors of a given point
function findNearestNeighbors(point: { lat: number, lng: number }, points: any[], k: number = 4): any[] {
  return points
    .map(p =&gt; ({
      ...p,
      distance: calculateDistance(point, p)
    }))
    .sort((a, b) =&gt; a.distance - b.distance)
    .slice(1, k + 1); // Ignoring the first one because it will be the point itself
}

// Function to modify points based on nearest neighbors
function adjustRatings(ratings: any[]): any[] {
  return ratings.filter(point =&gt; point.rating != -1).map(point =&gt; {
    const nearestNeighbors = findNearestNeighbors(point, ratings);
    const maxNeighborRating = Math.max(...nearestNeighbors.map(p =&gt; p.rating));

    if (nearestNeighbors.every(neighbor =&gt; neighbor.rating !== point.rating) &amp;&amp; point.rating &gt; maxNeighborRating) {
      return { ...point, rating: maxNeighborRating };
    }

    return point;
  });
}</code></pre><p>Overall it was great enough, looking at the rating and the images in a vacuum like the AI did I would rate them the same as well. There were no disagreements between me and AI, which would invalidate the whole thing.</p><p>I also removed the beginning of the street in my code and removed nearby points to save some tokens.</p><p>Here is the final thing, using QGIS and TIM interpolation among points:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ucmZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ucmZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ucmZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ucmZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ucmZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ucmZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg" width="1456" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1707810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&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="" srcset="https://substackcdn.com/image/fetch/$s_!ucmZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ucmZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ucmZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ucmZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2612022c-4974-48bd-99b1-621d8228ae22_3709x2033.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 role="img" 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><title></title><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>Insights</h3><p>The good news was every place got at least 1, despite telling it to rate from 0-5, there were no legit zeros given. Even on muddy roads with large vegetation. But that was a good thing, it independently decided to reserve 0 to "not found" images and I could easily filter those out.</p><p>The bad news was that no place got a 5, the one that got a 4 was removed by the KNN, which is good for the quality of the rating but bad news for the city overall. I think a 4-5 would be a posh American suburbia with an HOA and lots of grass lawns and a large asphalt road with no overhead wires, and we have that here.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yhNm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yhNm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 424w, https://substackcdn.com/image/fetch/$s_!yhNm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 848w, https://substackcdn.com/image/fetch/$s_!yhNm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!yhNm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yhNm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png" width="628" height="512.191904047976" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1088,&quot;width&quot;:1334,&quot;resizeWidth&quot;:628,&quot;bytes&quot;:1997337,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yhNm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 424w, https://substackcdn.com/image/fetch/$s_!yhNm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 848w, https://substackcdn.com/image/fetch/$s_!yhNm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.png 1272w, https://substackcdn.com/image/fetch/$s_!yhNm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff906587f-6bbe-4cd3-a02d-5ae217c03bfb_1334x1088.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 role="img" 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><title></title><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">The only place that got a 4 was because someone left their garage door open. The AI saw a pool and thought: &#8220;Hmmm, yes, very upscale&#8221;.</figcaption></figure></div><p>A surprise was how consistent it was to judge according to its own parameters, all the prompting was done in isolation, but remained the same across nearby road spots. There were rarely sudden jumps between 1 to 3 for example.</p><p>Another surprise was that the AI loved parks, it could have the saddest playground ever, if there was a park it got at least a 1-point bump, but that makes sense, a park is a &#8220;permanent view" of some sort.</p><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rt8l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rt8l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 424w, https://substackcdn.com/image/fetch/$s_!Rt8l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 848w, https://substackcdn.com/image/fetch/$s_!Rt8l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 1272w, https://substackcdn.com/image/fetch/$s_!Rt8l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rt8l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png" width="1456" height="973" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:973,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1030389,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rt8l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 424w, https://substackcdn.com/image/fetch/$s_!Rt8l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 848w, https://substackcdn.com/image/fetch/$s_!Rt8l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.png 1272w, https://substackcdn.com/image/fetch/$s_!Rt8l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60b02295-e2ad-4ba6-b5fc-4174e143a7e2_2560x1710.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 role="img" 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><title></title><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"><a href="https://codepen.io/jampauchoa/full/LYKOKEO">Codepen from another run</a>. Ignore Google Warning modal.</figcaption></figure></div><h2>What's next</h2><p>Now I need to visit those places and drive around to see what is there to sell, next steps might be getting a 360 camera, putting it on the roof of the car, a l&#225; street view, and taking pictures and looking for "for sale signs". Stay tuned!</p><p></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.jampa.dev/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.jampa.dev/p/wardriving-for-place-to-live?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.jampa.dev/p/wardriving-for-place-to-live?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p>]]></content:encoded></item></channel></rss>