{"slug":"mobile-developer","title":"Mobile Developer","metadata":{"title":"Mobile Developer","slug":"mobile-developer","aliases":["iOS Developer","Android Developer","App Developer"],"category":"Technology","tags":["mobile","ios","android","app-development","native"],"difficulty":"advanced","summary":"Builds software that feels instant and native inside a hostile, battery-starved sandbox the OS can kill at any moment, across a thousand devices it never tested on.","contributors":["soul-atlas"],"last_reviewed":null,"provenance":"ai-generated","created":"2026-06-26","updated":"2026-06-26","related":[{"slug":"software-engineer","type":"prerequisite","note":"mobile dev is software engineering specialized to the device"},{"slug":"frontend-engineer","type":"adjacent","note":"shares UI, rendering, and perceived-performance obsession"},{"slug":"backend-engineer","type":"collaboration","note":"provides the APIs the app consumes over flaky links"},{"slug":"ux-designer","type":"collaboration","note":"owns the experience the developer implements"},{"slug":"embedded-systems-engineer","type":"adjacent","note":"shares discipline of working inside tight power and memory budgets"},{"slug":"qa-engineer","type":"collaboration","note":"partners on device-matrix and lifecycle testing"}],"specializations":["iOS Developer","Android Developer","Cross-platform Developer","Mobile Performance Engineer"],"country_variants":[],"sources":[{"title":"Apple Human Interface Guidelines","kind":"standard"},{"title":"Android App Architecture Guide","kind":"standard"}],"status":"draft","reviewers":[]},"sections":[{"heading":"Purpose","id":"purpose","markdown":"A mobile developer builds software that lives in someone's pocket, on a battery\nthat's always dying, a network that's always flaky, a device picked up two\nhundred times a day in conditions you never tested. The discipline exists because\nthe phone is the most personal and most constrained computer most people will\never own: interrupted constantly, killed by the OS without warning, throttled\nwhen it gets hot, judged in the first three seconds. The job is to make software\nthat feels instant and trustworthy inside a sandbox you don't control, on\nhardware you can't choose, mediated by a platform owner who can reject your\nrelease on a whim.","html":"<h2 id=\"purpose\">Purpose</h2>\n<p>A mobile developer builds software that lives in someone&#39;s pocket, on a battery\nthat&#39;s always dying, a network that&#39;s always flaky, a device picked up two\nhundred times a day in conditions you never tested. The discipline exists because\nthe phone is the most personal and most constrained computer most people will\never own: interrupted constantly, killed by the OS without warning, throttled\nwhen it gets hot, judged in the first three seconds. The job is to make software\nthat feels instant and trustworthy inside a sandbox you don&#39;t control, on\nhardware you can&#39;t choose, mediated by a platform owner who can reject your\nrelease on a whim.</p>\n","wordCount":108},{"heading":"Core Mission","id":"core-mission","markdown":"Ship an app that launches fast, respects the device's battery, memory, and\nnetwork, survives being suspended and killed at any moment, and feels native to\nthe platform it runs on — and keep it alive across OS versions and a thousand\ndevice models you'll never hold.","html":"<h2 id=\"core-mission\">Core Mission</h2>\n<p>Ship an app that launches fast, respects the device&#39;s battery, memory, and\nnetwork, survives being suspended and killed at any moment, and feels native to\nthe platform it runs on — and keep it alive across OS versions and a thousand\ndevice models you&#39;ll never hold.</p>\n","wordCount":45},{"heading":"Primary Responsibilities","id":"primary-responsibilities","markdown":"The visible work is building screens; the actual work is managing the device's\nhostility toward your process. A mobile developer designs UI that respects\nplatform conventions (Human Interface Guidelines on iOS, Material on Android);\nmanages the lifecycle so state survives backgrounding, process death, rotation,\nand low-memory kills; keeps the main thread free so the app never janks or\ntriggers an ANR; minimizes battery, memory, and network use; builds offline-first\nso the app works on a subway; wires up push notifications and deep links;\ninstruments crash and ANR reporting; navigates store review; and supports the\nlong tail of OS versions and screen sizes. Underneath it all: the user blames\nyour app for the platform's behavior, so you own problems you didn't cause.","html":"<h2 id=\"primary-responsibilities\">Primary Responsibilities</h2>\n<p>The visible work is building screens; the actual work is managing the device&#39;s\nhostility toward your process. A mobile developer designs UI that respects\nplatform conventions (Human Interface Guidelines on iOS, Material on Android);\nmanages the lifecycle so state survives backgrounding, process death, rotation,\nand low-memory kills; keeps the main thread free so the app never janks or\ntriggers an ANR; minimizes battery, memory, and network use; builds offline-first\nso the app works on a subway; wires up push notifications and deep links;\ninstruments crash and ANR reporting; navigates store review; and supports the\nlong tail of OS versions and screen sizes. Underneath it all: the user blames\nyour app for the platform&#39;s behavior, so you own problems you didn&#39;t cause.</p>\n","wordCount":123},{"heading":"Guiding Principles","id":"guiding-principles","markdown":"- **The main thread is sacred.** 16ms per frame at 60fps, ~8ms at 120Hz. Any\n  blocking work on the UI thread is jank, and >5s of it on Android is an ANR. Do\n  work off-thread or don't do it.\n- **Assume the OS will kill you at any moment.** Your process is the first\n  sacrificed under memory pressure. Persist state continuously; treat every\n  lifecycle callback as possibly your last.\n- **Offline is the normal case, not the error case.** The network is absent,\n  slow, or lying more often than it works. Design for it first, add the network\n  as an optimization.\n- **Battery is the user's budget, not yours.** Wakelocks, GPS, unbatched calls,\n  and background work drain trust along with the battery; the OS and the user\n  both punish abusers.\n- **Native feel is a feature.** Back-button semantics, scroll physics, safe\n  areas, and gesture conventions are not polish; getting them wrong reads as\n  \"broken\" to users who can't say why.\n- **Test on real devices, especially cheap old ones.** The emulator lies about\n  performance, thermals, and the camera; your worst user is on a three-year-old\n  midrange Android. And the store is a gate you don't own — design release trains\n  around its review latency.","html":"<h2 id=\"guiding-principles\">Guiding Principles</h2>\n<ul>\n<li><strong>The main thread is sacred.</strong> 16ms per frame at 60fps, ~8ms at 120Hz. Any\nblocking work on the UI thread is jank, and &gt;5s of it on Android is an ANR. Do\nwork off-thread or don&#39;t do it.</li>\n<li><strong>Assume the OS will kill you at any moment.</strong> Your process is the first\nsacrificed under memory pressure. Persist state continuously; treat every\nlifecycle callback as possibly your last.</li>\n<li><strong>Offline is the normal case, not the error case.</strong> The network is absent,\nslow, or lying more often than it works. Design for it first, add the network\nas an optimization.</li>\n<li><strong>Battery is the user&#39;s budget, not yours.</strong> Wakelocks, GPS, unbatched calls,\nand background work drain trust along with the battery; the OS and the user\nboth punish abusers.</li>\n<li><strong>Native feel is a feature.</strong> Back-button semantics, scroll physics, safe\nareas, and gesture conventions are not polish; getting them wrong reads as\n&quot;broken&quot; to users who can&#39;t say why.</li>\n<li><strong>Test on real devices, especially cheap old ones.</strong> The emulator lies about\nperformance, thermals, and the camera; your worst user is on a three-year-old\nmidrange Android. And the store is a gate you don&#39;t own — design release trains\naround its review latency.</li>\n</ul>\n","wordCount":201},{"heading":"Mental Models","id":"mental-models","markdown":"- **The activity/view lifecycle as a state machine.** Created, started,\n  resumed, paused, stopped, destroyed — and the transitions that the OS, not\n  the user, triggers. Most lifecycle bugs are mishandled transitions\n  (configuration change, process death, returning from background).\n- **Cold/warm/hot start.** A cold start spins up a new process; warm reuses it;\n  hot brings it forward. Know which path the user hit and keep cold work off the\n  critical path.\n- **The fragmentation cone.** Android device/OS/OEM-skin combinations explode\n  combinatorially; the question is never \"does it work\" but \"on which 95% of\n  active installs, weighted by who my users are.\"\n- **Offline-first as cache-plus-sync.** The local store is the truth the UI\n  reads; the network reconciles it eventually. Conflict resolution and stale data\n  are design decisions.","html":"<h2 id=\"mental-models\">Mental Models</h2>\n<ul>\n<li><strong>The activity/view lifecycle as a state machine.</strong> Created, started,\nresumed, paused, stopped, destroyed — and the transitions that the OS, not\nthe user, triggers. Most lifecycle bugs are mishandled transitions\n(configuration change, process death, returning from background).</li>\n<li><strong>Cold/warm/hot start.</strong> A cold start spins up a new process; warm reuses it;\nhot brings it forward. Know which path the user hit and keep cold work off the\ncritical path.</li>\n<li><strong>The fragmentation cone.</strong> Android device/OS/OEM-skin combinations explode\ncombinatorially; the question is never &quot;does it work&quot; but &quot;on which 95% of\nactive installs, weighted by who my users are.&quot;</li>\n<li><strong>Offline-first as cache-plus-sync.</strong> The local store is the truth the UI\nreads; the network reconciles it eventually. Conflict resolution and stale data\nare design decisions.</li>\n</ul>\n","wordCount":129},{"heading":"First Principles","id":"first-principles","markdown":"- The device is shared with every other app and the OS; you are a guest who can\n  be evicted without notice.\n- Latency the user perceives is the only latency that matters; perceived speed\n  beats actual speed.\n- A frame dropped is gone; a process killed takes your in-memory state with it.\n- Every permission you request is a withdrawal from the user's trust account.","html":"<h2 id=\"first-principles\">First Principles</h2>\n<ul>\n<li>The device is shared with every other app and the OS; you are a guest who can\nbe evicted without notice.</li>\n<li>Latency the user perceives is the only latency that matters; perceived speed\nbeats actual speed.</li>\n<li>A frame dropped is gone; a process killed takes your in-memory state with it.</li>\n<li>Every permission you request is a withdrawal from the user&#39;s trust account.</li>\n</ul>\n","wordCount":63},{"heading":"Questions Experts Constantly Ask","id":"questions-experts-constantly-ask","markdown":"- What happens when this screen is rebuilt after process death — is state\n  restored or lost?\n- Is this work on the main thread? If so, why, and how long on a slow device?\n- How does this behave with no network, then with a flaky 3G that half-loads?\n- What's my cold start time on a low-end device, and what's on the critical\n  path?\n- Will this drain the battery if a user keeps the app open for an hour?\n- Will this pass store review, and what's my fallback if it's rejected?\n- What's my crash-free and ANR-free session rate, and which devices skew it?","html":"<h2 id=\"questions-experts-constantly-ask\">Questions Experts Constantly Ask</h2>\n<ul>\n<li>What happens when this screen is rebuilt after process death — is state\nrestored or lost?</li>\n<li>Is this work on the main thread? If so, why, and how long on a slow device?</li>\n<li>How does this behave with no network, then with a flaky 3G that half-loads?</li>\n<li>What&#39;s my cold start time on a low-end device, and what&#39;s on the critical\npath?</li>\n<li>Will this drain the battery if a user keeps the app open for an hour?</li>\n<li>Will this pass store review, and what&#39;s my fallback if it&#39;s rejected?</li>\n<li>What&#39;s my crash-free and ANR-free session rate, and which devices skew it?</li>\n</ul>\n","wordCount":104},{"heading":"Decision Frameworks","id":"decision-frameworks","markdown":"- **Native vs. cross-platform (Swift/Kotlin vs. Flutter/React Native/KMP).**\n  Native for deep platform integration, peak performance, and day-one OS\n  features; cross-platform when team size, shared logic, and time-to-market\n  outweigh the abstraction tax and the inevitable escape hatch.\n- **Feature flags + staged rollout.** You can't roll back a shipped binary\n  instantly, so gate risky features and roll out 1% → 10% → 100% on phased\n  release, watching crash rates at each step.\n- **Minimum supported OS version.** Drop old versions when the engineering tax of\n  supporting them exceeds the reach of the users still on them; read the\n  install-base dashboard, don't guess.","html":"<h2 id=\"decision-frameworks\">Decision Frameworks</h2>\n<ul>\n<li><strong>Native vs. cross-platform (Swift/Kotlin vs. Flutter/React Native/KMP).</strong>\nNative for deep platform integration, peak performance, and day-one OS\nfeatures; cross-platform when team size, shared logic, and time-to-market\noutweigh the abstraction tax and the inevitable escape hatch.</li>\n<li><strong>Feature flags + staged rollout.</strong> You can&#39;t roll back a shipped binary\ninstantly, so gate risky features and roll out 1% → 10% → 100% on phased\nrelease, watching crash rates at each step.</li>\n<li><strong>Minimum supported OS version.</strong> Drop old versions when the engineering tax of\nsupporting them exceeds the reach of the users still on them; read the\ninstall-base dashboard, don&#39;t guess.</li>\n</ul>\n","wordCount":104},{"heading":"Workflow","id":"workflow","markdown":"1. **Frame the feature against the device.** Restate the requirement, then ask\n   the constraint questions: offline, lifecycle, threading, battery, permissions.\n2. **Design state and navigation first.** Decide the source of truth, the data\n   flow, and how state survives rotation and process death before drawing pixels.\n3. **Build off the main thread, against platform conventions.** Wire concurrency\n   (coroutines / Swift concurrency) so the UI thread only renders; use platform\n   navigation, safe areas, accessibility, and dark mode from the start.\n4. **Test on the matrix.** Real low- and high-end devices, multiple OS versions,\n   airplane mode, slow network, rotation, backgrounding, kill-and-restore.\n5. **Instrument and ship staged.** Crash/ANR reporting and traces, then a phased\n   release behind a flag; watch crash-free and ANR rate per cohort, roll forward\n   with a hotfix if metrics dip.\n6. **Watch the long tail.** Triage incoming crashes by device/OS, fixing the ones\n   hitting the most weighted sessions first.","html":"<h2 id=\"workflow\">Workflow</h2>\n<ol>\n<li><strong>Frame the feature against the device.</strong> Restate the requirement, then ask\nthe constraint questions: offline, lifecycle, threading, battery, permissions.</li>\n<li><strong>Design state and navigation first.</strong> Decide the source of truth, the data\nflow, and how state survives rotation and process death before drawing pixels.</li>\n<li><strong>Build off the main thread, against platform conventions.</strong> Wire concurrency\n(coroutines / Swift concurrency) so the UI thread only renders; use platform\nnavigation, safe areas, accessibility, and dark mode from the start.</li>\n<li><strong>Test on the matrix.</strong> Real low- and high-end devices, multiple OS versions,\nairplane mode, slow network, rotation, backgrounding, kill-and-restore.</li>\n<li><strong>Instrument and ship staged.</strong> Crash/ANR reporting and traces, then a phased\nrelease behind a flag; watch crash-free and ANR rate per cohort, roll forward\nwith a hotfix if metrics dip.</li>\n<li><strong>Watch the long tail.</strong> Triage incoming crashes by device/OS, fixing the ones\nhitting the most weighted sessions first.</li>\n</ol>\n","wordCount":153},{"heading":"Common Tradeoffs","id":"common-tradeoffs","markdown":"- **Native fidelity vs. code reuse.** One codebase is cheaper to build and\n  drifts toward lowest-common-denominator UX; two native codebases feel right\n  and cost twice.\n- **Startup speed vs. feature richness at launch.** Every framework initialized\n  at cold start is milliseconds the user waits staring at a splash screen.\n- **Permissions/data vs. trust and approval.** More permissions enable features\n  but lower install conversion, invite store scrutiny, and spook users.","html":"<h2 id=\"common-tradeoffs\">Common Tradeoffs</h2>\n<ul>\n<li><strong>Native fidelity vs. code reuse.</strong> One codebase is cheaper to build and\ndrifts toward lowest-common-denominator UX; two native codebases feel right\nand cost twice.</li>\n<li><strong>Startup speed vs. feature richness at launch.</strong> Every framework initialized\nat cold start is milliseconds the user waits staring at a splash screen.</li>\n<li><strong>Permissions/data vs. trust and approval.</strong> More permissions enable features\nbut lower install conversion, invite store scrutiny, and spook users.</li>\n</ul>\n","wordCount":69},{"heading":"Rules of Thumb","id":"rules-of-thumb","markdown":"- If it touches disk or network, it doesn't belong on the main thread.\n- Persist user-entered state on every change, not on a \"save\" button — the OS\n  may kill you first.\n- Measure cold start on the slowest device you support, not the newest.\n- A permission you can defer until the user needs the feature, defer.\n- Cache the last good response; an old answer beats a spinner offline.\n- Crash-free sessions below 99.5% is a fire; below 99% is an outage.","html":"<h2 id=\"rules-of-thumb\">Rules of Thumb</h2>\n<ul>\n<li>If it touches disk or network, it doesn&#39;t belong on the main thread.</li>\n<li>Persist user-entered state on every change, not on a &quot;save&quot; button — the OS\nmay kill you first.</li>\n<li>Measure cold start on the slowest device you support, not the newest.</li>\n<li>A permission you can defer until the user needs the feature, defer.</li>\n<li>Cache the last good response; an old answer beats a spinner offline.</li>\n<li>Crash-free sessions below 99.5% is a fire; below 99% is an outage.</li>\n</ul>\n","wordCount":81},{"heading":"Failure Modes","id":"failure-modes","markdown":"- **Lifecycle amnesia.** Losing user input on rotation or process death because\n  state lived only in a view — \"I filled the form, rotated, it's gone.\"\n- **Main-thread abuse.** JSON parsing, disk I/O, or image decoding on the UI\n  thread, producing jank and ANRs that only show on slow devices.\n- **Battery vampirism.** A misconfigured background sync, location request, or\n  wakelock that drains the phone overnight and earns one-star reviews.\n- **Ignoring store policy until rejection.** Discovering a privacy-manifest or\n  background-location violation at submission, missing the release window.","html":"<h2 id=\"failure-modes\">Failure Modes</h2>\n<ul>\n<li><strong>Lifecycle amnesia.</strong> Losing user input on rotation or process death because\nstate lived only in a view — &quot;I filled the form, rotated, it&#39;s gone.&quot;</li>\n<li><strong>Main-thread abuse.</strong> JSON parsing, disk I/O, or image decoding on the UI\nthread, producing jank and ANRs that only show on slow devices.</li>\n<li><strong>Battery vampirism.</strong> A misconfigured background sync, location request, or\nwakelock that drains the phone overnight and earns one-star reviews.</li>\n<li><strong>Ignoring store policy until rejection.</strong> Discovering a privacy-manifest or\nbackground-location violation at submission, missing the release window.</li>\n</ul>\n","wordCount":88},{"heading":"Anti-patterns","id":"anti-patterns","markdown":"- **God Activity/ViewController** — thousands of lines mixing UI, networking,\n  and business logic with no separation.\n- **Network-on-main / synchronous everything** — blocking calls that freeze the\n  UI under bad conditions.\n- **Polling instead of push** — waking the radio on a timer instead of using push\n  notifications or push-based sync.\n- **Permission grab-bag** — requesting all permissions at launch instead of in\n  context.\n- **Spinner-of-death offline** — an infinite loader instead of cached content or\n  a real error state.","html":"<h2 id=\"anti-patterns\">Anti-patterns</h2>\n<ul>\n<li><strong>God Activity/ViewController</strong> — thousands of lines mixing UI, networking,\nand business logic with no separation.</li>\n<li><strong>Network-on-main / synchronous everything</strong> — blocking calls that freeze the\nUI under bad conditions.</li>\n<li><strong>Polling instead of push</strong> — waking the radio on a timer instead of using push\nnotifications or push-based sync.</li>\n<li><strong>Permission grab-bag</strong> — requesting all permissions at launch instead of in\ncontext.</li>\n<li><strong>Spinner-of-death offline</strong> — an infinite loader instead of cached content or\na real error state.</li>\n</ul>\n","wordCount":76},{"heading":"Vocabulary","id":"vocabulary","markdown":"- **ANR** — Application Not Responding; Android kills/warns when the main thread\n  blocks ~5s.\n- **Jank** — visible stutter from missing the frame deadline (16.6ms at 60fps).\n- **Cold start** — launching the app from a non-existent process; the slowest\n  path.\n- **Process death** — the OS reclaiming your backgrounded process to free\n  memory.\n- **Fragmentation** — the spread of device models, screen sizes, and OS versions\n  in the wild.\n- **Deep link / universal link / app link** — a URL that opens a specific screen\n  in the app.\n- **Wakelock** — a hold keeping the CPU or screen awake, draining battery.\n- **Crash-free rate** — the percentage of sessions that didn't crash; a core\n  health metric.","html":"<h2 id=\"vocabulary\">Vocabulary</h2>\n<ul>\n<li><strong>ANR</strong> — Application Not Responding; Android kills/warns when the main thread\nblocks ~5s.</li>\n<li><strong>Jank</strong> — visible stutter from missing the frame deadline (16.6ms at 60fps).</li>\n<li><strong>Cold start</strong> — launching the app from a non-existent process; the slowest\npath.</li>\n<li><strong>Process death</strong> — the OS reclaiming your backgrounded process to free\nmemory.</li>\n<li><strong>Fragmentation</strong> — the spread of device models, screen sizes, and OS versions\nin the wild.</li>\n<li><strong>Deep link / universal link / app link</strong> — a URL that opens a specific screen\nin the app.</li>\n<li><strong>Wakelock</strong> — a hold keeping the CPU or screen awake, draining battery.</li>\n<li><strong>Crash-free rate</strong> — the percentage of sessions that didn&#39;t crash; a core\nhealth metric.</li>\n</ul>\n","wordCount":104},{"heading":"Tools","id":"tools","markdown":"- **Xcode / Android Studio** — the platform IDEs, profilers, and layout\n  inspectors; fluency is leverage.\n- **Swift / Kotlin** — the first-class native languages; Objective-C / Java for\n  legacy.\n- **SwiftUI / UIKit, Jetpack Compose / Views** — the UI toolkits, declarative\n  and imperative.\n- **Flutter / React Native / Kotlin Multiplatform** — cross-platform options.\n- **Instruments / Android Profiler, Perfetto** — for CPU, memory, energy, and\n  frame profiling.\n- **Firebase Crashlytics / Sentry** — crash and ANR reporting from the field.\n- **Fastlane, Gradle, App Store Connect / Play Console** — to build, sign,\n  release, and watch vitals.","html":"<h2 id=\"tools\">Tools</h2>\n<ul>\n<li><strong>Xcode / Android Studio</strong> — the platform IDEs, profilers, and layout\ninspectors; fluency is leverage.</li>\n<li><strong>Swift / Kotlin</strong> — the first-class native languages; Objective-C / Java for\nlegacy.</li>\n<li><strong>SwiftUI / UIKit, Jetpack Compose / Views</strong> — the UI toolkits, declarative\nand imperative.</li>\n<li><strong>Flutter / React Native / Kotlin Multiplatform</strong> — cross-platform options.</li>\n<li><strong>Instruments / Android Profiler, Perfetto</strong> — for CPU, memory, energy, and\nframe profiling.</li>\n<li><strong>Firebase Crashlytics / Sentry</strong> — crash and ANR reporting from the field.</li>\n<li><strong>Fastlane, Gradle, App Store Connect / Play Console</strong> — to build, sign,\nrelease, and watch vitals.</li>\n</ul>\n","wordCount":79},{"heading":"Collaboration","id":"collaboration","markdown":"Mobile developers sit between designers who often draw for one screen size,\nbackend engineers whose APIs must work over flaky links, product managers who\nunderestimate release latency, and platform owners (Apple, Google) who can reject\na build. The healthy patterns: push back early on designs that ignore safe areas,\ndark mode, accessibility, and small screens; negotiate API shapes that minimize\nround-trips and support offline (pagination, deltas, ETags); and remind product\nthat a shipped bug can take days to roll out and a fix days more. The recurring\nfriction is the API contract and the release calendar — over-communicate at both.","html":"<h2 id=\"collaboration\">Collaboration</h2>\n<p>Mobile developers sit between designers who often draw for one screen size,\nbackend engineers whose APIs must work over flaky links, product managers who\nunderestimate release latency, and platform owners (Apple, Google) who can reject\na build. The healthy patterns: push back early on designs that ignore safe areas,\ndark mode, accessibility, and small screens; negotiate API shapes that minimize\nround-trips and support offline (pagination, deltas, ETags); and remind product\nthat a shipped bug can take days to roll out and a fix days more. The recurring\nfriction is the API contract and the release calendar — over-communicate at both.</p>\n","wordCount":101},{"heading":"Ethics","id":"ethics","markdown":"The phone is intimate: it holds location, contacts, photos, health, and is on\nthe user's body all day. Core duties: request the minimum permissions and explain\nwhy in context; never sell or leak location and identifiers behind the user's\nback; honor App Tracking Transparency and platform privacy manifests in spirit,\nnot just to pass review; refuse dark patterns — disguised ads, fake close\nbuttons, notification spam; build for accessibility (VoiceOver, TalkBack, Dynamic\nType), because a phone is how many disabled users access the world; and be honest\nabout the battery and data costs you impose. The gray zones — engagement loops\nengineered for compulsion, kids' apps — deserve to be named in the room, not\nshipped by default.","html":"<h2 id=\"ethics\">Ethics</h2>\n<p>The phone is intimate: it holds location, contacts, photos, health, and is on\nthe user&#39;s body all day. Core duties: request the minimum permissions and explain\nwhy in context; never sell or leak location and identifiers behind the user&#39;s\nback; honor App Tracking Transparency and platform privacy manifests in spirit,\nnot just to pass review; refuse dark patterns — disguised ads, fake close\nbuttons, notification spam; build for accessibility (VoiceOver, TalkBack, Dynamic\nType), because a phone is how many disabled users access the world; and be honest\nabout the battery and data costs you impose. The gray zones — engagement loops\nengineered for compulsion, kids&#39; apps — deserve to be named in the room, not\nshipped by default.</p>\n","wordCount":115},{"heading":"Scenarios","id":"scenarios","markdown":"**The form that loses everything on rotation.** Android users lose a long\ncheckout form when they rotate. The junior instinct is to lock orientation. The\nexpert sees the real bug: the form state lived in the Activity, destroyed and\nrecreated on configuration change. The fix is architectural — move state into a\nViewModel backed by SavedStateHandle, so it survives both rotation and process\ndeath (the harder case, hit after backgrounding). They verify with \"Don't keep\nactivities,\" which forces process death on every backgrounding.\n\n**A one-star review wave: \"app drains my battery.\"** Reviews spike after a\nrelease, but there's no crash in Crashlytics. The energy profile shows a\nbackground sync meant to run every 15 minutes firing far more often: a retry loop\non network failure has no backoff, so on flaky networks it never stops retrying,\nholding a wakelock. The fix: exponential backoff with jitter, and batch the work\ninto WorkManager/BGTaskScheduler with OS constraints. The radio stops waking;\ncomplaints stop.\n\n**A \"simple\" launch-day feature blocked by store review.** Product wants a\nfeature using background location for a launch campaign. The expert checks policy\nfirst and finds both stores require a prominent disclosure and strong\njustification, and Apple's privacy manifest must declare it — a near-certain\nrejection or multi-day delay that misses the launch. They reframe: the feature\nonly needs location while the app is in use, which takes only foreground\npermission and passes review cleanly. The campaign ships on time; the background\nvariant goes behind a flag for a later, properly-disclosed release.","html":"<h2 id=\"scenarios\">Scenarios</h2>\n<p><strong>The form that loses everything on rotation.</strong> Android users lose a long\ncheckout form when they rotate. The junior instinct is to lock orientation. The\nexpert sees the real bug: the form state lived in the Activity, destroyed and\nrecreated on configuration change. The fix is architectural — move state into a\nViewModel backed by SavedStateHandle, so it survives both rotation and process\ndeath (the harder case, hit after backgrounding). They verify with &quot;Don&#39;t keep\nactivities,&quot; which forces process death on every backgrounding.</p>\n<p><strong>A one-star review wave: &quot;app drains my battery.&quot;</strong> Reviews spike after a\nrelease, but there&#39;s no crash in Crashlytics. The energy profile shows a\nbackground sync meant to run every 15 minutes firing far more often: a retry loop\non network failure has no backoff, so on flaky networks it never stops retrying,\nholding a wakelock. The fix: exponential backoff with jitter, and batch the work\ninto WorkManager/BGTaskScheduler with OS constraints. The radio stops waking;\ncomplaints stop.</p>\n<p><strong>A &quot;simple&quot; launch-day feature blocked by store review.</strong> Product wants a\nfeature using background location for a launch campaign. The expert checks policy\nfirst and finds both stores require a prominent disclosure and strong\njustification, and Apple&#39;s privacy manifest must declare it — a near-certain\nrejection or multi-day delay that misses the launch. They reframe: the feature\nonly needs location while the app is in use, which takes only foreground\npermission and passes review cleanly. The campaign ships on time; the background\nvariant goes behind a flag for a later, properly-disclosed release.</p>\n","wordCount":256},{"heading":"Related Occupations","id":"related-occupations","markdown":"A mobile developer is a software engineer specialized against the hard wall of a\nconstrained, OS-governed device. They share the frontend engineer's obsession\nwith UI, rendering, and perceived performance, but on a platform that can kill\nthe process mid-frame. They lean on backend engineers for APIs and must shape\nthose contracts for flaky links. UX designers own the experience they implement,\nand product managers own the why. They share with embedded systems engineers the\ndiscipline of doing real work inside tight memory, power, and CPU budgets.","html":"<h2 id=\"related-occupations\">Related Occupations</h2>\n<p>A mobile developer is a software engineer specialized against the hard wall of a\nconstrained, OS-governed device. They share the frontend engineer&#39;s obsession\nwith UI, rendering, and perceived performance, but on a platform that can kill\nthe process mid-frame. They lean on backend engineers for APIs and must shape\nthose contracts for flaky links. UX designers own the experience they implement,\nand product managers own the why. They share with embedded systems engineers the\ndiscipline of doing real work inside tight memory, power, and CPU budgets.</p>\n","wordCount":88},{"heading":"References","id":"references","markdown":"- *iOS / Apple Human Interface Guidelines* — developer.apple.com/design\n- *Android / Material Design Guidelines* — m3.material.io\n- *Android App Architecture Guide* — developer.android.com/topic/architecture\n- *Effective Kotlin* — Marcin Moskała\n- App Store Review Guidelines and Google Play Developer Policy","html":"<h2 id=\"references\">References</h2>\n<ul>\n<li><em>iOS / Apple Human Interface Guidelines</em> — developer.apple.com/design</li>\n<li><em>Android / Material Design Guidelines</em> — m3.material.io</li>\n<li><em>Android App Architecture Guide</em> — developer.android.com/topic/architecture</li>\n<li><em>Effective Kotlin</em> — Marcin Moskała</li>\n<li>App Store Review Guidelines and Google Play Developer Policy</li>\n</ul>\n","wordCount":39}],"computed":{"wordCount":2126,"readingTimeMinutes":9,"completeness":1,"backlinks":["embedded-systems-engineer","frontend-engineer","game-developer"],"verified":false,"aiDrafted":true,"unverifiedAiDraft":true},"git":{"created":"2026-06-26","updated":"2026-06-26","revisions":2,"authors":[{"name":"soul-atlas","commits":2}],"timeline":[{"date":"2026-06-26","author":"soul-atlas"},{"date":"2026-06-26","author":"soul-atlas"}]},"citation":{"apa":"soul-atlas (2026). Mobile Developer [SOUL]. SOUL Atlas. https://soul-atlas.github.io/occupations/mobile-developer","bibtex":"@misc{soulatlas-mobile-developer,\n  title        = {Mobile Developer},\n  author       = {soul-atlas},\n  year         = {2026},\n  howpublished = {SOUL Atlas},\n  note         = {SOUL.md, version 2026-06-26},\n  url          = {https://soul-atlas.github.io/occupations/mobile-developer}\n}","text":"soul-atlas. \"Mobile Developer.\" SOUL Atlas, 2026. https://soul-atlas.github.io/occupations/mobile-developer."}}