Writing
-
When GitHub Actions Is the Outage
August 6’s Actions degradation left jobs queued, timed out, or assigned to dead work—and self-hosted runners did not escape. Treat status.github.com as step zero when CI suddenly lies.
-
Tickets Where an Agent Makes You Slower
When an agent costs more review time than typing the fix, skip it. A ticket map for negative expected value, assistant vs agency, and when to refuse the bot.
-
Making a Monorepo Navigable to Agents
Agents fail on layout, not IQ. Module maps, verify commands, and repo conventions that keep coding agents from inventing fake Gradle targets.
-
In-App Review Returned Success — The Dialog Never Showed
Play can return success while the review dialog never appears. How to separate app bugs from store-side review outages before you ship a panic fix.
-
The Chat That Forgot the Constraint — and the Memory That Gaslit the Fix
Constraints stated three turns ago evaporate; memory can invent false certainty. Rules, skills, and falsifiable memory that keep agents inside the right modules.
-
Planning Theater vs a Plan That Saves a Rewrite
A two-page plan you ignore is theater; zero plan is thrash. What a short agent plan must include to prevent a rewrite an hour later.
-
Mobile Logs, Crashes, and Metrics: Pick Signals That Decide
More telemetry is not more control. How to pick logs, crashes, and metrics that actually decide ship/fix calls on mobile.
-
"It Worked Once in Chat" Is Not a Ship Bar
One green chat session is not a ship bar. Promote agent configs with golden tasks, flake budgets, and outcomes you can re-run.
-
Android FE Architecture History: MVC to Compose
From God Activities to Compose: how MVC, MVP, MVVM, MVI, and declarative UI change where state and side effects live.
-
The Bot Commented on Your PR and Nobody Owns It
CI bots that spam wrong comments create public debt nobody owns. Design review agents with ownership, severity gates, and mute paths.
-
ANR Stack Traces Lie by Omission — Crashlytics Is One Layer
ANR stacks omit history; Crashlytics is only one layer. Correlate traces, breadcrumbs, and main-thread blockers before you fix the wrong frame.
-
Your Agent Has Too Many Tools — and Mistakes Access for Expertise
More MCP plugins often mean worse judgment. Curate tools so the agent cannot confuse access with expertise.
-
GHEC vs GHES: What Actually Changes for Your Team
Enterprise Cloud and Enterprise Server share a license — not an ops model. What breaks for Actions, identity, and upgrades when you pick wrong.
-
Imperative vs Declarative Android UI: What Migration Actually Changes
Compose does not fail like ListAdapter. What actually changes when UI becomes a function of state — and which bugs migrate with you.
-
The Overnight Agent PR Fantasy
Wake-up-to-a-green-PR is mostly fantasy. Overnight agents need verify loops, narrow scopes, and humans who still own the merge.
-
REST vs RPC: Same HTTP, Different Contracts
REST models resources; RPC models procedures. They are alternatives for API shape — and your Android client feels the difference.
-
Fat vs Chatty APIs on Cellular
Six GETs per row feel fine on Wi‑Fi and die on one bar. Design list APIs for cellular: fewer round trips, calmer updates.
-
Agent Trust Boundaries: Approvals That Matter, Tools That Lie
Approval fatigue and lying tools lose the same afternoon. Draw trust boundaries so agents cannot reach deploy keys by accident.
-
The Agent Said Done — and CI Is Red
Chat said done; formatting, tests, and types disagreed. Treat CI as the only done signal agents are allowed to claim.
-
Replication Lag Filed as an Android Bug
Send succeeds, refresh hides the message, Android gets the ticket. Separate freshness classes so lag is not misfiled as a client bug.
-
Building an AI Assistant Surface in Jetpack Compose Without Fighting the Keyboard
Chat UIs break on IME, scroll, and streaming tokens. Compose patterns for assistant surfaces that do not fight the keyboard.
-
Cache Invalidation from CDN to Room
Avatar updated; every layer still shows yesterday. Walk CDN → API → OkHttp → Room before you “fix” Compose.
-
Subagents That Argue While You Pay for Both
Parallel research children burn tokens and contradict each other. When subagents help — and when one careful thread wins.
-
Redux on Android: When Unidirectional State Is Worth the Ceremony
Racey ViewModel mutations are order bugs, not syntax bugs. When unidirectional state ceremony pays for itself on Android.
-
Gradle Modularization: Slice for Change, Not for the Diagram
Hexagon diagrams do not cut build times. Slice Gradle modules by change frequency and ownership, not purity.
-
The Request Path Should Never Wait
Send should not wait on virus scan or CDN publish. Keep the request path short; run slow work asynchronously.
-
Three Clients, Same Aggregation: Why BFF Shows Up
Android, iOS, and web should not each reassemble the same list model. When a BFF earns its keep — and what it costs.
-
A Hot Mailbox Melts the Shard
One celebrity inbox can melt a shard. Client refresh discipline and cache-aside as the first shield.
-
Types of Mobile Apps: When Native Still Wins
Native, web, PWA, hybrid — pick by symptoms, not labels. When frame time and device APIs still force native.
-
Push Is a Distributed System, Not a FCM Call
FCM.send is not a push architecture. Collapse keys, priority, payloads, and failover as an explicit distributed design.
-
Feature Flags on Mobile: Kill Switch, Rollout, Experiment
Kill switch, rollout, and experiment are three jobs. Stop muddying them into one boolean on mobile.
-
Scalable Patterns Worth Stealing (Without Renaming Your Résumé)
Name gateway, cache, fan-out, and async patterns so you can argue tradeoffs — without renaming your résumé.
-
One Telemetry Story Across Client and Server
Three dashboards disagree while users say it is broken. One telemetry story across phone and backend.
-
Mail Storage & Caching Without Lagging the Gesture
Inbox open is a latency budget across memory, disk, and network. Put each byte where the gesture can afford it.
-
Offline-First Mail: Consistency Is a UX Decision
Offline compose chooses availability over strong consistency. Draft conflicts, sync tokens, and honest UI when devices diverge.
-
Multi-Region Reality for Mobile Users
The phone moved; the control plane did not. Region affinity, latency, and what mobile users actually feel.
-
GitHub Actions for Android: PR Gates That Protect Merges
Green checks that only assembleDebug protect nothing. PR gates that catch module graphs, Manifest, and real risk.
-
Rate Limits Without Gaslighting the UX
A spinner that hides a 429 is gaslighting. Honor Retry-After, coalesce calls, and tell the user the truth.
-
Retry Storms: When Your Own Clients DDoS You
Recovery traffic can outpace the outage. Jitter, caps, and breakers so your own fleet is not the DDoS.
-
The API Is Up. Why Are Phones Still Broken?
Edge nines do not equal open-inbox success. Session SLIs for cold start when phones never reach the API.
-
Memoization: Cache the Result, Not the Algorithm
Same inputs, same answer — stop recomputing on every scroll frame. Memoization as production caching, not interview DP.
-
From Jenkins to Screwdriver: What CI/CD Actually Buys an Android Team
Laptop-green and store-red usually means the pipeline lied. What CI/CD actually buys an Android team.
-
Why Your PR Diff Is Noisy: Formatters vs Linters
Noisy diffs and false CI reds often mix format and lint. Separate style machines from correctness rules.
-
Web-to-App Install Prompts: When Nagging Costs Retention
Web-to-app nag banners can cost retention. Measure the full install funnel before you plaster Get the app.
-
Image Security in General: What Breaks on the Mobile Photo Path
Photos touch compression, thumbs, CDN, and GPU decode. Where the mobile image path silently weakens security.
-
Cross-Platform Mobile Frameworks: Flutter, RN, and the WebView Trap
Write-once hides a fork: WebView vs native widgets. Flutter, RN, and when the WebView trap shows up.
-
Android SDK Versions: compileSdk, minSdk, and targetSdk in Production
compileSdk, minSdk, and targetSdk are contracts. Why a green CI build still breaks on a newer phone.
-
Android Support Library → AndroidX: What the Old Stack Maps To Today
appcompat-v7 still appears in old modules. How Support Library maps to AndroidX without a cargo-cult migration.
-
Android Sandbox: UID Isolation and the Holes You Open Yourself
UID isolation is not a bug. Which holes apps open themselves with shared UIDs, exports, and world-readable paths.
-
Zombie vs Orphan Processes: What ps Is Actually Showing
Zombie vs orphan look similar in ps and are not. What the kernel is actually telling you.
-
Primitive vs Reference Types: Memory, Boxing, and Kotlin Nulls
Int vs Int? and boxing bugs after R8. What a variable actually holds on Android Kotlin/Java.
-
Stack-Based vs Register-Based VMs: Why Dalvik Chose Registers
Stack and register VMs fake CPUs differently. Why Dalvik chose registers and what that still explains.
-
OpenGL Rendering Pipeline: What Actually Breaks in Practice
Map OpenGL stages to contracts. Localize pose, culling, and fragment bugs instead of guessing at FPS cliffs.
-
tee, Pipe, and Redirection: Watch Output While You Log It
Need a log file and a live view? tee vs pipes vs redirection when long builds hide the stream.
-
Hard Links vs Symbolic Links: Same Inode, Different Contract
Same inode vs path pointer. Why hard links matter for shared trees — and when symlinks break safe mode.
-
Android Architecture Breakdown: Which Layer Owns Your Bug?
App, framework, or Binder? A layer map so you stop fixing Activities for system-service stalls.
-
Linux Filesystem Hierarchy: Where Production Bugs Hide
ENOENT after reboot is often layout, not logic. Where production bugs hide in the FHS tree.
-
Software Testing Methods
Method choice is a budget. Match fuzz, UI, and unit evidence to the failure you actually fear.
-
Interrupt Handling in OP-TEE: IRQ, FIQ, and World Switches
Secure IRQs in the wrong world hang SMCs. IRQ/FIQ and world-switch rules in OP-TEE.
-
White Box, Black Box, and Gray Box Testing
How much you know changes what you find. White, black, and gray box as access models — not buzzwords.
-
Research Methodology: Qualitative vs Quantitative
Pick evidence type before you collect it. Qualitative vs quantitative lessons from building Mimic.
-
Dalvik and ART: What the Runtime Layer Still Explains
ART replaced Dalvik; DEX and per-process VMs remain. What the old runtime layer still explains in traces.
-
Levenshtein Distance: Edit Cost for Typos and Fuzzy Match
One typo should not kill search. Edit distance for fuzzy match — and when exact equality is too strict.
No posts in this category.