Writing
Articles about backend development, distributed systems, databases, and things I’m learning.
31 articlesBuilding Your First LLM Career Assistant: A Beginner's Guide
Build a resume-based chatbot with Python, FastAPI, and the OpenAI API, including PDF parsing, conversation memory, token limits, and rate limiting.
How AI Change The Way I Work as A Software Engineer
How I use AI tools for prototyping and research, and my observations on code generation, technical learning, and the role of software engineers.
Mastering Race Conditions: Strategies for Reliable Software Systems
Understand race conditions in multithreaded and distributed systems, with locking strategies, detection methods, and a banking transaction example.
A Developer’s Guide to Circuit Breakers: Protect Your Service from Failure
How circuit breakers isolate downstream failures, with state transitions, configuration, monitoring, and a Go example using Hystrix.
What Is API Versioning
Compare API versioning through URL paths, query parameters, request headers, and media types, and plan how to communicate breaking changes to consumers.
Understanding Database Locks: Managing Concurrency in Databases
Database concurrency explained through shared and exclusive locks, isolation levels, pessimistic and optimistic locking, MVCC, and a seat-booking example.
Understanding How Java's Garbage Collector Works
How Java manages memory and reclaims objects, with an overview of Serial, Parallel, G1, and ZGC collectors and their performance tradeoffs.
How a Database Index Works and How to Use It Effectively
How database indexes speed up queries, their storage and write costs, and when to use single-column, compound, unique, and partial indexes.
Why You Should Use Caching - Improve User Experience and Reduce Costs
Backend object caching explained: write patterns, cache misses, invalidation, replacement policies, performance tradeoffs, and when caching is unsuitable.
The Essential Skills of a Software Engineer
My view of the skills software engineers need: technical fundamentals, clear communication, ownership, and understanding the people using the product.
Incident Management Platform in Blibli.com
How we built an incident management platform at Blibli, from the earlier response process to requirements, implementation, incident flow, and results.
Designing A Retry Mechanism For Reliable Systems
Design retries for transient failures: choose retryable requests, set backoff periods, manage retry state, and account for timeouts and idempotency.
How To Better Store Password In Database
Why plain-text passwords and fast hashes are unsafe for database storage, how salts work, and how bcrypt balances hashing cost with login latency.
How to Implement JSON Web Token (JWT) in Java Spring Boot
Implement signed and encrypted JSON Web Tokens in Java Spring Boot with jose4j, covering JWS creation and validation, JWE, and key handling.
Introduction to JWT (Also JWS, JWE, JWA, JWK)
An introduction to JWT and related JOSE standards: token structure, signatures, encryption, algorithms, keys, and the differences between JWS and JWE.
Get Started With Docker
A practical introduction to Docker containers, images, commands, volumes, networking, Dockerfiles, and running multiple services with Docker Compose.
Updating Code Curated to Ghost Version 4
Notes from upgrading a self-hosted Ghost blog from version 3 to 4, covering theme checks, backups, the upgrade process, and performance comparisons.
Getting Started With Elasticsearch in Java Spring Boot
Connect Spring Boot 2 to Elasticsearch using Spring Data repositories, ElasticsearchRestTemplate, and the REST high-level client, with CRUD examples.
How to Set up a Self-Hosted Ghost Blogging Platform
A walkthrough of self-hosting Ghost on DigitalOcean, including domain setup, Cloudflare DNS and TLS, server configuration, and the Ghost admin account.
Using XOR For Swapping Variable
How exclusive OR works and why XOR can swap two variable values without a temporary variable, with binary examples and a Python implementation.
Reasons I Changed From WordPress to Ghost
Why I moved my blog from WordPress to Ghost in 2020, including the Node.js stack, resource usage, plugin tradeoffs, and writing interface.
Introduction to Analyzer in Elasticsearch
How Elasticsearch analyzers turn text into searchable tokens, with examples of character filters, tokenizers, token filters, and custom analyzers.
How to Handle Typos in Elasticsearch Using Fuzzy Query
Handle typos in Elasticsearch with fuzzy and match queries, using edit distance, fuzziness, transpositions, prefix length, and query tuning examples.
5 Software Engineering Beginner Mistakes I Did
Five mistakes from my early software engineering work: skipping tests and design, writing complex code, neglecting documentation, and missing soft skills.
Avoiding the Null Pointer Exception With Optional in Java
How to use Java Optional to handle missing values, with examples of map, flatMap, filter, fallback methods, and common mistakes to avoid.
Create a Simple Autocomplete With Elasticsearch
Build a simple Elasticsearch autocomplete using match_phrase_prefix, from index mappings and sample documents to query behavior and limitations.
Why I Took a Machine Learning Course as a Software Engineer
Why I took a machine learning specialization as a software engineer, how I chose the course, and what I learned from completing it over five months.
Functional Programming in Java, Explained
Java functional programming with lambda expressions and functional interfaces, including built-in interfaces and a small custom Stream implementation.
Elasticsearch: Text vs. Keyword
Compare Elasticsearch text and keyword fields: how analysis changes indexing, how term and match queries behave, and when to use each field type.
Should You Use a Password Manager?
An overview of password managers, password reuse risks, the benefits and risks of storing credentials, and ways to protect a password vault.
Basics of Elasticsearch for Developer
An introduction to Elasticsearch for developers, covering inverted indexes, field types, analyzers, document writes, queries, and aggregations.