<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Career on kenji.blog</title><link>http://kenji.blog/en/categories/career/</link><description>Recent content in Career on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/en/categories/career/index.xml" rel="self" type="application/rss+xml"/><item><title>A Solo Developer's Survival Strategy to Fight Tech Giants and the World</title><link>http://kenji.blog/en/p/solo-developer-survival-strategy/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/solo-developer-survival-strategy/</guid><description>&lt;img src="http://kenji.blog/p/solo-developer-survival-strategy/img/eyecatch.jpg" alt="Featured image of post A Solo Developer's Survival Strategy to Fight Tech Giants and the World" />&lt;h1 id="introduction-the-battle-of-the-have-nots-challenging-the-giants">Introduction: The Battle of the &amp;ldquo;Have-nots&amp;rdquo; Challenging the Giants
&lt;/h1>&lt;p>In the history of software development, there has never been a time more advantageous for solo developers (indie developers) than now. The democratization of cloud infrastructure like AWS and GCP, the rise of BaaS (Backend as a Service) like Vercel and Supabase, and above all, the automation of coding through the evolution of LLMs (Large Language Models). All of these have created an environment where individuals can compete head-on with the &amp;ldquo;giants,&amp;rdquo; the major tech companies.&lt;/p>
&lt;p>However, just because technical resources have flattened does not mean you can win by adopting the same strategies as major companies. Individuals are overwhelmingly disadvantaged in terms of capital, marketing power, and brand power. For solo developers to survive and win, a unique &amp;ldquo;survival strategy&amp;rdquo; is essential.&lt;/p>
&lt;p>In this article, we will thoroughly explain the technical and strategic approaches for solo developers to launch a Micro-SaaS and expand their business globally, incorporating architecture design, economics, and mathematical models.&lt;/p>
&lt;hr>
&lt;h1 id="1-long-tail-theory-and-the-mathematics-of-niche-markets">1. Long Tail Theory and the Mathematics of Niche Markets
&lt;/h1>&lt;p>Major companies target mass markets with a huge TAM (Total Addressable Market). They need millions of users and billions of yen in revenue to recover their high fixed costs (labor, office space, advertising).&lt;/p>
&lt;p>In contrast, the strength of solo developers lies in having an &lt;strong>&amp;ldquo;extremely low break-even point.&amp;rdquo;&lt;/strong> If you can generate a few hundred thousand yen in profit per month, it is perfectly viable as a business for an individual. This is where the sweet spot of the &amp;ldquo;Long Tail Theory&amp;rdquo; exists.&lt;/p>
&lt;h2 id="zipfs-law-and-market-distribution">Zipf&amp;rsquo;s Law and Market Distribution
&lt;/h2>&lt;p>The relationship between the rank of a market and its size often follows Zipf&amp;rsquo;s Law or the Pareto principle. If we let the rank of the market be $k$ and its market size (revenue potential) be $P(k)$, it can be expressed by the following power-law model:&lt;/p>
$$ P(k) \propto \frac{1}{k^\alpha} $$&lt;p>Here, $\alpha$ is a parameter that determines the shape of the distribution (generally $\alpha \approx 1$).&lt;/p>
&lt;p>Major companies fight bloody red oceans over huge markets (the head) like $k=1, 2, 3$. On the other hand, niche markets (the tail) like $k \ge 100$ are &amp;ldquo;markets that would only incur a deficit to enter&amp;rdquo; for major companies, making them essentially blue oceans with no actual competitors.&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title Market Size Distribution and Solo Dev Target
x-axis [&amp;#34;Mass A&amp;#34;, &amp;#34;Mass B&amp;#34;, &amp;#34;Niche C&amp;#34;, &amp;#34;Niche D&amp;#34;, &amp;#34;Niche E&amp;#34;, &amp;#34;Niche F&amp;#34;, &amp;#34;Niche G&amp;#34;]
y-axis &amp;#34;Market Value&amp;#34; 0 --&amp;gt; 100
bar [95, 60, 20, 10, 5, 3, 2]
line [95, 60, 20, 10, 5, 3, 2]
&lt;/pre>
&lt;p>Solo developers should intentionally target specific niche problems (such as workflow automation tools for a particular industry, or hardcore analytics tools combining specific APIs). The more niche it is, the easier it is to reach target users, and the lower the CAC (Customer Acquisition Cost) becomes.&lt;/p>
&lt;hr>
&lt;h1 id="2-architecture-design-for-overwhelming-agility">2. Architecture Design for Overwhelming Agility
&lt;/h1>&lt;p>Enterprise systems are designed with &amp;ldquo;stability&amp;rdquo; and &amp;ldquo;scalability&amp;rdquo; as top priorities, which is why Kubernetes and microservice architectures are adopted. However, if a solo developer does the same thing, their resources will be depleted just by maintaining the infrastructure (Ops).&lt;/p>
&lt;p>The watchword for a solo developer&amp;rsquo;s tech stack is &lt;strong>&amp;ldquo;No-Ops&amp;rdquo; (Zero Operations)&lt;/strong>. You must leverage serverless architectures to the absolute limit and focus solely on writing business logic.&lt;/p>
&lt;h2 id="enterprise-vs-solo-developer-architecture-comparison">Enterprise vs Solo Developer Architecture Comparison
&lt;/h2>&lt;pre class="mermaid">
flowchart TD
subgraph &amp;#34;Enterprise Tech Stack&amp;#34;
A[&amp;#34;Load Balancer&amp;#34;] --&amp;gt; B[&amp;#34;API Gateway&amp;#34;]
B --&amp;gt; C[&amp;#34;Microservice 1 (Go)&amp;#34;]
B --&amp;gt; D[&amp;#34;Microservice 2 (Java)&amp;#34;]
C --&amp;gt; E[&amp;#34;Kubernetes Cluster&amp;#34;]
D --&amp;gt; E
E --&amp;gt; F[&amp;#34;Distributed SQL (Spanner)&amp;#34;]
E --&amp;gt; G[&amp;#34;Message Queue (Kafka)&amp;#34;]
H[&amp;#34;DevOps / SRE Team&amp;#34;] -.-&amp;gt; E
end
subgraph &amp;#34;Solo Developer Tech Stack&amp;#34;
I[&amp;#34;Vercel Edge Network&amp;#34;] --&amp;gt; J[&amp;#34;Next.js Server Actions&amp;#34;]
J --&amp;gt; K[&amp;#34;Supabase (PostgreSQL)&amp;#34;]
J --&amp;gt; L[&amp;#34;External APIs (Stripe, OpenAI)&amp;#34;]
M[&amp;#34;Solo Dev + AI Copilot&amp;#34;] -.-&amp;gt; I
end
&lt;/pre>
&lt;p>In an enterprise stack, adding new features requires coordination between multiple teams and setting up DevOps deployment pipelines. On the other hand, in an individual&amp;rsquo;s stack (e.g., Next.js + Supabase + Vercel), a single &lt;code>git push&lt;/code> deploys to a global edge network, and there is no need for DB provisioning.&lt;/p>
&lt;h2 id="leveraging-serverless-and-edge-computing">Leveraging Serverless and Edge Computing
&lt;/h2>&lt;p>By using edge runtimes like Vercel or Cloudflare Workers, you can eliminate cold start delays and provide low-latency APIs to users around the world.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// app/api/hello/route.ts (Next.js Edge API Route)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">NextResponse&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;next/server&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">runtime&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;edge&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">GET&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">request&lt;/span>: &lt;span class="kt">Request&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">searchParams&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">URL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">request&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">url&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">searchParams&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="kr">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;name&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="s1">&amp;#39;World&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Edge runtime executes in milliseconds globally
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">NextResponse&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">json&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">message&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="sb">`Hello, &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">!`&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">timestamp&lt;/span>: &lt;span class="kt">Date.now&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="3-extreme-productivity-utilizing-ai-apis">3. &amp;ldquo;Extreme Productivity&amp;rdquo; Utilizing AI APIs
&lt;/h1>&lt;p>Features such as &amp;ldquo;Natural Language Processing,&amp;rdquo; &amp;ldquo;Image Generation,&amp;rdquo; and &amp;ldquo;Recommendation,&amp;rdquo; which used to require teams of machine learning engineers and data scientists, can now be implemented with a single API call.&lt;/p>
&lt;p>By integrating APIs from OpenAI (GPT-4o) or Anthropic (Claude 3.5 Sonnet) into your own Micro-SaaS, even an individual can instantly launch an &amp;ldquo;AI-native&amp;rdquo; product.&lt;/p>
&lt;h2 id="streaming-implementation-using-vercel-ai-sdk">Streaming Implementation Using Vercel AI SDK
&lt;/h2>&lt;p>In AI-powered products, the key to user experience (UX) is the &amp;ldquo;streaming response.&amp;rdquo; With the Vercel AI SDK, you can achieve this with just a few lines of code.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// app/api/chat/route.ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">openai&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@ai-sdk/openai&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">streamText&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;ai&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Set the maximum execution time in a serverless environment
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">maxDuration&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">30&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">POST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">req&lt;/span>: &lt;span class="kt">Request&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">messages&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">json&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">streamText&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">model&lt;/span>: &lt;span class="kt">openai&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;gpt-4o-mini&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">messages&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">system&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;You are an excellent SaaS assistant. Please accurately solve the user&amp;#39;s problems.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">result&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toDataStreamResponse&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>With this kind of implementation, solo developers can provide advanced AI features without worrying about infrastructure complexity. Furthermore, by utilizing AI coding editors like GitHub Copilot and Cursor, the development speed itself has jumped to 5 to 10 times that of traditional methods.&lt;/p>
&lt;hr>
&lt;h1 id="4-the-mathematics-of-communication-overhead">4. The Mathematics of Communication Overhead
&lt;/h1>&lt;p>Why can solo developers release features faster than major enterprises? The biggest reason is that there is &amp;ldquo;zero communication overhead.&amp;rdquo;&lt;/p>
&lt;p>According to Brooks&amp;rsquo;s Law, famously from the software engineering classic &amp;ldquo;The Mythical Man-Month&amp;rdquo;, the number of communication channels $C$ within a project increases relative to the number of developers $n$ as follows:&lt;/p>
$$ C = \frac{n(n - 1)}{2} $$&lt;p>When a team of $n=10$ at an enterprise develops a feature, the number of channels reaches $C = 45$, and a massive amount of time is spent on specification adjustments, meetings, and code reviews.
However, for a solo developer ($n=1$), the number of channels is $C = 0$.&lt;/p>
&lt;p>&lt;strong>Because there are no bottlenecks in the process of translating thoughts into code&lt;/strong>, it is possible to deploy an idea conceived in the morning to the production environment by that evening. This is the greatest weapon of a solo developer, which major enterprises cannot imitate no matter how much money they pile up.&lt;/p>
&lt;hr>
&lt;h1 id="5-global-expansion-and-payment-infrastructure-integration">5. Global Expansion and Payment Infrastructure Integration
&lt;/h1>&lt;p>For a Micro-SaaS competing globally, building a payment gateway is essential. By utilizing Stripe, you can fully automate payments in currencies around the world, subscription management, and even tax processing (Stripe Tax).&lt;/p>
&lt;h2 id="robust-subscription-management-using-stripe-webhooks">Robust Subscription Management Using Stripe Webhooks
&lt;/h2>&lt;p>Let&amp;rsquo;s look at a secure payment status synchronization model combining the Next.js App Router and Stripe Webhooks.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// app/api/webhooks/stripe/route.ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">headers&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;next/headers&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">NextResponse&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;next/server&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">Stripe&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;stripe&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">db&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@/db&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">users&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@/db/schema&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">eq&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;drizzle-orm&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">stripe&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Stripe&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">STRIPE_SECRET_KEY&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">apiVersion&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;2023-10-16&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">POST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">req&lt;/span>: &lt;span class="kt">Request&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">body&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">req&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">text&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">signature&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">headers&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="kr">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Stripe-Signature&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kr">as&lt;/span> &lt;span class="kt">string&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">let&lt;/span> &lt;span class="nx">event&lt;/span>: &lt;span class="kt">Stripe.Event&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">try&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">event&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">stripe&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">webhooks&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">constructEvent&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">body&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">signature&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">STRIPE_WEBHOOK_SECRET&lt;/span>&lt;span class="o">!&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">catch&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">error&lt;/span>: &lt;span class="kt">any&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">NextResponse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sb">`Webhook Error: &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">message&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">status&lt;/span>: &lt;span class="kt">400&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Processing when a subscription is updated
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">event&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="kr">type&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s1">&amp;#39;customer.subscription.updated&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">subscription&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">event&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">data&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="kt">object&lt;/span> &lt;span class="kr">as&lt;/span> &lt;span class="nx">Stripe&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Subscription&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">customerId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">subscription&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">customer&lt;/span> &lt;span class="kr">as&lt;/span> &lt;span class="kt">string&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Update the status in the DB
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">db&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">update&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">users&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="kr">set&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">subscriptionStatus&lt;/span>: &lt;span class="kt">subscription.status&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="nx">where&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">eq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">users&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">stripeCustomerId&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">customerId&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">NextResponse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;OK&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">status&lt;/span>: &lt;span class="kt">200&lt;/span> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>With these few lines of code, you can instantly process credit card payments from users on the other side of the world and automate the provision of your service.&lt;/p>
&lt;hr>
&lt;h1 id="6-avoiding-infrastructure-lock-in-and-ensuring-portability">6. Avoiding Infrastructure Lock-in and Ensuring Portability
&lt;/h1>&lt;p>In a strategy that heavily relies on BaaS and managed services, the risk of &amp;ldquo;vendor lock-in&amp;rdquo; is always a subject of debate. For example, if you rely too deeply on Firebase&amp;rsquo;s Firestore, migrating to an RDB (Relational Database) later becomes extremely difficult.&lt;/p>
&lt;p>The optimal solution as a survival strategy is an approach where &lt;strong>&amp;ldquo;you are locked into the infrastructure, but your data and business logic maintain portability.&amp;rdquo;&lt;/strong>&lt;/p>
&lt;h2 id="abstracting-the-data-layer-with-orm">Abstracting the Data Layer with ORM
&lt;/h2>&lt;p>While utilizing managed services like Supabase (PostgreSQL) or PlanetScale (MySQL) for your database, it is standard practice to insert an abstraction layer like Prisma or Drizzle ORM, rather than writing raw SQL or hitting specific BaaS SDKs directly from your application code.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// db/schema.ts (Drizzle ORM)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">pgTable&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">serial&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">timestamp&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">varchar&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;drizzle-orm/pg-core&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">users&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">pgTable&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;users&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">id&lt;/span>: &lt;span class="kt">serial&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;id&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">primaryKey&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">email&lt;/span>: &lt;span class="kt">varchar&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;email&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">length&lt;/span>: &lt;span class="kt">255&lt;/span> &lt;span class="p">}).&lt;/span>&lt;span class="nx">notNull&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="kt">unique&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">stripeCustomerId&lt;/span>: &lt;span class="kt">varchar&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;stripe_customer_id&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">length&lt;/span>: &lt;span class="kt">255&lt;/span> &lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">subscriptionStatus&lt;/span>: &lt;span class="kt">varchar&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;subscription_status&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">length&lt;/span>: &lt;span class="kt">50&lt;/span> &lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">createdAt&lt;/span>: &lt;span class="kt">timestamp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;created_at&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">defaultNow&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// app/actions/user.ts
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">db&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@/db&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">users&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;@/db/schema&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">eq&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s1">&amp;#39;drizzle-orm&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">getUserByEmail&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">email&lt;/span>: &lt;span class="kt">string&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">db&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">select&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="kr">from&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">users&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">where&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">eq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">users&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">email&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">email&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>By riding on the standard PostgreSQL ecosystem in this way, even if Supabase&amp;rsquo;s pricing were to skyrocket, you could migrate to AWS RDS, Render, or your own self-hosted PostgreSQL server with almost no code rewrites.&lt;/p>
&lt;hr>
&lt;h1 id="7-programmatic-seo-and-ai-generated-content">7. Programmatic SEO and AI-Generated Content
&lt;/h1>&lt;p>For solo developers without a marketing budget, the ultimate weapon is &amp;ldquo;SEO&amp;rdquo; (Search Engine Optimization). In recent years, &amp;ldquo;Programmatic SEO,&amp;rdquo; which dynamically generates thousands to tens of thousands of landing pages by combining proprietary databases with LLMs, has been gaining attention.&lt;/p>
&lt;p>Traffic distribution also follows a power law. Instead of targeting specific high-volume keywords, you can raise your overall traffic by covering a massive amount of &amp;ldquo;long-tail keywords&amp;rdquo; that have low search volume but high conversion rates.&lt;/p>
$$ Traffic_{Total} = \int_{x_{min}}^{x_{max}} T(x) dx $$&lt;p>Even if the traffic $T(x)$ for a niche keyword $x$ is small, integrating them generates massive overall traffic. By using Next.js&amp;rsquo;s dynamic routing and SSG/ISR, you can deliver these pages rapidly.&lt;/p>
&lt;hr>
&lt;h1 id="8-unit-economics-and-the-profit-formula">8. Unit Economics and the Profit Formula
&lt;/h1>&lt;p>Finally, let&amp;rsquo;s look at the mathematical model required to make a Micro-SaaS viable as a business. The basic equation for a SaaS business is as follows:&lt;/p>
$$ Profit = \sum_{i=1}^{U} (LTV_i - CAC_i) - Fixed Costs $$&lt;ul>
&lt;li>&lt;strong>$U$&lt;/strong>: Number of acquired users&lt;/li>
&lt;li>&lt;strong>$LTV$ (Life Time Value)&lt;/strong>: $LTV = \frac{ARPU}{Churn Rate}$ (ARPU is Average Revenue Per User, Churn Rate is the cancellation rate)&lt;/li>
&lt;li>&lt;strong>$CAC$ (Customer Acquisition Cost)&lt;/strong>&lt;/li>
&lt;li>&lt;strong>$Fixed Costs$&lt;/strong>: Fixed costs (server costs, tool costs, etc.)&lt;/li>
&lt;/ul>
&lt;p>For solo developers, the advantage is that &lt;strong>$Fixed Costs$ are nearly zero&lt;/strong>. Even combining Vercel&amp;rsquo;s Pro plan ($20/month), Supabase's Pro plan ($25/month), and other AI API usage fees, it stays around 10,000 to tens of thousands of yen per month. The biggest benefit is being able to exclude your own labor costs from fixed costs (or recovering them from profits).&lt;/p>
&lt;h3 id="zero-marginal-cost-business">Zero Marginal Cost Business
&lt;/h3>&lt;p>For software, especially SaaS, the marginal cost of adding one more user is almost zero. If you can minimize $CAC$ by automating user acquisition (SEO, social media broadcasting, viral loops, etc.), the vast majority of your revenue becomes gross profit outright.&lt;/p>
&lt;p>If you build a niche B2B tool for $15/month with a Churn Rate of 5%:
$$ LTV = \frac{\$15}{0.05} = $300 $$&lt;/p>
&lt;p>If you can keep CAC down to $10 using SEO and content marketing, you generate $290 in profit (gross margin) per user acquired. By delivering this to users around the world with niche problems—say, just 1,000 users—you complete a Micro-SaaS that generates $15,000 (over 2 million yen) in recurring monthly revenue.&lt;/p>
&lt;hr>
&lt;h1 id="conclusion-speed-and-niche-specialization-are-the-ultimate-shield-and-spear">Conclusion: Speed and Niche Specialization Are the Ultimate Shield and Spear
&lt;/h1>&lt;p>The survival strategy for solo developers to fight against tech giants and global rivals boils down to the following three points:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Choose Where to Fight (Long Tail Theory)&lt;/strong>
&lt;ul>
&lt;li>Target niche markets with deep pain points, even if they are small, where large enterprises cannot enter.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Leverage Technological Leverage (Serverless, BaaS, AI)&lt;/strong>
&lt;ul>
&lt;li>Completely externalize operations (Ops) and write only the code (business logic) that solves customer problems, not infrastructure.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Maximize Agility (Zero Communication Cost)&lt;/strong>
&lt;ul>
&lt;li>Capitalize on the solo developer&amp;rsquo;s greatest weapon, &amp;ldquo;speed,&amp;rdquo; by deploying ideas immediately and iterating on market feedback as fast as possible.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>We are living in an era with the highest leverage in history. With just a keyboard, the internet, and a passion for solving problems, you can create products that delight users worldwide and compete with giant corporations, all from your own small room.&lt;/p>
&lt;p>Now, let&amp;rsquo;s open the editor and initialize a new project.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npx create-next-app@latest my-micro-saas
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>The battle has already begun.&lt;/p></description></item><item><title>Remote Work and Return to Office: What is the Optimal Solution for Engineers?</title><link>http://kenji.blog/en/p/remote-vs-rto-engineers/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/remote-vs-rto-engineers/</guid><description>&lt;img src="http://kenji.blog/p/remote-vs-rto-engineers/img/eyecatch.jpg" alt="Featured image of post Remote Work and Return to Office: What is the Optimal Solution for Engineers?" />&lt;h1 id="introduction-the-post-pandemic-paradigm-shift-and-the-wave-of-rto">Introduction: The Post-Pandemic Paradigm Shift and the Wave of RTO
&lt;/h1>&lt;p>The global pandemic of the early 2020s fundamentally overturned the definition of a &amp;ldquo;workplace&amp;rdquo; in the software engineering industry. Overnight, offices were locked down, and almost all companies—from Silicon Valley tech giants to Japanese startups—were forced into a mandatory transition to full remote work. This historic social experiment shattered the long-held stereotype among management that &amp;ldquo;advanced software development is impossible without gathering in an office,&amp;rdquo; and proved that geographically distributed teams can build and operate massive systems by leveraging tools like GitHub, Slack, Zoom, and Notion.&lt;/p>
&lt;p>However, as the pandemic subsides, the industry landscape is transforming once again. Tech giants like Amazon, Google, and Meta have begun strongly pushing for a &amp;ldquo;hybrid model&amp;rdquo; that mandates several days of office attendance a week, or even a full &amp;ldquo;Return to Office (RTO).&amp;rdquo; This top-down RTO directive from management is creating severe friction with many engineers (Individual Contributors: ICs). While engineers argue that &amp;ldquo;a quiet home environment allows for better focus on code&amp;rdquo; and &amp;ldquo;commuting time is a waste of life,&amp;rdquo; management counters that &amp;ldquo;innovation is born from serendipitous encounters&amp;rdquo; and &amp;ldquo;face-to-face communication is essential for fostering organizational culture.&amp;rdquo;&lt;/p>
&lt;p>In this article, we will not dismiss this binary debate of &amp;ldquo;Remote Work vs. Return to Office&amp;rdquo; as mere emotional arguments or matters of personal preference. Instead, we will thoroughly dissect it through the objective and technical lenses of organizational sociology, quantitative evaluation of engineering productivity (DORA metrics, SPACE framework), and underlying network architecture (VPN and Zero Trust). Let&amp;rsquo;s explore the &amp;ldquo;true optimal solution&amp;rdquo; that modern engineering organizations should aim for regarding this complex issue at the intersection of technology and human society.&lt;/p>
&lt;hr>
&lt;h1 id="unraveling-the-dynamics-of-communication-through-organizational-sociology">Unraveling the Dynamics of Communication through Organizational Sociology
&lt;/h1>&lt;p>Software development is both a highly intellectual task and an extremely social activity. In the process of dozens or hundreds of engineers collaborating to build a massive system, the quality and quantity of communication become the most significant factors determining the success or failure of a project. Here, we analyze the impact of remote work on communication using classical theories of organizational sociology.&lt;/p>
&lt;h2 id="the-allen-curve-and-the-curse-of-physical-distance">The Allen Curve and the Curse of Physical Distance
&lt;/h2>&lt;p>In the late 1970s, Professor Thomas J. Allen of the Massachusetts Institute of Technology (MIT) investigated the relationship between the frequency of communication among engineers in R&amp;amp;D organizations and their physical distance within the office. The resulting finding is the famous &amp;ldquo;Allen Curve.&amp;rdquo;&lt;/p>
&lt;p>According to Allen&amp;rsquo;s research, the probability of communication occurring between engineers decays exponentially as physical distance increases. This relationship can be approximately expressed by the following mathematical model:&lt;/p>
$$ P(d) \approx \alpha e^{-\beta d} $$&lt;p>Here, $P(d)$ is the probability of communication occurring, $d$ is the physical distance between two engineers, and $\alpha$ and $\beta$ are constants that depend on the organization&amp;rsquo;s culture and environment.&lt;/p>
&lt;p>The most shocking fact revealed by the Allen Curve is that &amp;ldquo;when the distance exceeds 30 meters, the probability of daily communication rapidly approaches zero.&amp;rdquo; Information exchange happens overwhelmingly more with a colleague at the next desk than with a colleague on a different floor of the same building.&lt;/p>
&lt;pre class="mermaid">
graph LR
D0[&amp;#34;Distance: 0m (Next desk)&amp;#34;] --&amp;gt; P0[&amp;#34;Face-to-face communication probability: Extremely high&amp;#34;]
D10[&amp;#34;Distance: 10m (Same cluster)&amp;#34;] --&amp;gt; P10[&amp;#34;Face-to-face communication probability: High&amp;#34;]
D30[&amp;#34;Distance: 30m (Different floor)&amp;#34;] --&amp;gt; P30[&amp;#34;Face-to-face communication probability: Low (few %)&amp;#34;]
DRemote[&amp;#34;Full remote (Different city)&amp;#34;] --&amp;gt; PRemote[&amp;#34;Serendipitous synchronous communication probability: Almost zero&amp;#34;]
D0 -. &amp;#34;Rapid decay of the Allen Curve&amp;#34; .-&amp;gt; D10
D10 -. &amp;#34;Loss of physical proximity&amp;#34; .-&amp;gt; D30
D30 -. &amp;#34;Shift to completely asynchronous/intentional communication&amp;#34; .-&amp;gt; DRemote
&lt;/pre>
&lt;p>In a full remote work environment, this physical distance $d$ becomes effectively infinite. In other words, even with the existence of Slack or Zoom, serendipitous communication (like &amp;ldquo;water cooler talk&amp;rdquo;) structurally ceases to occur. One of the strongest rationales for management to push for RTO is to reclaim this &amp;ldquo;sharing of tacit knowledge and creation of innovation brought about by physical proximity,&amp;rdquo; backed by the Allen Curve.&lt;/p>
&lt;h2 id="conways-law-and-its-impact-on-architecture">Conway&amp;rsquo;s Law and Its Impact on Architecture
&lt;/h2>&lt;p>Another indispensable theory when considering remote work is &amp;ldquo;Conway&amp;rsquo;s Law,&amp;rdquo; proposed by Melvin Conway in 1968.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Full remote work fundamentally changes an organization&amp;rsquo;s communication structure. Dense face-to-face collaboration decreases, and asynchronous, formal communication via Slack channels and Jira tickets takes precedence. As a result, boundaries between teams (silos) become stronger.&lt;/p>
&lt;pre class="mermaid">
graph LR
subgraph &amp;#34;Organization Communication Structure (Under Remote Environment)&amp;#34;
FE[&amp;#34;Front-end Team (Siloed)&amp;#34;]
BE[&amp;#34;Back-end Team (Siloed)&amp;#34;]
DB[&amp;#34;Database Team (Siloed)&amp;#34;]
FE -. &amp;#34;Asynchronous integration via API docs (Swagger)&amp;#34; .- BE
BE -. &amp;#34;Schema change requests via Jira tickets&amp;#34; .- DB
end
subgraph &amp;#34;System Architecture&amp;#34;
SPA[&amp;#34;SPA (React)&amp;#34;]
API[&amp;#34;API Gateway / Microservices&amp;#34;]
Data[&amp;#34;Database (PostgreSQL)&amp;#34;]
SPA --&amp;gt; API
API --&amp;gt; Data
end
FE === SPA
BE === API
DB === Data
&lt;/pre>
&lt;p>This siloing is not necessarily a bad thing. When adopting a microservices architecture with clear API interfaces and independent deployability, intentionally restricting communication between teams to increase their independence is sometimes even recommended as an &amp;ldquo;Inverse Conway Maneuver.&amp;rdquo; Full remote work can be said to be suitable for developing loosely coupled systems with clear boundaries.&lt;/p>
&lt;p>However, during the initial launch phase of a system (zero-to-one development), large-scale refactoring spanning multiple components, or troubleshooting unknown incidents, dense and high-bandwidth communication across team boundaries is essential. Excessive siloing in a remote environment makes solving such monolithic challenges extremely difficult.&lt;/p>
&lt;hr>
&lt;h1 id="redefining-engineering-productivity-quantification-via-dora-and-space">Redefining Engineering Productivity: Quantification via DORA and SPACE
&lt;/h1>&lt;p>Which has higher &amp;ldquo;productivity,&amp;rdquo; remote work or office attendance? The reason this debate often ends in a stalemate is because the definition of the word &amp;ldquo;productivity&amp;rdquo; is ambiguous. The era of measuring productivity by lines of code (LOC) or the number of pull requests is over. In modern engineering organizations, productivity is evaluated from multiple angles using DORA metrics and the SPACE framework.&lt;/p>
&lt;h2 id="the-impact-of-remote-work-through-the-lens-of-dora-metrics">The Impact of Remote Work through the Lens of DORA Metrics
&lt;/h2>&lt;p>The four key metrics defined by the DevOps Research and Assessment (DORA) team have become the industry standard for measuring software delivery speed and stability.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Deployment Frequency&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Lead Time for Changes&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Change Failure Rate&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Mean Time To Recovery (MTTR)&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>According to much empirical data, in a full remote environment, teams centered around senior engineers tend to see improvements in &amp;ldquo;Deployment Frequency&amp;rdquo; and &amp;ldquo;Lead Time for Changes.&amp;rdquo; This is because office-specific interruptions (a tap on the shoulder, being pulled into a sudden meeting) disappear, making it easier to enter a state of &amp;ldquo;deep work&amp;rdquo; (deep concentration).&lt;/p>
&lt;p>On the other hand, there is concern about the negative impact on &amp;ldquo;Mean Time To Recovery (MTTR).&amp;rdquo; When a complex system failure occurs, incident response requires simultaneous investigation and swift decision-making by multiple domain experts. MTTR can be expressed by the following equation:&lt;/p>
$$ MTTR = \frac{1}{N} \sum_{i=1}^{N} (t_{restore, i} - t_{incident, i}) $$&lt;p>In an office, key members can be gathered in a &amp;ldquo;war room,&amp;rdquo; rapidly cycling through hypothesis testing while surrounding a whiteboard. However, in a full remote environment, overhead occurs: issuing a Zoom link, gathering the appropriate members on Slack, and proceeding while checking logs via screen sharing. In this &amp;ldquo;synchronous emergency response,&amp;rdquo; physical proximity remains a powerful weapon.&lt;/p>
&lt;h2 id="the-space-framework-a-multifaceted-evaluation-of-developer-experience">The SPACE Framework: A Multifaceted Evaluation of Developer Experience
&lt;/h2>&lt;p>While DORA focuses on system output, the SPACE framework, proposed by researchers at GitHub and Microsoft, captures the Developer Experience (DX) more comprehensively.&lt;/p>
&lt;pre class="mermaid">
mindmap
root((&amp;#34;SPACE Framework&amp;#34;))
S((&amp;#34;Satisfaction &amp;amp; Well-being&amp;#34;))
S1[&amp;#34;Elimination of commute stress (Remote advantage)&amp;#34;]
S2[&amp;#34;Isolation &amp;amp; burnout (Office advantage)&amp;#34;]
P((&amp;#34;Performance&amp;#34;))
P1[&amp;#34;Value delivery to customers&amp;#34;]
P2[&amp;#34;Code quality&amp;#34;]
A((&amp;#34;Activity&amp;#34;))
A1[&amp;#34;Number of PRs created&amp;#34;]
A2[&amp;#34;Deployment frequency&amp;#34;]
C((&amp;#34;Communication &amp;amp; Collaboration&amp;#34;))
C1[&amp;#34;Review speed&amp;#34;]
C2[&amp;#34;Sharing of tacit knowledge (Office advantage)&amp;#34;]
E((&amp;#34;Efficiency &amp;amp; Flow&amp;#34;))
E1[&amp;#34;Fewer context switches (Remote advantage)&amp;#34;]
E2[&amp;#34;Elimination of interruptions (Remote advantage)&amp;#34;]
&lt;/pre>
&lt;p>Using the SPACE framework, the light and shadow of remote work become clear. While a remote environment maximizes an engineer&amp;rsquo;s &amp;ldquo;Efficiency &amp;amp; Flow,&amp;rdquo; it carries the risk of hindering &amp;ldquo;Communication &amp;amp; Collaboration.&amp;rdquo; Furthermore, regarding &amp;ldquo;Satisfaction,&amp;rdquo; while there is the positive aspect of eliminating the commute, there is also the negative aspect of deteriorating mental health due to social isolation.&lt;/p>
&lt;hr>
&lt;h1 id="the-cost-and-cognitive-load-of-asynchronous-communication">The Cost and Cognitive Load of Asynchronous Communication
&lt;/h1>&lt;p>The key to successful full remote work lies in the transition from &amp;ldquo;synchronous communication&amp;rdquo; (meetings, hallway chats) to &amp;ldquo;asynchronous communication&amp;rdquo; (documents, tickets, chats). Fully remote pioneering companies like GitLab and Automattic achieve this through a thorough documentation culture. However, over-reliance on asynchronous communication creates another kind of &amp;ldquo;cost.&amp;rdquo;&lt;/p>
&lt;h2 id="the-context-switching-trap-brought-by-slack-and-jira">The Context-Switching Trap Brought by Slack and Jira
&lt;/h2>&lt;p>A problem that would be solved with a few seconds of chatting in the office transforms into a long Slack thread or a rally on Jira when working remotely. The number of communication paths within a team, where the number of members is $n$, is the number of edges in a complete graph expressed by the following formula:&lt;/p>
$$ C = \frac{n(n-1)}{2} $$&lt;p>As an organization grows, the volume of asynchronous messages flying across these communication paths increases explosively. Engineers find themselves continuously processing incoming notifications (with $S_i$ as the switch cost and $R_i$ as the response cost) alongside tasks requiring deep concentration like coding ($E_{task}$). The total cognitive load ($E_{total}$) swells as follows:&lt;/p>
$$ E_{total} = E_{task} + \sum_{i=1}^{k} (S_i + R_i) $$&lt;p>Asynchronous communication saves the sender&amp;rsquo;s time (they can send it anytime), but in return, it forces the receiver to bear the load of deciphering and reconstructing the context. It is extremely difficult to accurately convey complex system specifications or design intentions using only text, which often results in misunderstandings and rework.&lt;/p>
&lt;h2 id="the-synchronous-value-of-whiteboard-sessions">The Synchronous Value of Whiteboard Sessions
&lt;/h2>&lt;p>In initial architecture design or discussions of complex algorithms, the synchronous activity of &amp;ldquo;gathering around a whiteboard&amp;rdquo; possesses unparalleled information bandwidth. While online collaboration tools like Miro and Figma have evolved dramatically, they have not yet completely replaced physical interactions accompanied by human gestures, eye movements, and the act of &amp;ldquo;drawing and explaining right there.&amp;rdquo; It must be said that the physical office still holds high value in the process of synchronously sharing and constructing high-dimensional abstract concepts.&lt;/p>
&lt;hr>
&lt;h1 id="the-technological-foundation-supporting-remote-work-from-the-limits-of-vpn-to-zero-trust">The Technological Foundation Supporting Remote Work: From the Limits of VPN to Zero Trust
&lt;/h1>&lt;p>So far, we have discussed this from the perspectives of sociology and productivity, but another crucial factor determining the remote work experience is &amp;ldquo;network architecture.&amp;rdquo; An engineer&amp;rsquo;s productivity is directly linked to the access latency of the development environment and production servers.&lt;/p>
&lt;h2 id="traditional-vpn-architecture-and-the-mathematics-of-latency">Traditional VPN Architecture and the Mathematics of Latency
&lt;/h2>&lt;p>Early in the pandemic, many companies hastily scaled up their traditional VPN (Virtual Private Network) gateways to provide remote access to their existing on-premises environments. However, this perimeter-based defense architecture becomes a fatal bottleneck in the era of remote work.&lt;/p>
&lt;p>The total network latency $T_{total}$ is expressed as the sum of propagation delay (dependent on physical distance), transmission delay (dependent on bandwidth), and processing delay at routers and gateways.&lt;/p>
$$ T_{total} = \frac{D}{c} + \frac{L}{B} + T_{proc} $$&lt;p>When using a traditional VPN, even when a remote engineer accesses cloud-based SaaS (like GitHub or the AWS console), an inefficient routing called &amp;ldquo;Hairpinning (Hairpin NAT)&amp;rdquo; occurs, where all traffic is pulled into the corporate network&amp;rsquo;s VPN gateway before exiting to the internet. This unnecessarily increases the distance $D$ and causes the encryption/decryption processing delay $T_{proc}$ of the VPN appliance to skyrocket. This significantly degrades the response of an engineer&amp;rsquo;s typing, destroying their state of flow.&lt;/p>
&lt;h2 id="the-paradigm-shift-brought-by-zero-trust-beyondcorp">The Paradigm Shift Brought by Zero Trust (BeyondCorp)
&lt;/h2>&lt;p>Breaking through these network limitations and realizing a true &amp;ldquo;environment where you can work comfortably and securely from anywhere&amp;rdquo; is the &lt;strong>Zero Trust Network Architecture (ZTNA)&lt;/strong>, pioneered by Google&amp;rsquo;s &amp;ldquo;BeyondCorp.&amp;rdquo;&lt;/p>
&lt;p>The core of Zero Trust is &amp;ldquo;not using the network perimeter (whether internal or external) as the basis of trust.&amp;rdquo;&lt;/p>
&lt;pre class="mermaid">
graph TD
subgraph &amp;#34;Perimeter Defense Model (Traditional VPN)&amp;#34;
U1[&amp;#34;Remote Engineer&amp;#34;] -- IPsec / SSL VPN --&amp;gt; VPN[&amp;#34;VPN Gateway (Single Point of Failure / Bottleneck)&amp;#34;]
VPN -- Internal LAN (Implicit Trust) --&amp;gt; App1[&amp;#34;Internal Source Code Management&amp;#34;]
end
subgraph &amp;#34;Zero Trust Model (BeyondCorp / ZTNA)&amp;#34;
U2[&amp;#34;Remote Engineer (MDM Managed Device)&amp;#34;] -- Direct Communication (mTLS HTTPS) --&amp;gt; IAP[&amp;#34;Identity-Aware Proxy (IAP)&amp;#34;]
IAP -- Dynamic Authorization per Request --&amp;gt; App2[&amp;#34;Internal / SaaS Applications&amp;#34;]
IDP[&amp;#34;Identity Provider (Okta / Entra ID)&amp;#34;] -. &amp;#34;MFA / User Context&amp;#34; .-&amp;gt; Policy
MDM[&amp;#34;Device Management (Intune / Jamf)&amp;#34;] -. &amp;#34;Device Health (Patch Status)&amp;#34; .-&amp;gt; Policy
Policy[&amp;#34;Access Policy Engine&amp;#34;] -. &amp;#34;Risk-based Authorization Decision&amp;#34; .-&amp;gt; IAP
end
&lt;/pre>
&lt;p>In a Zero Trust architecture, there are no centralized chokepoints like VPNs. Whether from a home Wi-Fi network or a public cafe LAN, engineers access each resource directly through the shortest path via an Identity-Aware Proxy (IAP), based on strong contexts of device authentication (such as client certificates) and user authentication (MFA).&lt;/p>
&lt;p>As a result, the unnecessary distance $D$ and excessive processing delay $T_{proc}$ in the aforementioned latency equation are eliminated, enabling terminal operations and massive data transfers with extremely low latency, entirely comparable to being in the office. The state where &amp;ldquo;productivity does not drop even when remote&amp;rdquo; is not just a matter of mentality, but is realized only with the construction of such an advanced Zero Trust foundation.&lt;/p>
&lt;hr>
&lt;h1 id="onboarding-junior-engineers-and-the-transfer-of-tacit-knowledge">Onboarding Junior Engineers and the Transfer of Tacit Knowledge
&lt;/h1>&lt;p>Some point out that the biggest victims of full remote work are not senior engineers, but junior engineers who have just started their careers.&lt;/p>
&lt;p>Senior engineers already have a strong internal network, have accumulated domain knowledge, and possess the ability to execute tasks autonomously. For them, remote work can be the &amp;ldquo;ultimate environment for concentration.&amp;rdquo; However, junior engineers need to absorb undocumented &amp;ldquo;Tacit Knowledge,&amp;rdquo; not just &amp;ldquo;how to write code,&amp;rdquo; but also &amp;ldquo;who to ask questions,&amp;rdquo; &amp;ldquo;what the unwritten rules of the organization are,&amp;rdquo; and &amp;ldquo;the sense of urgency and troubleshooting intuition during incident response.&amp;rdquo;&lt;/p>
&lt;p>In an office environment, junior engineers absorb tacit knowledge like a sponge by glancing at a senior engineer&amp;rsquo;s screen from the side, listening to the sound of them typing, or catching snippets of hallway conversations with other teams. In a remote environment, this process of &amp;ldquo;learning by watching&amp;rdquo; is completely cut off. Unless time for pair programming or mob programming is intentionally scheduled, junior engineers risk being crushed by isolated debugging tasks, significantly flattening their growth curve.&lt;/p>
&lt;hr>
&lt;h1 id="in-search-of-the-optimal-solution-intentional-hybrid-or-full-remote">In Search of the Optimal Solution: Intentional Hybrid or Full Remote?
&lt;/h1>&lt;p>Based on the analysis so far, we can see that both &amp;ldquo;full office attendance&amp;rdquo; and &amp;ldquo;full remote&amp;rdquo; have decisive trade-offs.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Advantages of Full Remote&lt;/strong>: Promotion of deep work, elimination of commuting, access to a global talent pool, and secure, high-speed access via a Zero Trust foundation.&lt;/li>
&lt;li>&lt;strong>Advantages of Office Attendance&lt;/strong>: Occurrence of high-bandwidth communication based on the Allen Curve, synchronous discussions for complex architecture design, reduction of MTTR, and the onboarding of junior engineers and transfer of tacit knowledge.&lt;/li>
&lt;/ol>
&lt;p>The &amp;ldquo;hybrid model&amp;rdquo; adopted by many modern tech companies is not merely a product of compromise, but a rational strategy attempting to reap the benefits of both. However, to make the hybrid model successful, &amp;ldquo;intentional operation&amp;rdquo; is indispensable.&lt;/p>
&lt;p>For example, suppose a rule is set that &amp;ldquo;Tuesdays and Thursdays are office days (Anchor Days).&amp;rdquo; On these days, engineers should be prohibited from &amp;ldquo;putting on earphones and silently coding at their desks.&amp;rdquo; Office days should be defined as days completely dedicated to &amp;ldquo;synchronous collaboration,&amp;rdquo; such as design discussions using whiteboards, mob programming, lunches with other teams, and 1-on-1s. Then, the remaining remote work days should be protected as &amp;ldquo;no-meeting days,&amp;rdquo; purely for deep work facing the code.&lt;/p>
$$ T_{productivity} = f(C_{sync\_collab}, E_{deep\_work}, ZTNA_{performance}) $$&lt;p>An engineer&amp;rsquo;s comprehensive productivity is expressed as a complex function of the quality of synchronous collaboration, the quantity of deep work, and the comfortable access performance provided by a Zero Trust foundation. Intentionally designing, separating, and optimizing these is the true nature of a hybrid model.&lt;/p>
&lt;h1 id="conclusion-towards-a-compromise-between-engineers-and-management">Conclusion: Towards a Compromise Between Engineers and Management
&lt;/h1>&lt;p>The &amp;ldquo;Remote Work vs. Return to Office&amp;rdquo; debate is often framed as a conflict between &amp;ldquo;workers&amp;rsquo; rights vs. management&amp;rsquo;s desire to control,&amp;rdquo; but the essence does not lie there.&lt;/p>
&lt;p>Management must discard the illusion that &amp;ldquo;merely gathering people in an office will magically spawn innovation.&amp;rdquo; Forcing attendance without investing in modern infrastructure like Zero Trust or designing an organization to align with Conway&amp;rsquo;s Law in distributed system development will only lower engineer engagement and productivity.&lt;/p>
&lt;p>On the other hand, engineers (especially senior levels) must also amend the self-righteous perspective that &amp;ldquo;an office is unnecessary because I am more productive writing code alone.&amp;rdquo; Engineering is a team sport, and engineers bear broad responsibilities beyond just coding productivity, including overall system design, mentoring junior members, and coordinating during emergencies. It is a fact that high-bandwidth communication in physical spaces can sometimes save an entire project.&lt;/p>
&lt;p>The optimal solution varies depending on the phase of the company, team, and product. However, what is certain is that only organizations that understand the sociological nature of communication, measure their current state with multifaceted metrics like the SPACE framework, and continually break through constraints with technologies like Zero Trust architecture will gain true competitive advantage in this new era of work.&lt;/p></description></item><item><title>The '2026 Problem': Is the IT Talent Shortage Really Happening? The Reality on the Ground</title><link>http://kenji.blog/en/p/it-talent-shortage-2026/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/it-talent-shortage-2026/</guid><description>&lt;img src="http://kenji.blog/p/it-talent-shortage-2026/img/eyecatch.jpg" alt="Featured image of post The '2026 Problem': Is the IT Talent Shortage Really Happening? The Reality on the Ground" />&lt;h2 id="introduction-the-trap-of-the-term-it-talent-shortage">Introduction: The Trap of the Term &amp;ldquo;IT Talent Shortage&amp;rdquo;
&lt;/h2>&lt;p>For a long time, sensational terms like the &amp;ldquo;2025 Cliff&amp;rdquo; and &amp;ldquo;a maximum shortage of 790,000 IT personnel by 2030&amp;rdquo; have been flying around the media in the Japanese IT industry. However, what we are currently facing is an entirely new phase of crisis that should be called the &lt;strong>&amp;ldquo;2026 Problem&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;p>Reports from the Ministry of Economy, Trade and Industry and various media coverage lump things together by saying, &amp;ldquo;there is an overwhelming shortage of IT engineers.&amp;rdquo; However, when you listen to the real voices on the ground, the situation is a bit more complex. In reality, it&amp;rsquo;s not that &amp;ldquo;everyone is in short supply.&amp;rdquo; &lt;strong>While there is a catastrophic shortage of &amp;ldquo;highly skilled senior engineers that companies desperately want,&amp;rdquo; there is an oversupply of &amp;ldquo;inexperienced or junior engineers,&amp;rdquo; making it increasingly difficult for them to find jobs.&lt;/strong> This is an intense &amp;ldquo;polarization&amp;rdquo; that is taking place.&lt;/p>
&lt;p>This article will deeply explore and explain exactly what is happening in the IT industry right now, covering the paradigm shift from the traditional SIer model to cloud-native and AI-driven development, the cliff of legacy systems, and the disruptive impact brought about by generative AI, represented by GitHub Copilot.&lt;/p>
&lt;hr>
&lt;h2 id="1-structural-change-the-transition-from-traditional-sier-to-cloud-native-and-ai-driven-development">1. Structural Change: The Transition from Traditional SIer to Cloud-Native and AI-Driven Development
&lt;/h2>&lt;p>For many years, the Japanese IT industry was supported by the SIer (System Integrator) model, accompanied by a multi-tiered subcontracting structure. It was a so-called &amp;ldquo;labor-intensive&amp;rdquo; business model, where code was written exactly according to specifications, and test specification sheets were filled out. Here, the value of an engineer was measured in units of &amp;ldquo;person-months,&amp;rdquo; and there was an underlying assumption that projects would run as long as the headcount was met.&lt;/p>
&lt;p>However, as of 2026, this model has reached its limit. Because the essence of DX (Digital Transformation) has shifted from &amp;ldquo;mere IT implementation&amp;rdquo; to &amp;ldquo;business model transformation,&amp;rdquo; low-agility waterfall development can no longer keep up with market changes.&lt;/p>
&lt;p>Modern development processes are built on the premise of being &lt;strong>cloud-native&lt;/strong> and &lt;strong>AI-driven&lt;/strong>. Containerization (Docker/Kubernetes), microservices architecture, and CI/CD pipeline automation are no longer &amp;ldquo;special technologies&amp;rdquo; but &amp;ldquo;standard infrastructure.&amp;rdquo;&lt;/p>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Legacy SIer Development Model&amp;#34;] --&amp;gt;|Paradigm Shift| B[&amp;#34;Transition Period (Agile Adoption, Lift &amp;amp; Shift)&amp;#34;]
B --&amp;gt; C[&amp;#34;Cloud-Native (Microservices/Containers)&amp;#34;]
C --&amp;gt; D[&amp;#34;AI/Data-Driven Architecture (MLOps)&amp;#34;]
D --&amp;gt; E[&amp;#34;Generative AI Integration Platform (Autonomous AI Agents)&amp;#34;]
style A fill:#f9d0c4,stroke:#333,stroke-width:2px
style E fill:#d4edda,stroke:#333,stroke-width:4px
&lt;/pre>
&lt;p>What companies demand are not just &amp;ldquo;coders&amp;rdquo; who merely write code based on provided specifications. They need talent who can look ahead—from cloud infrastructure design to backend implementation, and even the real-world operationalization of machine learning models (MLOps)—and translate business requirements into technical architectures. In an area that demands such broad knowledge and experience, personnel who &amp;ldquo;simply know the syntax of a programming language&amp;rdquo; are finding it difficult to generate value.&lt;/p>
&lt;hr>
&lt;h2 id="2-the-cliff-of-legacy-systems-and-the-depletion-of-data-engineering">2. The &amp;ldquo;Cliff&amp;rdquo; of Legacy Systems and the Depletion of Data Engineering
&lt;/h2>&lt;p>As warned by the &amp;ldquo;2025 Cliff,&amp;rdquo; many Japanese companies still cling to mainframes and on-premises legacy systems (built with COBOL, etc.). These systems have become black boxes due to years of modifications, and maintaining them has become extremely difficult as the senior generation in charge of maintenance reaches retirement age.&lt;/p>
&lt;p>On the other hand, there is a strong demand from the business side to &amp;ldquo;utilize data to build AI models and provide personalized customer experiences.&amp;rdquo; A fatal gap exists here. &lt;strong>There is an overwhelming shortage of &amp;ldquo;data engineers&amp;rdquo; who can cleanse, integrate, and pipeline siloed on-premises data into formats usable by the latest AI/ML pipelines.&lt;/strong>&lt;/p>
&lt;h3 id="a-mathematical-model-of-legacy-maintenance-costs-and-modernization">A Mathematical Model of Legacy Maintenance Costs and Modernization
&lt;/h3>&lt;p>Here, let&amp;rsquo;s consider a simple mathematical model that compares the cost of maintaining a legacy system ($C_{legacy}$) with the investment required for modernization (renewal) and the subsequent operational costs ($C_{modern}$).&lt;/p>
&lt;p>The maintenance cost of legacy systems increases year by year. This is due to incident response caused by technical debt and the soaring personnel costs resulting from the scarcity of legacy technicians.
Letting $t$ be the number of years, this can be expressed as follows:&lt;/p>
$$
C_{legacy}(t) = M_0 \times (1 + r)^t + L_0 \times (1 + i)^t
$$&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>$M_0$: Initial maintenance cost&lt;/li>
&lt;li>$r$: Rate of increase in maintenance costs due to technical debt&lt;/li>
&lt;li>$L_0$: Initial legacy personnel cost&lt;/li>
&lt;li>$i$: Personnel cost inflation rate due to the scarcity of legacy talent&lt;/li>
&lt;/ul>
&lt;p>On the other hand, when modernizing, the initial investment $I$ is significant, but the operational cost $O_m$ is kept low through cloud migration and automation, and it tends to remain constant.&lt;/p>
$$
C_{modern}(t) = I + O_m \times t
$$&lt;p>In many cases, it is obvious that $C_{legacy}(t) > C_{modern}(t)$ will occur within a few years (the break-even point). However, the reality of 2026 is that many companies are sinking into the quagmire of $C_{legacy}$ because the &amp;ldquo;architects&amp;rdquo; and &amp;ldquo;data engineers&amp;rdquo; capable of executing the initial investment $I$ simply do not exist in the market.&lt;/p>
&lt;pre class="mermaid">
pie title Breakdown of the Most Lacking IT Skills as of 2026
&amp;#34;AI/ML Ops Specialists&amp;#34; : 35
&amp;#34;Cloud Architects&amp;#34; : 25
&amp;#34;Data Engineers&amp;#34; : 20
&amp;#34;Legacy Migration (COBOL, etc.)&amp;#34; : 15
&amp;#34;Others&amp;#34; : 5
&lt;/pre>
&lt;hr>
&lt;h2 id="3-the-disruptive-impact-of-generative-ai-github-copilot-and-the-disappearance-of-junior-engineers">3. The Disruptive Impact of Generative AI: GitHub Copilot and the Disappearance of Junior Engineers
&lt;/h2>&lt;p>When discussing the IT talent shortage, we absolutely cannot ignore the &lt;strong>rise of Generative AI&lt;/strong>. Tools like GitHub Copilot, Cursor, and ChatGPT (GPT-4o and the O1 series) have fundamentally altered the productivity of software development.&lt;/p>
&lt;p>Previously, a common team structure involved senior engineers dedicating their time to complex design and reviews, while delegating simple CRUD (Create, Read, Update, Delete) operations, boilerplate (standardized code), and test code writing to junior engineers.&lt;/p>
&lt;p>However, today, 90% of these &amp;ldquo;tasks formerly handled by juniors&amp;rdquo; can be generated by generative AI in seconds to minutes, and with high accuracy. What was the result? &lt;strong>Companies have lost the reason to hire junior engineers.&lt;/strong>&lt;/p>
&lt;h3 id="changes-in-the-productivity-multiplier-due-to-generative-ai">Changes in the Productivity Multiplier Due to Generative AI
&lt;/h3>&lt;p>Let&amp;rsquo;s express the total productivity of a development team before and after AI adoption using a formula.&lt;/p>
&lt;p>Let the base productivity be $P$.
Let the productivity improvement rate of senior engineers due to generative AI adoption be $\alpha_{senior}$, and the productivity improvement rate of junior engineers be $\alpha_{junior}$.&lt;/p>
$$
\text{Total Output}_{pre} = N_{senior} \times P_{senior} + N_{junior} \times P_{junior}
$$$$
\text{Total Output}_{post} = N_{senior} \times P_{senior} \times (1 + \alpha_{senior}) + N_{junior} \times P_{junior} \times (1 + \alpha_{junior})
$$&lt;p>At first glance, it appears that junior productivity also improves. However, in the real-world field, the &lt;strong>ability to &amp;ldquo;verify the validity of AI-output code, integrate it into the entire system, and judge whether there are security concerns&amp;rdquo;&lt;/strong> is indispensable. This ability (contextual understanding and architectural design capability) is lacking in juniors.&lt;/p>
&lt;p>As a result, senior engineers master AI as a &amp;ldquo;superb assistant (an endlessly working junior),&amp;rdquo; skyrocketing their productivity by $2 \sim 3$ times ($\alpha_{senior} \approx 2.0$). Conversely, when juniors without fundamental skills use AI, they mass-produce spaghetti code riddled with debt, even if it looks like it works at a glance, which instead leads to increased review costs (there are even cases where effectively $\alpha_{junior} &lt; 0$).&lt;/p>
&lt;p>Consequently, companies have realized that &amp;ldquo;hiring one senior (AI user) with a monthly salary of 1.2 million yen&amp;rdquo; is overwhelmingly lower risk and higher performance than &amp;ldquo;hiring three juniors with a monthly salary of 300,000 yen.&amp;rdquo; This is the true nature of the &amp;ldquo;talent shortage.&amp;rdquo; There is an absolute lack of &amp;ldquo;seniors who can master AI.&amp;rdquo;&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title Polarization of Job Demand Between Junior and Senior Levels (2021-2026)
x-axis [&amp;#34;2021&amp;#34;, &amp;#34;2022&amp;#34;, &amp;#34;2023&amp;#34;, &amp;#34;2024&amp;#34;, &amp;#34;2025&amp;#34;, &amp;#34;2026&amp;#34;]
y-axis &amp;#34;Jobs-to-Applicants Ratio&amp;#34; 0.0 --&amp;gt; 10.0
line [&amp;#34;Senior (Architect/MLOps, etc.)&amp;#34;] [3.0, 3.5, 4.2, 5.8, 7.5, 9.2]
line [&amp;#34;Junior (Inexperienced/1-2 Years Exp)&amp;#34;] [2.5, 2.2, 1.8, 1.2, 0.8, 0.3]
&lt;/pre>
&lt;hr>
&lt;h2 id="4-beyond-prompt-engineering-what-are-the-truly-necessary-skills">4. Beyond Prompt Engineering: What Are the Truly Necessary Skills?
&lt;/h2>&lt;p>So, what kind of IT talent is required in the coming era? It&amp;rsquo;s premature to think that &amp;ldquo;mastering prompt engineering is enough.&amp;rdquo; The skill of issuing instructions in natural language is becoming easier and commoditized as AI models evolve.&lt;/p>
&lt;p>The reality on the ground is that talent capable of covering the following three areas is what is truly sought after today.&lt;/p>
&lt;h3 id="a-domain-driven-design-ddd-and-business-modeling">A. Domain-Driven Design (DDD) and Business Modeling
&lt;/h3>&lt;p>AI can write code, but it cannot &amp;ldquo;unravel the complex specifications of a business, discover the Bounded Context of software, and design appropriate data models.&amp;rdquo; The skill of &amp;ldquo;Domain-Driven Design (DDD)&amp;quot;—deeply understanding a client&amp;rsquo;s domain (business area) and translating it into technical terms—is one of the most valuable skills in the AI era.&lt;/p>
&lt;h3 id="b-architecture-and-non-functional-requirement-design">B. Architecture and Non-Functional Requirement Design
&lt;/h3>&lt;p>&amp;ldquo;Non-functional requirements&amp;rdquo; such as system availability, scalability, security, and performance are not automatically optimized by AI. Architectural decisions like &amp;ldquo;which cloud services should be combined,&amp;rdquo; &amp;ldquo;what the communication protocol between microservices should be,&amp;rdquo; or &amp;ldquo;where to draw DB transaction boundaries&amp;rdquo; still rely heavily on advanced human experience and intuition.&lt;/p>
&lt;h3 id="c-mlops-and-data-pipeline-construction">C. MLOps and Data Pipeline Construction
&lt;/h3>&lt;p>The concept of &amp;ldquo;MLOps&amp;rdquo; for continually operating generative AI and machine learning models in production environments is becoming increasingly important. Talent with skills located at the intersection of software engineering and data science—such as monitoring model drift (accuracy degradation), pipelining continuous training, and optimizing GPU resources—is in high demand.&lt;/p>
&lt;hr>
&lt;h2 id="5-survival-strategies-for-engineers-surviving-2026-and-beyond">5. Survival Strategies for Engineers: Surviving 2026 and Beyond
&lt;/h2>&lt;p>Under these circumstances, how should we engineers build our careers? The situation might look hopeless, especially for inexperienced engineers. However, depending on your strategy, there are plenty of ways to break through.&lt;/p>
&lt;h3 id="strategy-1-aim-to-be-an-ai-orchestrator">Strategy 1: Aim to be an &amp;ldquo;AI Orchestrator&amp;rdquo;
&lt;/h3>&lt;p>Instead of becoming an expert in a single language or framework, hone your ability as an &amp;ldquo;orchestrator&amp;rdquo; who combines multiple AI tools and agents to build entire systems. You need to reduce the time you spend writing code yourself, piece together the components generated by AI, and hold a &amp;ldquo;higher-level perspective&amp;rdquo; that oversees the entire architecture.&lt;/p>
&lt;h3 id="strategy-2-acquire-domain-knowledge">Strategy 2: Acquire Domain Knowledge
&lt;/h3>&lt;p>Beyond technical skills, gain deep domain knowledge in specific industries (finance, healthcare, logistics, etc.). Engineers who thoroughly understand the pain points of business workflows possess a powerful persuasiveness that AI cannot imitate when proposing technical solutions. Leave the &amp;ldquo;HOW&amp;rdquo; to AI, and focus on the &amp;ldquo;WHAT&amp;rdquo; and &amp;ldquo;WHY&amp;rdquo;.&lt;/p>
&lt;h3 id="strategy-3-soft-skills-and-stakeholder-management">Strategy 3: Soft Skills and Stakeholder Management
&lt;/h3>&lt;p>In large-scale system development, ultimately, &amp;ldquo;building human relationships&amp;rdquo; and &amp;ldquo;expectation management&amp;rdquo; determine the success or failure of a project. &amp;ldquo;Human skills&amp;rdquo;—such as defining requirements with clients, team facilitation, and building consensus on complex decisions—are the areas most difficult for AI to replace. Talent with excellent communication skills, rooted in technology, will be even more heavily prized in the future.&lt;/p>
&lt;pre class="mermaid">
graph LR
A[&amp;#34;Mere Coder&amp;#34;] --&amp;gt;|AI Substitution| B[&amp;#34;Decreased Demand&amp;#34;]
A --&amp;gt;|Strategic Shift| C[&amp;#34;System Architect&amp;#34;]
A --&amp;gt;|Strategic Shift| D[&amp;#34;Domain Expert&amp;#34;]
A --&amp;gt;|Strategic Shift| E[&amp;#34;AI Integrator&amp;#34;]
C --&amp;gt; F[&amp;#34;High Demand / High Rate (Winners in 2026 and Beyond)&amp;#34;]
D --&amp;gt; F
E --&amp;gt; F
style B fill:#f9c2c2,stroke:#333
style F fill:#c8f9c2,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;hr>
&lt;h2 id="conclusion-ride-the-wave-instead-of-fearing-it">Conclusion: Ride the Wave Instead of Fearing It
&lt;/h2>&lt;p>I hope you now understand that the &amp;ldquo;2026 Problem&amp;rdquo; and the accompanying reality of the IT talent shortage are not a simple &amp;ldquo;lack of headcount,&amp;rdquo; but a &amp;ldquo;mismatch caused by a dramatic shift in required skills.&amp;rdquo;&lt;/p>
&lt;p>The weight of legacy systems, the depletion of data engineers, and the paradigm shift driven by generative AI. These waves are a threat to traditional engineers, but for those who can embrace the change and update their skill sets, they represent a massive opportunity like never before.&lt;/p>
&lt;p>AI is not going to steal our jobs; it is merely a tool that allows us to focus on more advanced and creative work. To be freed from the &amp;ldquo;chore&amp;rdquo; of coding and focus on the &amp;ldquo;design&amp;rdquo; of systems and the &amp;ldquo;creation of value&amp;rdquo; in business. That is the only path to surviving—and thriving—in the IT industry from 2026 onwards.&lt;/p>
&lt;p>Now is the time to review your career path and steer toward the next paradigm.
Are you ready to &amp;ldquo;modernize&amp;rdquo; yourself?&lt;/p></description></item><item><title>The 'Human-Specific Engineering Skills' Required in the Era of AI Writing Code</title><link>http://kenji.blog/en/p/human-engineer-skills-ai-era/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/human-engineer-skills-ai-era/</guid><description>&lt;img src="http://kenji.blog/p/human-engineer-skills-ai-era/img/eyecatch.jpg" alt="Featured image of post The 'Human-Specific Engineering Skills' Required in the Era of AI Writing Code" />&lt;h1 id="the-human-specific-engineering-skills-required-in-the-era-of-ai-writing-code">The &amp;lsquo;Human-Specific Engineering Skills&amp;rsquo; Required in the Era of AI Writing Code
&lt;/h1>&lt;p>In recent years, the landscape of software engineering has changed dramatically with the rapid evolution of Generative AI and Large Language Models (LLMs). GitHub Copilot and various AI coding assistants are now used on a daily basis, and the phenomenon where &amp;ldquo;AI instantly generates code if you give instructions in natural language&amp;rdquo; is no longer science fiction from the future, but today&amp;rsquo;s reality.&lt;/p>
&lt;p>In such an era, it is natural for many engineers to harbor anxiety that &amp;ldquo;my job might be taken away by AI.&amp;rdquo; Indeed, &amp;ldquo;mere coding work (Typing Code)&amp;rdquo; such as creating boilerplate for routine CRUD applications, implementing simple algorithms, or calling APIs of well-known libraries is rapidly becoming commoditized.&lt;/p>
&lt;p>However, the essence of software engineering is not about &amp;ldquo;typing code.&amp;rdquo; It is about solving business challenges through technology and building scalable, maintainable systems. In this article, we will explore in profound and technical depth the &amp;ldquo;human-specific engineering skills&amp;rdquo; that become even more valuable in the era of AI writing code, looking at it from perspectives such as the technical limitations of LLMs, Domain-Driven Design (DDD), system architecture, and debugging distributed systems.&lt;/p>
&lt;hr>
&lt;h2 id="1-understanding-the-structural-limitations-of-large-language-models-llms">1. Understanding the Structural Limitations of Large Language Models (LLMs)
&lt;/h2>&lt;p>To properly evaluate AI&amp;rsquo;s capabilities and discern the areas where humans should demonstrate value, we must first understand the structural limitations of AI (especially LLMs) from mathematical and architectural standpoints.&lt;/p>
&lt;h3 id="11-limits-of-computational-complexity-and-context-in-the-transformer-architecture">1.1 Limits of Computational Complexity and Context in the Transformer Architecture
&lt;/h3>&lt;p>The majority of current LLMs are based on the &amp;ldquo;Transformer&amp;rdquo; architecture introduced by Google in 2017. The core of the Transformer lies in its &amp;ldquo;Self-Attention Mechanism.&amp;rdquo; The self-attention mechanism computes how closely each token in an input sequence is related to all other tokens.&lt;/p>
&lt;p>This attention calculation formula is expressed as follows:&lt;/p>
$$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$&lt;p>Here, $Q$ (Query), $K$ (Key), and $V$ (Value) are linear transformations of the input sequence, and $d_k$ is the dimensionality of the keys.
The most critical constraint in this calculation is the computational complexity associated with the matrix multiplication $QK^T$. If the input sequence (number of tokens) is $N$, this computational complexity grows on the order of $O(N^2)$ both in terms of time and space (memory).&lt;/p>
$$ \text{Complexity} = O(N^2 \cdot d) $$&lt;p>In recent years, research on hardware-level optimizations like FlashAttention, Sparse Attention, and even alternative architectures capable of linear time $O(N)$ processing such as Mamba (State Space Models) has been advancing. Still, &amp;ldquo;perfectly comprehending an infinite context and generating globally optimized outputs&amp;rdquo; remains extremely difficult.&lt;/p>
&lt;p>Furthermore, even if the context window can be physically expanded, a phenomenon called &amp;ldquo;Lost in the Middle&amp;rdquo; occurs. LLMs are highly susceptible to information at the beginning and end of a prompt, and tend to ignore important requirements and constraints placed in the middle. This is why, if you load the entire source code of a tens-of-thousands-of-lines enterprise system into an LLM and instruct it to &amp;ldquo;perform optimal refactoring&amp;rdquo;, it generates code that is locally correct but globally broken.&lt;/p>
&lt;h3 id="12-characteristics-of-probabilistic-generative-models-and-hallucinations">1.2 Characteristics of Probabilistic Generative Models and &amp;ldquo;Hallucinations&amp;rdquo;
&lt;/h3>&lt;p>The true nature of an LLM is a &amp;ldquo;probabilistic generative model&amp;rdquo; that predicts the token with the highest probability of appearing next, based on the input context (prompt) and the generation results so far.&lt;/p>
$$ P(w_t | w_{1:t-1}) = \text{softmax}(W \cdot h_t) $$&lt;p>The model merely learns &amp;ldquo;statistical co-occurrence relationships of words&amp;rdquo; from vast amounts of training data, and does not understand the &amp;ldquo;Semantics&amp;rdquo; of the generated code or the &amp;ldquo;real-world implications of the execution results.&amp;rdquo; This is what causes &amp;ldquo;hallucinations.&amp;rdquo;
Bugs such as calling imaginary library functions that do not exist, or passing variables with subtly mismatched types, are simply the result of the LLM generating a &amp;ldquo;grammatically plausible (high probability) sequence of tokens.&amp;rdquo;&lt;/p>
&lt;h3 id="13-lack-of-real-world-grounding">1.3 Lack of Real-World Grounding
&lt;/h3>&lt;p>AI lacks the ability to intuitively understand &amp;ldquo;physical constraints&amp;rdquo; or &amp;ldquo;real business constraints&amp;rdquo; (Grounding). For instance, it cannot consider the business reality that &amp;ldquo;a 100ms delay in payment processing latency reduces the conversion rate by 5%&amp;rdquo;, or environment-specific tacit knowledge like &amp;ldquo;transactions are prone to time out during this time period because batch processing runs on this legacy DB at 2:00 AM&amp;rdquo;, unless explicitly provided as text.&lt;/p>
&lt;p>Given these technical and structural limitations, we can see that while AI is an extremely excellent tool for &amp;ldquo;rapidly generating code within a clearly defined, narrow scope (functions, classes, modules)&amp;rdquo;, the act of &amp;ldquo;designing a whole system from ambiguous requirements and aligning it with real-world constraints&amp;rdquo; remains a uniquely human domain.&lt;/p>
&lt;hr>
&lt;h2 id="2-human-specific-skill-1-extracting-true-challenges-from-ambiguous-requirements">2. Human-Specific Skill 1: Extracting &amp;ldquo;True Challenges&amp;rdquo; from Ambiguous Requirements
&lt;/h2>&lt;p>The greatest hurdle in software development is not writing the code itself.
Frederick Brooks, author of the software engineering classic &amp;ldquo;The Mythical Man-Month&amp;rdquo;, stated:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;The hardest single part of building a software system is deciding precisely what to build.&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>Non-technical stakeholders (management, sales departments, customers) are mostly unable to verbalize what they truly want. Every day, engineers receive extremely ambiguous and contradictory requests such as &amp;ldquo;I want you to make a system that increases sales using AI&amp;rdquo; or &amp;ldquo;I want a screen where everything is automated with just the push of a single button.&amp;rdquo;&lt;/p>
&lt;p>Even if you feed a prompt into an AI saying, &amp;ldquo;Write code for a system that increases sales&amp;rdquo;, no usable system will come out. What is required of engineers is the following process:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Deep diving into the domain&lt;/strong>: Drawing out the &amp;ldquo;real business challenges&amp;rdquo; hidden behind the stakeholders&amp;rsquo; words through dialogue.&lt;/li>
&lt;li>&lt;strong>Scoping requirements&lt;/strong>: Weighing technical feasibility against cost (ROI) and deciding &amp;ldquo;what not to do.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Formalizing specifications&lt;/strong>: Translating ambiguous requirements into clear logical constraints (prompts or architecture blueprints) that AI can understand.&lt;/li>
&lt;/ol>
&lt;p>This &amp;ldquo;high-level human-to-human communication and negotiation&amp;rdquo; is a highly personalized and valuable skill that AI can never replace.&lt;/p>
&lt;hr>
&lt;h2 id="3-human-specific-skill-2-domain-driven-design-ddd-and-modeling">3. Human-Specific Skill 2: Domain-Driven Design (DDD) and Modeling
&lt;/h2>&lt;p>After eliciting requirements, the most powerful weapon for translating them into software structure is &amp;ldquo;Domain-Driven Design&amp;rdquo; (DDD). As AI increasingly generates local code automatically, the DDD concept of where to draw the &amp;ldquo;boundaries&amp;rdquo; of the overall system becomes vitally important.&lt;/p>
&lt;h3 id="31-establishing-a-ubiquitous-language">3.1 Establishing a Ubiquitous Language
&lt;/h3>&lt;p>In system development, if the &amp;ldquo;meaning of words&amp;rdquo; differs between the business side and the development side, AI will generate code in the wrong context. For example, the word &amp;ldquo;user&amp;rdquo; might refer to a &amp;ldquo;lead (prospective customer)&amp;rdquo; for the marketing department, but to an &amp;ldquo;already-contracted account&amp;rdquo; for customer support.
Human engineers must establish a unified &amp;ldquo;Ubiquitous Language&amp;rdquo; across the entire project, and enforce this language all the way down to class names, method names in code, and prompts to the AI.&lt;/p>
&lt;h3 id="32-designing-bounded-contexts">3.2 Designing Bounded Contexts
&lt;/h3>&lt;p>Attempting to represent a massive system with a single model will invariably fail. In DDD, a system is divided into meaningful boundaries (Bounded Contexts).
For example, in an e-commerce site, the concept of a &amp;ldquo;Product&amp;rdquo; has completely different attributes and behaviors it should possess in the catalog (display) context versus the inventory (management) context.&lt;/p>
&lt;p>Only when a human architect draws the correct context boundaries and assigns implementations to AI with independent prompts and specifications for each context, can the AI generate &amp;ldquo;code based on correct domain knowledge.&amp;rdquo;&lt;/p>
&lt;p>The following diagram illustrates the DDD approach and the division of roles in the AI era.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Business Requirements / Stakeholder Requests&amp;#34;] --&amp;gt; B[&amp;#34;Domain-Driven Design (Human&amp;#39;s Role)&amp;#34;]
B --&amp;gt; C[&amp;#34;Defining Bounded Contexts&amp;#34;]
B --&amp;gt; D[&amp;#34;Establishing Ubiquitous Language&amp;#34;]
C --&amp;gt; E[&amp;#34;Prompting AI / Code Generation&amp;#34;]
D --&amp;gt; E
E --&amp;gt; F[&amp;#34;Code Review / Validating Architecture&amp;#34;]
F --&amp;gt; G[&amp;#34;System Deployment and Monitoring&amp;#34;]
style B fill:#f9f,stroke:#333,stroke-width:2px
style C fill:#f9f,stroke:#333,stroke-width:2px
style D fill:#f9f,stroke:#333,stroke-width:2px
&lt;/pre>
&lt;p>Rather than instructing AI to &amp;ldquo;build the entire system&amp;rdquo;, humans will delegate implementation to AI strictly within the &amp;ldquo;context boundaries&amp;rdquo; they have defined. This will become the fundamental paradigm of software development going forward.&lt;/p>
&lt;hr>
&lt;h2 id="4-human-specific-skill-3-distributed-system-architecture-design-and-scaling">4. Human-Specific Skill 3: Distributed System Architecture Design and Scaling
&lt;/h2>&lt;p>Modern software is evolving from monoliths running on a single server to cloud-native microservices architectures and event-driven architectures. Designing such distributed systems is a profoundly difficult area for AI, which can only perform localized logic optimization.&lt;/p>
&lt;h3 id="41-the-cap-theorem-and-judging-trade-offs">4.1 The CAP Theorem and Judging Trade-offs
&lt;/h3>&lt;p>When designing a distributed system, engineers constantly confront the &amp;ldquo;CAP Theorem.&amp;rdquo; The CAP Theorem is the principle that a distributed system can only satisfy two out of the following three properties simultaneously:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Consistency&lt;/strong>: Does every node see the same data at the same time?&lt;/li>
&lt;li>&lt;strong>Availability&lt;/strong>: Does the system continue to respond even if some nodes fail?&lt;/li>
&lt;li>&lt;strong>Partition Tolerance&lt;/strong>: Does the system continue to operate even if a network partition occurs?&lt;/li>
&lt;/ul>
$$ P(\text{Availability} \cup \text{Consistency}) | \text{PartitionTolerance} $$&lt;p>Since partitions are unavoidable in real-world networks, engineers must make severe trade-off decisions directly tied to business requirements, such as &amp;ldquo;This payment system prioritizes Consistency, so we stop the service during a failure (CP)&amp;rdquo; or &amp;ldquo;This SNS timeline prioritizes Availability, so we tolerate temporary data inconsistency (AP).&amp;rdquo;&lt;/p>
&lt;p>While AI can write &amp;ldquo;code that prioritizes C&amp;rdquo; or &amp;ldquo;code that prioritizes A&amp;rdquo;, it cannot autonomously make the decision of &amp;ldquo;which should be prioritized,&amp;rdquo; a decision that involves business risks.&lt;/p>
&lt;h3 id="42-asynchronous-communication-and-eventual-consistency">4.2 Asynchronous Communication and Eventual Consistency
&lt;/h3>&lt;p>As systems scale up, inter-service coordination transitions from synchronous communication via REST APIs to asynchronous communication using message queues (such as Kafka or RabbitMQ). Here, data consistency shifts from immediate consistency to &amp;ldquo;Eventual Consistency.&amp;rdquo;
At what point should advanced architectural patterns like the Saga pattern or CQRS (Command Query Responsibility Segregation) be introduced? Making these complex decisions and drawing the blueprint for the entire system is exactly where the true worth of a senior engineer shines.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
Client[&amp;#34;Client&amp;#34;] --&amp;gt; API[&amp;#34;API Gateway&amp;#34;]
API --&amp;gt; Order[&amp;#34;Order Service (Context)&amp;#34;]
Order -. &amp;#34;Asynchronous Event (Kafka)&amp;#34; .-&amp;gt; Inventory[&amp;#34;Inventory Service&amp;#34;]
Order -. &amp;#34;Asynchronous Event (Kafka)&amp;#34; .-&amp;gt; Payment[&amp;#34;Payment Service&amp;#34;]
Inventory --&amp;gt; DB1[&amp;#34;Inventory DB&amp;#34;]
Payment --&amp;gt; DB2[&amp;#34;Payment DB&amp;#34;]
Order --&amp;gt; DB3[&amp;#34;Order DB&amp;#34;]
&lt;/pre>
&lt;hr>
&lt;h2 id="5-human-specific-skill-4-debugging-and-troubleshooting-complex-systems">5. Human-Specific Skill 4: Debugging and Troubleshooting Complex Systems
&lt;/h2>&lt;p>The more AI-generated code there is, the higher the risk that &amp;ldquo;code nobody fully understands&amp;rdquo; runs in the production environment. While it may run smoothly in normal times, the true value of human engineers is tested during troubleshooting when an outage occurs.&lt;/p>
&lt;h3 id="51-designing-observability">5.1 Designing Observability
&lt;/h3>&lt;p>To rapidly resolve system outages, simply pasting error logs into an AI is insufficient. In a microservices environment, a single request traverses dozens of services.
Engineers must appropriately build the &amp;ldquo;three pillars of observability&amp;rdquo;—Logs, Metrics, and Traces—into the system. It is a human&amp;rsquo;s role to utilize tools like OpenTelemetry to build a foundation that can pinpoint &amp;ldquo;which database query in which service is experiencing latency&amp;rdquo; through distributed tracing.&lt;/p>
&lt;h3 id="52-environment-dependent-bugs-and-chaos-engineering">5.2 Environment-Dependent Bugs and Chaos Engineering
&lt;/h3>&lt;p>&amp;ldquo;Bugs that don&amp;rsquo;t reproduce in local or test environments, but only occur during peak times in the production environment&amp;rdquo;—for instance, memory leaks, database deadlocks, connection pool exhaustion, or network packet loss—can never be found simply by static analysis of the source code.&lt;/p>
&lt;p>Human engineers form hypotheses while glaring at production environment metrics, analyze thread dumps and heap dumps, and identify bottlenecks. AI cannot tap away at a terminal to directly profile a production server process (nor should it be permitted to do so, as a security requirement).
As systems become more complex, the value of engineers possessing &amp;ldquo;low-level knowledge&amp;rdquo; of physical infrastructure, network protocols, and OS kernel tuning, along with &amp;ldquo;intuitive hypothesis-driven reasoning skills&amp;rdquo;, will skyrocket.&lt;/p>
&lt;hr>
&lt;h2 id="6-the-value-function-and-time-allocation-of-engineers-in-the-ai-era">6. The Value Function and Time Allocation of Engineers in the AI Era
&lt;/h2>&lt;p>As discussed thus far, the skill set required of engineers in the AI era is undergoing a massive paradigm shift. If we model this mathematically, the value created by an engineer ($V$) could be expressed as follows:&lt;/p>
$$ V = \left( \sum_{i=1}^{n} \text{DomainKnowledge}_i + \text{ArchitectureSkill} + \text{ProblemSolving} \right) \times \text{AI\_Leverage}^{\alpha} $$&lt;p>Traditional &amp;ldquo;coding speed&amp;rdquo; and &amp;ldquo;syntax memory&amp;rdquo; have been eliminated from this formula. Instead, it is structured to generate exponential value by multiplying the &amp;ldquo;sum&amp;rdquo; of deep domain knowledge, architecture design skills, and complex problem-solving abilities by the leverage of mastering AI ($\text{AI\_Leverage}^{\alpha}$).&lt;/p>
&lt;p>This paradigm shift will also be clearly evident in how engineers use their time on a daily basis (time allocation).&lt;/p>
&lt;pre class="mermaid">
pie title Engineer Time Allocation (Pre-AI)
&amp;#34;Coding / Fixing Syntax Errors&amp;#34;: 50
&amp;#34;Requirements Definition / System Design&amp;#34;: 20
&amp;#34;Implementing and Running Tests&amp;#34;: 20
&amp;#34;Production Ops / Debugging&amp;#34;: 10
&lt;/pre>
&lt;pre class="mermaid">
pie title Engineer Time Allocation (AI Era)
&amp;#34;Domain Modeling and Architecture Design&amp;#34;: 40
&amp;#34;Prompting AI and Code Validation&amp;#34;: 20
&amp;#34;Advanced Production Debugging and Ops&amp;#34;: 30
&amp;#34;Self-Coding (Core Areas)&amp;#34;: 10
&lt;/pre>
&lt;p>In the AI era, engineers will be elevated from &amp;ldquo;code typists&amp;rdquo; to &amp;ldquo;conductors orchestrating the entire system.&amp;rdquo; Precisely because AI will write massive amounts of code, the role of &amp;ldquo;reviewer&amp;rdquo; and &amp;ldquo;architect&amp;rdquo;—who monitors and governs whether the code is pointing in the right direction, satisfies security requirements, and aligns with the overall system architecture—will be demanded of all engineers, from junior to senior levels.&lt;/p>
&lt;hr>
&lt;h2 id="7-conclusion-dont-resist-evolution-ride-the-wave">7. Conclusion: Don&amp;rsquo;t Resist Evolution, Ride the Wave
&lt;/h2>&lt;p>The &amp;ldquo;era of AI writing code&amp;rdquo; is not a threat to engineers, but the greatest opportunity in history. Just as the transition from assembly language to C occurred in the past, and just as the evolution from manual memory pointer management to Java&amp;rsquo;s garbage collection took place, code generation by AI is simply &amp;ldquo;moving up one level of abstraction.&amp;rdquo;&lt;/p>
&lt;p>Engineers of the future will not be swayed by the trivial specifications of a particular programming language or framework upgrades, but will be able to concentrate their resources on more essential, higher-order human problem solving, such as: &lt;strong>&amp;ldquo;What is the business challenge?&amp;rdquo;, &amp;ldquo;How should data be partitioned and integrated?&amp;rdquo;, and &amp;ldquo;How do we rapidly recover when the system goes down?&amp;rdquo;&lt;/strong>&lt;/p>
&lt;p>A true engineer is not someone who writes code, but someone who solves problems.
Domain modeling, scalable architecture design, communication with stakeholders, and debugging complex systems. For those who continue to polish these &amp;ldquo;human-specific engineering skills,&amp;rdquo; AI will not be an enemy that takes away jobs, but the ultimate partner that expands their own creativity and productivity tens of times over.&lt;/p></description></item><item><title>What Engineers Should Do to Grow Monthly Traffic on a Tech Blog</title><link>http://kenji.blog/en/p/tech-blog-growth-strategies-for-engineers/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/tech-blog-growth-strategies-for-engineers/</guid><description>&lt;img src="http://kenji.blog/p/tech-blog-growth-strategies-for-engineers/img/eyecatch.jpg" alt="Featured image of post What Engineers Should Do to Grow Monthly Traffic on a Tech Blog" />&lt;h2 id="introduction-tech-blog-growth-hacking-only-engineers-can-do">Introduction: Tech Blog Growth Hacking Only Engineers Can Do
&lt;/h2>&lt;p>Many software engineers start tech blogs, but few manage to gather a consistent number of views and maintain or expand them over a long period. Writing high-quality technical articles is a prerequisite, but the era of &amp;ldquo;write a good article and it will naturally be read&amp;rdquo; is long gone. Today&amp;rsquo;s search engine algorithms have become complex, and the flow of information on SNS is faster than ever.&lt;/p>
&lt;p>However, engineers have an advantage that other professions do not. That is the ability to &amp;ldquo;understand system architecture, combine tools for automation, and analyze data programmatically.&amp;rdquo; In this article, going beyond simple writing techniques, we will treat a tech blog as a single &amp;ldquo;product&amp;rdquo; and explain in extreme and practical detail the strategies to dramatically increase monthly traffic using the power of engineering.&lt;/p>
&lt;hr>
&lt;h2 id="1-seo-architecture-for-engineer-tech-blogs">1. SEO Architecture for Engineer Tech Blogs
&lt;/h2>&lt;p>The foundational system of a blog (such as a static site generator) and the structure of its HTML are the most critical factors for search engines to interpret content correctly.&lt;/p>
&lt;h3 id="11-core-web-vitals-optimization">1.1 Core Web Vitals Optimization
&lt;/h3>&lt;p>Google has adopted page experience as a ranking factor, and &lt;strong>Core Web Vitals (LCP, FID/INP, CLS)&lt;/strong> cannot be ignored, even for tech blogs.
Tech blogs heavily use large amounts of source code blocks, mathematical formulas (MathJax / KaTeX), and explanatory diagrams. These are factors that delay page rendering.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LCP (Largest Contentful Paint)&lt;/strong>: The loading speed of the main content above the fold. Use WebP or AVIF for the eye-catch image and add the &lt;code>fetchpriority=&amp;quot;high&amp;quot;&lt;/code> attribute to preload it. Also, huge CSS and JS files for syntax highlighting should be loaded asynchronously or designed to load only on pages where they are needed.&lt;/li>
&lt;li>&lt;strong>CLS (Cumulative Layout Shift)&lt;/strong>: Layout shifts during page loading. By securing the display area for formulas and images in advance using CSS properties like &lt;code>aspect-ratio&lt;/code>, you can prevent layout jank when the DOM is inserted later.&lt;/li>
&lt;li>&lt;strong>INP (Interaction to Next Paint)&lt;/strong>: Responsiveness to user interactions. Heavy JavaScript (such as dynamic full-text search on the client side or executing a massive Markdown parser) must not be executed on the main thread; it is essential to offload it to a Web Worker or generate it as static HTML (SSG) during the build process.&lt;/li>
&lt;/ul>
&lt;h3 id="12-implementation-of-structured-data-json-ld">1.2 Implementation of Structured Data (JSON-LD)
&lt;/h3>&lt;p>To explicitly tell search engines that the page is an &amp;ldquo;article&amp;rdquo; and &amp;ldquo;who&amp;rdquo; the author is, implement structured data in JSON-LD format. By utilizing schemas such as &lt;code>TechArticle&lt;/code> or &lt;code>SoftwareSourceCode&lt;/code>, your content is more likely to appear in Google&amp;rsquo;s Rich Results, improving the CTR (Click-Through Rate).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;application/ld+json&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@context&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://schema.org&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;TechArticle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;headline&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;What Engineers Should Do to Grow Monthly Traffic on a Tech Blog&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;image&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://example.com/img/eyecatch.jpg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;datePublished&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;2026-09-14T10:00:00+09:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;author&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Kenji&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://example.com/about/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;publisher&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Organization&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Kenji&amp;#39;s Tech Blog&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;logo&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;ImageObject&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://example.com/img/logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="13-semantic-html-and-document-structure-optimization">1.3 Semantic HTML and Document Structure Optimization
&lt;/h3>&lt;p>Proper nesting of headings (&lt;code>h1&lt;/code> to &lt;code>h6&lt;/code>) is fundamental, but tech blogs require accurate use of HTML5 semantic tags like &lt;code>article&lt;/code>, &lt;code>section&lt;/code>, &lt;code>aside&lt;/code>, and &lt;code>nav&lt;/code>. Also, appropriately distinguishing &lt;code>&amp;lt;code&amp;gt;&lt;/code> and &lt;code>&amp;lt;pre&amp;gt;&lt;/code> for source code, &lt;code>&amp;lt;kbd&amp;gt;&lt;/code> for keyboard inputs, and &lt;code>&amp;lt;var&amp;gt;&lt;/code> for variables provides machine-readable HTML. This is also a highly effective measure for AI content indexing (LLM training data collection and RAG systems).&lt;/p>
&lt;hr>
&lt;h2 id="2-the-psychology-of-search-intent-and-keyword-strategy">2. The Psychology of Search Intent and Keyword Strategy
&lt;/h2>&lt;p>To maximize incoming traffic from search engines (organic traffic), you need to accurately decipher the search intent—&amp;ldquo;why did the user search for that keyword?&amp;rdquo; Search intent in the tech field can be broadly classified into two types.&lt;/p>
&lt;h3 id="21-troubleshooting-type-vs-systematic-learning--review-type">2.1 &amp;ldquo;Troubleshooting Type&amp;rdquo; vs. &amp;ldquo;Systematic Learning &amp;amp; Review Type&amp;rdquo;
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Troubleshooting Intent&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Example search keywords: &lt;code>Docker &amp;quot;no space left on device&amp;quot; solution&lt;/code>, &lt;code>Python IndexError list index out of range cause&lt;/code>&lt;/li>
&lt;li>Psychology: Blocked by an error during development, looking for a quick fix command or code snippet right now.&lt;/li>
&lt;li>Strategy: Present the &amp;ldquo;conclusion (code or command to solve the issue)&amp;rdquo; at the very beginning of the article (above the fold). Place the background and detailed mechanism explanations after that, first satisfying the user&amp;rsquo;s desire to &amp;ldquo;fix it immediately.&amp;rdquo; This helps reduce the bounce rate.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Systematic Learning &amp;amp; Review Intent&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Example search keywords: &lt;code>React vs Vue 2026 comparison&lt;/code>, &lt;code>Rust asynchronous processing tutorial&lt;/code>, &lt;code>GCP network architecture design&lt;/code>&lt;/li>
&lt;li>Psychology: Wants to select a new tech stack or deepen their understanding from the basics, and is ready to take time to read.&lt;/li>
&lt;li>Strategy: Enrich the Table of Contents (TOC) and heavily use diagrams and architecture charts (Mermaid, etc.). Objectively compare pros and cons and include use cases of how it can be applied in actual work, which can increase time spent on the page.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="22-exponential-decay-model-of-traffic-and-long-tail-strategy">2.2 Exponential Decay Model of Traffic and Long-Tail Strategy
&lt;/h3>&lt;p>Traffic for technical articles tends to form a spike (surge) right after publication due to buzz on SNS, etc., and then decreases exponentially. This traffic $V(t)$ can be approximated by the following mathematical model:&lt;/p>
$$ V(t) = V_0 e^{-\lambda t} + C $$&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>$V(t)$: Traffic volume at time $t$&lt;/li>
&lt;li>$V_0$: Initial traffic spike volume due to SNS buzz immediately after publication&lt;/li>
&lt;li>$\lambda$: Decay constant associated with content obsolescence and forgetting on SNS (depends on the speed of technological trend changes)&lt;/li>
&lt;li>$C$: Stable organic search inflow from search engines (baseline traffic)&lt;/li>
&lt;/ul>
&lt;p>The key to growing traffic over the long term is not to aim for a temporary buzz ($V_0$), but &lt;strong>how to make the constant term $C$ (sustained inflow from search engines) as large as possible&lt;/strong>. By covering a massive amount of &amp;ldquo;long-tail keywords&amp;rdquo;—such as specific niche errors or integration methods between specific tools—that have low search volume but no competition, you can grow the total sum of $C$ into something enormous.&lt;/p>
&lt;hr>
&lt;h2 id="3-data-driven-content-analysis-using-google-search-console-api">3. Data-Driven Content Analysis Using Google Search Console API
&lt;/h2>&lt;p>To build a stable traffic foundation $C$, it is necessary to utilize Google Search Console (GSC) data to objectively analyze &amp;ldquo;how Google evaluates your site.&amp;rdquo; However, clicking around the GSC Web UI has its limits. If you are an engineer, automate the analysis using the GSC API and Python.&lt;/p>
&lt;h3 id="31-automation-approach-with-gsc-api-and-python">3.1 Automation Approach with GSC API and Python
&lt;/h3>&lt;p>Create a script that automatically detects &amp;ldquo;wasteful articles&amp;rdquo; where the search ranking drops over time (Decaying Content), or where impressions are high but the Click-Through Rate (CTR) is abnormally low.
This uses &lt;code>google-api-python-client&lt;/code> and &lt;code>pandas&lt;/code>.&lt;/p>
&lt;h3 id="32-python-implementation-code-auto-extracting-content-with-decreased-ctr">3.2 Python Implementation Code: Auto-Extracting Content with Decreased CTR
&lt;/h3>&lt;p>Below is an example of a script that fetches search performance data for the past 30 days from the API and extracts a &amp;ldquo;recommended list of keywords and article URLs with great room for improvement in title or description&amp;rdquo; where impressions are 1000 or more and CTR is 2% or less.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">google.oauth2&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">service_account&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">googleapiclient.discovery&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. Authentication and API service construction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">KEY_FILE_LOCATION&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;path/to/your-service-account-key.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SCOPES&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;https://www.googleapis.com/auth/webmasters.readonly&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SITE_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://your-tech-blog.com/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">credentials&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service_account&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Credentials&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_service_account_file&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">KEY_FILE_LOCATION&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">scopes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SCOPES&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">webmasters_service&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">build&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;searchconsole&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;v1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">credentials&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">credentials&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. Calculation of request period (past 30 days)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">today&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">today&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">end_date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">today&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">start_date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">today&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. Execution of API request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;startDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;endDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;dimensions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;page&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;rowLimit&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">webmasters_service&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">searchanalytics&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">siteUrl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SITE_URL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">body&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">execute&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. Data processing and filtering using Pandas DataFrame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rows&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">row&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">rows&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Query&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;URL&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Clicks&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;clicks&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Impressions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;impressions&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;CTR&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;ctr&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Position&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;position&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Filtering condition: Impressions &amp;gt;= 1000 &amp;amp; CTR &amp;lt; 2%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;Impressions&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;CTR&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mf">0.02&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Sort in ascending order by position (prioritize high ranking but unclicked)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">by&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Position&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ascending&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;[Recommended List for Title/Meta Description Improvement]&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Export to CSV if necessary, etc.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># target_df.to_csv(&amp;#39;improve_candidates.csv&amp;#39;, index=False)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;No data found.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>By running this script as a cron job or a GitHub Actions scheduled job, you can continuously make data-driven decisions on &amp;ldquo;which article titles to rewrite.&amp;rdquo; It&amp;rsquo;s important to rely on data rather than intuition for continuous improvement (Continuous Content Improvement).&lt;/p>
&lt;hr>
&lt;h2 id="4-article-lifecycle-management-and-rewrite-strategy">4. Article Lifecycle Management and Rewrite Strategy
&lt;/h2>&lt;p>Publishing a technical article is not the end. As technology evolves (framework version updates, API deprecations, etc.), content quickly becomes obsolete. Continuing to provide outdated information not only damages the blog&amp;rsquo;s credibility but also negatively affects SEO.&lt;/p>
&lt;h3 id="41-content-lifecycle-management-gantt-chart">4.1 Content Lifecycle Management (Gantt Chart)
&lt;/h3>&lt;p>The ideal content operation lifecycle is shown in a Mermaid Gantt chart.&lt;/p>
&lt;pre class="mermaid">
gantt
title Data-Driven Content Lifecycle Management
dateFormat YYYY-MM-DD
axisFormat %m/%d
section &amp;#34;Phase 1: Planning &amp;amp; Writing&amp;#34;
&amp;#34;Search Keyword &amp;amp; Trend Analysis&amp;#34; :a1, 2026-09-01, 3d
&amp;#34;Draft &amp;amp; Code Verification&amp;#34; :a2, after a1, 5d
&amp;#34;Revision &amp;amp; Proofreading&amp;#34; :a3, after a2, 2d
section &amp;#34;Phase 2: Publishing &amp;amp; Promo&amp;#34;
&amp;#34;Deployment via CI/CD Pipeline&amp;#34; :p1, 2026-09-11, 1d
&amp;#34;Automated SNS Delivery (X, LinkedIn, RSS)&amp;#34; :p2, 2026-09-11, 1d
&amp;#34;Ripple Effect to Bookmarks, etc.&amp;#34; :p3, after p2, 3d
section &amp;#34;Phase 3: Observation &amp;amp; Analysis&amp;#34;
&amp;#34;GSC Data Accumulation Period&amp;#34; :m1, 2026-09-14, 28d
&amp;#34;Performance Eval via Python API&amp;#34;:m2, after m1, 2d
section &amp;#34;Phase 4: Improvement (Rewrite)&amp;#34;
&amp;#34;Title Fix for Low CTR Articles&amp;#34; :r1, after m2, 3d
&amp;#34;Code Update to Latest Version&amp;#34;:r2, after r1, 4d
&lt;/pre>
&lt;p>Treating article creation like a software development project and incorporating the post-release operation/maintenance (rewrite) phase into your plan is the secret to maintaining and improving traffic.&lt;/p>
&lt;h3 id="42-mathematical-model-of-content-creation-roi-return-on-investment">4.2 Mathematical Model of Content Creation ROI (Return on Investment)
&lt;/h3>&lt;p>Since engineers spend valuable time writing articles, they should be aware of the Return on Investment (ROI).
The ROI for a blog can be formulated as follows:&lt;/p>
$$ ROI = \frac{\sum_{t=1}^{T} \left( Rev_{ad}(t) + Val_{brand}(t) + Val_{skill}(t) \right) - Cost_{time}}{\text{Cost}_{time}} \times 100 \ (\%) $$&lt;ul>
&lt;li>$T$: Effective lifespan of the article (time until it becomes obsolete)&lt;/li>
&lt;li>$Rev_{ad}(t)$: Direct revenue from ad earnings, affiliate revenue, and sponsorships&lt;/li>
&lt;li>$Val_{brand}(t)$: Monetary equivalent of the positive impact on career due to demonstrating technical skills (e.g., increased offer amount when changing jobs, speaking requests)&lt;/li>
&lt;li>$Val_{skill}(t)$: Value of personal skill improvement through learning and research done to write the article&lt;/li>
&lt;li>$Cost_{time}$: Time spent writing the article, creating diagrams, and verifying code (converted to personal hourly rate)&lt;/li>
&lt;/ul>
&lt;p>The great thing about tech blogs is that even if $Rev_{ad}$ is small, $Val_{brand}$ and $Val_{skill}$ tend to be extremely large. In particular, high-quality technical explanations serve directly as a portfolio, wielding immense power in job hunting or securing side jobs.&lt;/p>
&lt;hr>
&lt;h2 id="5-distribution-via-github-actions-and-external-automation-tool-integration">5. Distribution via GitHub Actions and External Automation Tool Integration
&lt;/h2>&lt;p>After creating content, the challenge becomes how to efficiently deliver it to the target audience (distribution). Manually posting links to each SNS every time is inefficient and un-engineer-like.&lt;/p>
&lt;h3 id="51-social-media-sharing-automation-architecture">5.1 Social Media Sharing Automation Architecture
&lt;/h3>&lt;p>We will build an architecture that fully automates everything from building, deploying, and notifying multiple platforms the moment a Markdown file is merged into the main branch of a GitHub repository.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Developer (Git Push)&amp;#34;] --&amp;gt; B[&amp;#34;GitHub Repository&amp;#34;]
B --&amp;gt;|Webhook| C[&amp;#34;GitHub Actions (CI/CD)&amp;#34;]
C --&amp;gt;|Build| D[&amp;#34;Static Site Generator (Hugo/Gatsby)&amp;#34;]
D --&amp;gt;|Deploy| E[&amp;#34;Hosting (Vercel / Cloudflare Pages)&amp;#34;]
D --&amp;gt;|Generate| F[&amp;#34;RSS Feed (index.xml)&amp;#34;]
F --&amp;gt;|Polled by| G[&amp;#34;Zapier / IFTTT / Make&amp;#34;]
G --&amp;gt;|API Call| H[&amp;#34;X (Twitter) Auto Post&amp;#34;]
G --&amp;gt;|API Call| I[&amp;#34;LinkedIn Article Post&amp;#34;]
G --&amp;gt;|API Call| J[&amp;#34;Discord / Slack Community Webhook&amp;#34;]
C --&amp;gt;|Actions Script| K[&amp;#34;Qiita / Zenn Cross-Post API&amp;#34;]
&lt;/pre>
&lt;h3 id="52-key-points-for-building-an-automation-pipeline">5.2 Key Points for Building an Automation Pipeline
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Build and Deploy with GitHub Actions&lt;/strong>
If using a static site generator, automate the HTML generation and deployment to the hosting provider (Vercel, Netlify, Cloudflare Pages, etc.) using GitHub Actions. At this time, it is also effective to incorporate an image optimization process (such as auto-conversion to WebP) into the build pipeline as a Core Web Vitals countermeasure mentioned earlier.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>SNS Integration with RSS Triggers Using Zapier/IFTTT&lt;/strong>
The site generator creates the latest RSS feed (XML) during the build. Feed this into an iPaaS like Zapier or Make (formerly Integromat) to build a workflow such as &amp;ldquo;When a new item is added to RSS, post the title and URL to X (Twitter) and LinkedIn.&amp;rdquo; With this, notifications to followers are automatically sent the moment an article is published.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Cross-Posting to Qiita/Zenn (Using Canonical Tags)&lt;/strong>
While the domain authority of your company or personal blog is still weak, borrowing the visitor attraction power of technical platforms like Qiita or Zenn is one strategy. However, simple copy-pasting carries the risk of SEO penalties for duplicate content.
This issue can be resolved by setting a &lt;strong>Canonical tag&lt;/strong> in the metadata of the Qiita or Zenn article, pointing to the original article URL on your own blog. By writing a script that hits various platform APIs from GitHub Actions to automatically generate articles from Markdown, you can fully automate multi-channel delivery.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="conclusion-turning-the-cycle-of-continuous-improvement">Conclusion: Turning the Cycle of Continuous Improvement
&lt;/h2>&lt;p>To dramatically increase monthly traffic on a tech blog, the engineering approaches introduced this time are indispensable in addition to the act of &amp;ldquo;writing.&amp;rdquo;&lt;/p>
&lt;ol>
&lt;li>Building a robust HTML and site architecture with SEO in mind&lt;/li>
&lt;li>Article design that understands the user&amp;rsquo;s search intent (troubleshooting vs. systematic learning)&lt;/li>
&lt;li>Data analysis utilizing the Google Search Console API and Python&lt;/li>
&lt;li>Content lifecycle management and rewriting with ROI in mind&lt;/li>
&lt;li>Complete automation of distribution through CI/CD and Zapier integration&lt;/li>
&lt;/ol>
&lt;p>If you can assemble these as a system, your tech blog will become the strongest asset to powerfully boost your own career. Engineers struggling with stagnant traffic should definitely start &amp;ldquo;blog growth hacking&amp;rdquo; today. The programming skills and architecture design abilities cultivated in development work will undoubtedly be your greatest weapons in blog management as well.&lt;/p></description></item></channel></rss>