<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Story on Blogfolio Najib</title>
		<link>https://najib.id/en/tags/story/</link>
		<description>Recent content in Story on Blogfolio Najib</description>
		<generator>Hugo</generator>
		<language>en-US</language>
		
		
		
			<copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright>
		
		
			<lastBuildDate>Wed, 23 Sep 2026 21:43:16 +0700</lastBuildDate>
		
			<atom:link href="https://najib.id/en/tags/story/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Hijrah Frontend (1): When a Backend Engineer Is Told to Touch the Frontend</title>
				<link>https://najib.id/en/writing/2026/hijrah-frontend-01/</link>
				<pubDate>Fri, 11 Sep 2026 09:00:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-frontend-01/</guid>
				<description>&lt;p&gt;The &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-01/&#34;&gt;Hijrah Backend&lt;/a&gt; series has graduated. The GPS backend now stands on Go, 14 domain modules are in order, and the endpoint that used to eat 15 seconds has recovered.&lt;/p&gt;&#xA;&lt;p&gt;Now it&amp;rsquo;s the neighboring building&amp;rsquo;s turn.&lt;/p&gt;&#xA;&lt;p&gt;I am a backend engineer. My world: queries, indexes, binary packet parsers, and database welfare. The frontend is a country I visit occasionally, on a tourist visa. This episode is about the day that tourist visa got revoked and replaced with a resident ID hehe~&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Frontend (2): The Thin Port and the Inheritance That Boarded</title>
				<link>https://najib.id/en/writing/2026/hijrah-frontend-02/</link>
				<pubDate>Fri, 11 Sep 2026 09:00:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-frontend-02/</guid>
				<description>&lt;p&gt;The move from &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-frontend-01/&#34;&gt;episode one&lt;/a&gt; is finished, and handover day has arrived. The manifest is short and boring, exactly like the best moving manifests: &lt;strong&gt;seventy-six boxes in, seventy-six boxes out. Zero pages left behind.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s not luck. That&amp;rsquo;s a decision. And this episode is about that decision: what we deliberately carried over, what turned out to board without an invitation, and one big plan that chose not to happen hehe~&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-zero-pages-were-left-behind&#34;&gt;Why Zero Pages Were Left Behind &lt;a href=&#34;#why-zero-pages-were-left-behind&#34; class=&#34;tdln dimmer&#34;&gt;&lt;small&gt;#&lt;/small&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;If you&amp;rsquo;ve ever moved houses, you know the most liberating moment: deciding &amp;ldquo;just throw this one away&amp;rdquo;. A frontend migration has the same moment with a bigger temptation, because discarding pages feels like tidying up the product at the same time.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Frontend (3): Type Chaos, Numbers, Empty Strings, and Pages with Different Opinions</title>
				<link>https://najib.id/en/writing/2026/hijrah-frontend-03/</link>
				<pubDate>Fri, 11 Sep 2026 09:00:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-frontend-03/</guid>
				<description>&lt;p&gt;One identical field, sent by three different pages, carrying three different beliefs about what it is. The first page sends a number. The second page, when empty, sends an empty string. The third sends a number wrapped in a string. All three lived in peace for years, until one day the receiver changed to a system that refuses to guess hehe~&lt;/p&gt;&#xA;&lt;p&gt;This episode is about &lt;em&gt;type chaos&lt;/em&gt;: how it was born without anyone&amp;rsquo;s intent, why it survived for years, and its scars, still measurable in our repo today.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Frontend (4): Two UI Libraries, Two Naming Eras</title>
				<link>https://najib.id/en/writing/2026/hijrah-frontend-04/</link>
				<pubDate>Fri, 11 Sep 2026 09:00:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-frontend-04/</guid>
				<description>&lt;p&gt;In &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-frontend-02/&#34;&gt;episode two&lt;/a&gt; I mentioned the numbers: one UI library is used across 101 files, the other survives in 13. This episode digs deeper into them, because inside are two findings that made me laugh alone in front of a screen hehe~&lt;/p&gt;&#xA;&lt;p&gt;Finding one: the two &lt;strong&gt;never meet in a single file&lt;/strong&gt;. Finding two: the less popular library holds the most sought-after goods in town. In order, then.&lt;/p&gt;&#xA;&lt;h2 id=&#34;two-civilizations-with-a-demarcation-line&#34;&gt;Two Civilizations with a Demarcation Line &lt;a href=&#34;#two-civilizations-with-a-demarcation-line&#34; class=&#34;tdln dimmer&#34;&gt;&lt;small&gt;#&lt;/small&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The first civilization is the majority library: it provides the &lt;em&gt;paginator&lt;/em&gt;, &lt;em&gt;button&lt;/em&gt;, &lt;em&gt;skeleton&lt;/em&gt;, &lt;em&gt;card&lt;/em&gt;, and even an image &lt;em&gt;galleria&lt;/em&gt;. It is the foundation of nearly every page; its call can be heard in one hundred and one files.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Frontend (5): Two Sides of One Building</title>
				<link>https://najib.id/en/writing/2026/hijrah-frontend-05/</link>
				<pubDate>Fri, 11 Sep 2026 09:00:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-frontend-05/</guid>
				<description>&lt;p&gt;This is the final episode of the &lt;em&gt;frontend&lt;/em&gt; series. And true to the closing tradition of &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-09/&#34;&gt;the neighboring series&lt;/a&gt;, this episode isn&amp;rsquo;t a victory party; it&amp;rsquo;s the closing inventory: what&amp;rsquo;s done, what&amp;rsquo;s intentionally left unfinished, and what living in a building whose two sides ended up occupied by the same person actually taught me hehe~&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-honest-closing-inventory&#34;&gt;The Honest Closing Inventory &lt;a href=&#34;#the-honest-closing-inventory&#34; class=&#34;tdln dimmer&#34;&gt;&lt;small&gt;#&lt;/small&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The last four episodes opened the inherited &lt;em&gt;frontend&lt;/em&gt; building. Now that the door is shut again, here&amp;rsquo;s what&amp;rsquo;s inside:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (1): Day One, Handed a Legacy of 370&#43; Endpoints</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-01/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-01/</guid>
				<description>&lt;p&gt;This story actually begins before I was even hired.&lt;/p&gt;&#xA;&lt;p&gt;At a GPS tracking company in Surabaya, Indonesia, one of the team&amp;rsquo;s seniors received a mandate to rewrite the existing system. To this day I don&amp;rsquo;t know exactly what was said in that internal meeting; I only know the outcome: they decided to move to Go. And only after that decision was final did the job opening appear.&lt;/p&gt;&#xA;&lt;p&gt;So my position in the recruitment was unique: I wasn&amp;rsquo;t applying for a job, I was applying to execute a decision other people had already made hehe.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (2): Anatomy of a 15-Second Endpoint</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-02/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-02/</guid>
				<description>&lt;p&gt;In &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-01/&#34;&gt;the previous episode&lt;/a&gt; I mentioned an endpoint that took 15 seconds per call. This is the full story, because hunting its cause turned out to be one of the most educational debugging sessions I&amp;rsquo;ve ever had. Not because it was hard, but because I was wrong repeatedly, and confidently hehe~&lt;/p&gt;&#xA;&lt;h2 id=&#34;one-click-seventeen-seconds&#34;&gt;One Click, Seventeen Seconds &lt;a href=&#34;#one-click-seventeen-seconds&#34; class=&#34;tdln dimmer&#34;&gt;&lt;small&gt;#&lt;/small&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The victim: a fuel-estimation-per-vehicle-group endpoint. One click on the dashboard, then you wait. About 17 seconds, every single time. For a dashboard people open daily, that felt like dial-up loading hahaha.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (3): Porting Dozens of GPS Protocol Parsers Without Stopping the Fleet</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-03/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-03/</guid>
				<description>&lt;p&gt;Let&amp;rsquo;s start with the most confusing report I&amp;rsquo;ve ever handled: a vehicle parked with its engine off, while the system read its speed as &lt;strong&gt;66 km/h&lt;/strong&gt;. Satellites healthy, data flowing in. If you&amp;rsquo;ve ever wondered how one wrong punctuation mark can make a parked car speed, this story is for you hehe~&lt;/p&gt;&#xA;&lt;h2 id=&#34;rewind-january-2025&#34;&gt;Rewind: January 2025 &lt;a href=&#34;#rewind-january-2025&#34; class=&#34;tdln dimmer&#34;&gt;&lt;small&gt;#&lt;/small&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;As covered in &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-01/&#34;&gt;episode one&lt;/a&gt;, the migration mandate had been waiting since before I was even hired. One of its largest chunks landed on my desk: the protocols. The front door for all fleet data.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (4): Old Code as an Executable Spec</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-04/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-04/</guid>
				<description>&lt;p&gt;If I had to compress the one rule that governed this entire migration, it would be this: &lt;strong&gt;the old system is right.&lt;/strong&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;I know how that sounds. You&amp;rsquo;re trusted to move a system to a new language, and rule number one is: nothing changes. Not faster. Not cleaner. Not better. &lt;strong&gt;Identical.&lt;/strong&gt; This episode unpacks why the most anticlimactic rule turned out to be the sanest decision I&amp;rsquo;ve ever worked under hehe~&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (5): The Query That Said &#39;Use My Index&#39;</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-05/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-05/</guid>
				<description>&lt;p&gt;In &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-02/&#34;&gt;episode two&lt;/a&gt;, the query was innocent, 78 milliseconds in the CLI while the endpoint burned 15 seconds. This episode is the mirror image: this time the query was truly guilty. But not because it was complex or ugly, it was guilty because one small function wrapper made it &lt;strong&gt;ignore an index built specifically for it&lt;/strong&gt; hehe~&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-perfectly-designed-index-times-three&#34;&gt;A Perfectly Designed Index (Times Three) &lt;a href=&#34;#a-perfectly-designed-index-times-three&#34; class=&#34;tdln dimmer&#34;&gt;&lt;small&gt;#&lt;/small&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;The victim: an endpoint counting alerts per device. Its alert table holds tens of millions of rows,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and on top of it sits a composite index: (date, device, alert type). Read the endpoint&amp;rsquo;s needs, &amp;ldquo;count alerts per device per type, within a date range&amp;rdquo;, and that index looks like it was built for exactly this query. Someone in the past understood the problem perfectly.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (6): Tidying a Monolith While the Plane Keeps Flying</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-06/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-06/</guid>
				<description>&lt;p&gt;My Go system, fresh out of the migration, was born with one inherited illness. All repositories slept in two giant folders named &lt;code&gt;repository&lt;/code&gt; and &lt;code&gt;usecase&lt;/code&gt;, alerts, billing, geofence, fuel, everything mixed into one. Technically nothing was wrong; mentally, it was a big city with no districts. To find any house, you had to memorize the whole town.&lt;/p&gt;&#xA;&lt;p&gt;This episode is about tidying that city, into 14 domain modules, while its endpoints kept serving production. Because, as you know, there&amp;rsquo;s no pause button for a system used by tens of thousands of people hahaha.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (8): Eighteen Months in Retrospect (Give or Take)</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-08/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-08/</guid>
				<description>&lt;p&gt;This is the final episode of the series. And as you might have guessed from the title, the &amp;ldquo;eighteen months&amp;rdquo; figure itself needs quotation marks: counted from day one to when this post was written, the number is larger. But fine, numbers on slides each get their own version; this series has been a story about that gap since the beginning hahaha.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;The previous seven episodes handled technical lessons one by one. This episode holds the rest: what I&amp;rsquo;d do differently, the architecture debt I promised to discuss back in &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-02/&#34;&gt;episode two&lt;/a&gt;, one act that never happened, and the thank-yous.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Hijrah Backend (9): Epilogue, MySQL, PostgreSQL, Then MySQL Again</title>
				<link>https://najib.id/en/writing/2026/hijrah-backend-09/</link>
				<pubDate>Thu, 10 Sep 2026 15:30:00 +0700</pubDate>
				<guid>https://najib.id/en/writing/2026/hijrah-backend-09/</guid>
				<description>&lt;p&gt;This series already ended in &lt;a href=&#34;https://najib.id/en/writing/2026/hijrah-backend-08/&#34;&gt;the previous episode&lt;/a&gt;. But every long journey has one story that never fits in the main body, and this one actually happened after almost every other episode was written. Think of it as the post-credits scene: the screen is dark, the lights are on, but there&amp;rsquo;s one more scene hehe.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s the story of a database engine asked to change course twice. And as for who was holding the wheel at the time: not me, and by now you can probably guess hahaha.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
