My Profile Photo

Chang Min Park


Senior Software Engineer at Yahoo!




Writing

  1. 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.


  2. 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.


  3. 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.


  4. 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.


  5. 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.


  6. 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.


  7. 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.


  8. "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.


  9. 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.


  10. 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.


  11. 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.


  12. 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.


  13. 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.


  14. 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.


  15. 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.


  16. 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.


  17. 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.


  18. 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.


  19. 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.


  20. 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.


  21. 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.


  22. Cache Invalidation from CDN to Room

    Avatar updated; every layer still shows yesterday. Walk CDN → API → OkHttp → Room before you “fix” Compose.


  23. 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.


  24. 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.


  25. 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.


  26. 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.


  27. 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.


  28. A Hot Mailbox Melts the Shard

    One celebrity inbox can melt a shard. Client refresh discipline and cache-aside as the first shield.


  29. 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.


  30. 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.


  31. Feature Flags on Mobile: Kill Switch, Rollout, Experiment

    Kill switch, rollout, and experiment are three jobs. Stop muddying them into one boolean on mobile.


  32. 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é.


  33. One Telemetry Story Across Client and Server

    Three dashboards disagree while users say it is broken. One telemetry story across phone and backend.


  34. 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.


  35. 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.


  36. Multi-Region Reality for Mobile Users

    The phone moved; the control plane did not. Region affinity, latency, and what mobile users actually feel.


  37. 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.


  38. 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.


  39. 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.


  40. 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.


  41. Memoization: Cache the Result, Not the Algorithm

    Same inputs, same answer — stop recomputing on every scroll frame. Memoization as production caching, not interview DP.


  42. 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.


  43. 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.


  44. 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.


  45. 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.


  46. 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.


  47. 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.


  48. 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.


  49. 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.


  50. 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.


  51. 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.


  52. 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.


  53. 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.


  54. 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.


  55. 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.


  56. Android Architecture Breakdown: Which Layer Owns Your Bug?

    App, framework, or Binder? A layer map so you stop fixing Activities for system-service stalls.


  57. Linux Filesystem Hierarchy: Where Production Bugs Hide

    ENOENT after reboot is often layout, not logic. Where production bugs hide in the FHS tree.


  58. Software Testing Methods

    Method choice is a budget. Match fuzz, UI, and unit evidence to the failure you actually fear.


  59. 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.


  60. 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.


  61. Research Methodology: Qualitative vs Quantitative

    Pick evidence type before you collect it. Qualitative vs quantitative lessons from building Mimic.


  62. 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.


  63. 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.