非主流工程师的自白
一名 Android 工程师对业务全貌的梳理、面试里的关键词接龙套路,以及「答不上来是状态问题还是知识盲区」这件事。
我是一名 Android 开发工程师,从传统编程时代一路走过来。Java、Kotlin、Android SDK——都是靠以前那套「啃文档、做项目、踩坑」的模式慢慢理解的。
我相信自己对 Android 业务的理解是扎实的。但真要把这份工作拆开来看,会发现它远不只是「写页面、调接口」——下面这 14 块,随便拎一块出来,一整个团队商讨一个下午,都不一定有标准答案。
Android 开发到底在干什么
1. 高质量还原设计稿
UI 不是「差不多就行」,而是像素、间距、动效、暗色模式都要对齐设计部门的预期。
2. 确保产品流程不出异常
从登录到支付,从列表到详情,边界状态、空态、错误态都要兜住——用户路径上不能留死胡同。
3. 架构与数据链路
用 MVP、MVVM、MVI 等模式,把数据流向理清楚:谁生产、谁消费、谁负责状态,避免 Activity 变成上帝类。
4. 性能——这一项最考验人:
- 主线程不能做耗时操作,否则 UI 渲染阻塞、页面卡顿。
- 布局嵌套不能太深(比如 LinearLayout 套娃),否则反复测量拖垮帧率。
- RecyclerView 滑动偶发卡顿、帧率从 60 掉到 30——往 Bitmap 解码、GC 抖动哪个方向查?
- APP 太耗流量、太费电,从哪一层下手优化?
- 别的部门质疑你的修复有没有用——能不能拿出一份说得过去的数据报告?
5. 效能提升
- 多语言翻译:产品给一张 Sheet,字段怎么批量映射到
strings.xml?Python 脚本还是 Gradle 任务? - 同事吐槽 Gradle 编译一次十分钟——构建链路怎么瘦身?
6. 稳定性与线上质量——往往比「功能能不能做」更决定用户留不留:
- 用户反馈闪退,拿到混淆堆栈,怎么还原到真正的出错行?
- ANR 弹窗出现,主线程在等什么——IO、锁,还是 Binder?trace 怎么读?
- Crash 率从 0.1% 飙到 2%,先回滚还是先热修复?依据是什么?
- 灰度只放 5% 用户,指标已经不对——怎么跟产品、测试、运维一起决定停还是继续?
7. 版本兼容与设备碎片化——Android 和 iOS 最大的差异之一:
- minSdk 还卡在 21,新 API 想用——写 if-else 分支,还是上 AndroidX 兼容库?
- Pixel 上正常,华为、小米、OPPO 上表现不一致——厂商 ROM 改了行为,还是测试矩阵没覆盖到?
- 从 Android 10 分区存储到 Android 13 通知权限,每次大版本适配有 checklist 吗,还是发版前临时抱佛脚?
- 折叠屏、平板、横竖屏——多套 layout,还是交给 Compose 自适应?
8. 网络与数据层——用户大量时间在弱网或地铁里:
- 接口超时:无限重试、指数退避,还是直接给「网络不佳」的友好提示?
- 列表要不要本地缓存?Stale-While-Revalidate,还是过期全量刷新?Room 还是 DataStore?
- 后端改了字段名、删了字段,老版本还在跑——Protobuf、JSON 容错、版本协商,你倾向哪种?
- 图片、视频大资源:CDN、预加载、WebP/AVIF,从哪一环省流量?
9. 组件化与工程化——团队从十人涨到五十人,这个问题躲不掉:
- 业务模块怎么解耦?ARouter 还是 Navigation Component?Base 模块会不会变成上帝模块?
- 两个小组同时改同一个 Module,Merge Conflict 天天爆——拆仓库、拆 Module,还是 Monorepo?
- 基础库(网络、图片、埋点)要大版本升级,业务方不配合——怎么推动全量迁移?
- Feature Flag / 动态配置,能不能只对特定用户、特定渠道开功能,而不必发新包?
10. 安全与合规——产品往往不重视,出了事全是你的锅:
- Token、密钥写死在代码里或被反编译扒出来——怎么补救?ProGuard/R8 够吗,要不要加固?
- HTTPS 证书校验被 hook 绕过——Certificate Pinning 值得做吗,代价是什么?
- 隐私政策更新,工信部、各应用商店、Google Play 各一套要求——SDK 清单、权限声明、数据收集说明怎么对齐?
- 剪贴板读手机号、后台定位、自启动——代码层面怎么做开关和审计?
11. 测试与质量门禁——「能跑」和「能上线」之间差一截:
- 核心业务写单元测试吗?ViewModel、Repository 测不测?覆盖率多少算够,还是只看关键路径?
- Espresso / Compose UI Test 跑一遍多久?CI 里每次 PR 全量跑,还是只跑冒烟?
- 发版前回归总漏 bug——加强 Checklist、上自动化,还是接受「线上再修」?
- Mock 接口:MockWebServer 够用,还是要独立测试环境?
12. 技术演进与选型——高级工程师还要会「什么时候不该写」:
- 新项目 UI 用 Compose 还是 XML?Kotlin 熟练度、设计复杂度、招聘难度怎么权衡?
- 协程、Flow、RxJava 三套异步并存——统一收敛,还是「新代码用新的、老代码不动」?
- 引入三方 SDK(推送、统计、支付)——除了看文档,还评估包体积、隐私合规、和现有栈的冲突吗?
- 遗留代码又臭又长没人敢动——大爆炸重写,还是绞杀者模式一点点替换?怎么跟老板解释「这段时间看起来没产出」?
13. 跨端协作与交付——Android 工程师不是孤岛:
- 和后端定接口:REST 还是 GraphQL?分页、错误码、幂等性谁写文档、谁 enforce?
- iOS 已上线,Android 还卡在厂商渠道审核——发版节奏和用户预期怎么对齐?
- Deep Link、App Link、Universal Link——产品给的 H5 链接能不能正确唤起 APP 并落到指定页?
- 设计稿 Figma,标注 Zeplin 还是蓝湖——「像素级还原」的标准一致吗?差几个 dp 算不算 bug?
14. 可观测性与数据驱动——「我觉得优化了」和「数据证明优化了」是两回事:
- 埋点自研还是接 Firebase、神策、GrowingIO?事件命名怎么避免「同一个按钮三个名字」?
- 注册、支付、分享漏斗掉了——是代码 bug、UI 改版,还是外部流量变化?
- 日志分级、本地 ring buffer、线上采样——在「够排查」和「不泄密、不撑爆存储」之间怎么平衡?
- 启动耗时、帧率、内存——手动 Benchmark 测一次,还是接 APM 持续监控?Baseline Profile 用过吗?
问题来了:这些事情要怎么去聊? 更离谱的是,很多人指望在一次短暂的面试里,就从求职者嘴里听到自己想要的「标准答案」。
面试里的关键词接龙
Activity 启动模式
比如你问我:SingleInstance 是怎么运转的?再举一个经典题:
ActivityA 和 ActivityC 是 standard,ActivityB 是 singleInstance。
启动顺序 A → B → C → B,再逐个返回——栈里最后是什么状态?
我脑子会在那一刻宕机,不知道如何作答。
从 HashMap 到 Concurrent
Java 的 HashMap 在 1.7 和 1.8 里,数据结构有哪些变化?
然后再追问:
红黑树可以详细讲讲实现结构吗?再衍生到 AVL 树、深度优先遍历……
这一条链路,大致能判断一个人对所谓底层原理理解到什么程度。
换一条更贴近业务的:
Java 里 ArrayList 能不能在 forEach 的过程中不断 remove 元素?
接龙逻辑大致是这样:
- 如果说可以——用不太冒犯的方式结束这一轮。人物建模:这人确实不知道。
- 如果说不可以——追问为什么,套出
ConcurrentModificationException,再进 Java 并发:- 如果对方整体感觉不差,友善一点就问同步锁:
synchronized、Lock,乐观锁和悲观锁的概念即可。 - 如果面试目的是「捡漏」(一般薪资招高级工程师)或「彰显地位」,可以深入聊锁机制的各种变体。
- 甚至可以问:让你设计 Java 并发框架,能不能比 Doug Lea 更技高一筹?
- 如果对方整体感觉不差,友善一点就问同步锁:
这是很好用的聊天链路。作为上位者,你不需要每个点都真懂——照着准备好的题型往下问就行,主动权在你手上。
类似地,Java 并发可以按关键词接龙:
HashMap → 红黑树 → ConcurrentModificationException → synchronized → AQS → CAS → …
几分钟内就能对一个 Android 工程师做一版简要的人物建模,判断技术能力是否符合预期。
答不上来的时候
可是,人真的有这么厉害吗?说到任何一个关键词,他都能立刻接上来?
你心里会不会觉得,这事有点假?
于是我也给自己一个宽慰:
答不上来那一堆高密度提问的时候,可能是状态不好,是那一瞬间不会——不等于我这个人没有能力掌握那个点。
无法第一时间接上话题,我会当成一种信号:彼此缘分尚浅,一次对话就够了,不必强求后续。
再厉害的人,都可以找到一万种方式把一场对话聊垮。
当然我也清楚:作为面试官,什么样的问题才算合适?
偶尔答不上来是状态问题。连续答不上来,更可能是知识盲区。这是两回事。
边界在哪?比较好的模式是:上位者用引导的方式,让下位者有机会把真正会的东西表述出来——而不是连续抛题,看谁先撑不住。
大部分人没有这样的耐心吧。直接面下一个人,多快。
不过这一切,都是缘分啦。