前一段时间,我看到一篇开发者访谈。主角不是大厂工程师,也不是做明星应用的人。他只是受不了手机自带计时器的操作逻辑,于是决定在鸿蒙系统上给自己写一个原生计时器 APP。但事情没有想象中顺利,他前后失败两次:第一次卡在开发环境与调试链路,第二次把功能想得太大,差点让整个项目烂尾。听到这里,我第一反应不是“鸿蒙开发门槛高”,而是他终于踩中了个人原生开发最常见的两个陷阱:一是误以为会写界面就等于会做应用,二是误以为把功能堆得越多,就越接近一个合格工具。这篇访谈真正值得被记录的,不是最后怎么把代码调通,而是两次失败背后,一个普通开发者如何重新理解原生应用开发这件事。
1. 为什么“受不了自带计时器”是一个合格的原生开发起点
1.1 自带计时器到底哪里让人难受
很多人会低估这类抱怨的价值。手机自带计时器难道不能倒计时吗?能,但它解决的是“最基础的时间提醒”,不是“一个人在具体工作流里的时间管理”。
访谈里那位开发者的使用场景其实很普通:他会用番茄钟,会同时开好几个任务阶段,需要在暂停和继续之间看清楚自己已经用了多少时间,也想知道某个固定时长倒计时结束后,下一步该切到哪一组。传统计时器的问题不是“不能计时”,而是每换一个时间就要重新点按多次,预设短时间不够灵活,显示信息又太有限。
这种痛点听起来不高级,但它足够具体。具体到你能直接说出“我到底在哪个环节多花了三秒”,具体到你能设计出“默认预设四个常用时长,首屏一键开始”这种极简需求。一个真正被使用过的需求,往往比十个拍脑袋想出来的功能更有可能变成可落地产品。
1.2 “小工具”同样要面对完整原生工程
可问题就在这里:需求很小,不代表工程很小。
用户看到的只是一个倒计时界面,开发者要面对的却是完整原生工程链路。从开发工具、SDK 版本、项目结构,到应用签名、真机安装、后台运行策略,任何一个环节断了,UI 写得再漂亮,HAP 也装不到手机上。
一位刚从 Web 或跨端开发转过来的同学,最容易在这里误判。写网页时,浏览器帮你屏蔽了大部分环境差异;写小程序时,平台也帮你处理了大部分审核和签名机制。但原生开发更像自己开一家店,从选址、进货、装修到办证,你都绕不开。第一次失败的人,通常不是倒在核心逻辑上,而是倒在这些看起来“与业务无关”的前置条件上。
1.3 最容易忽略的信号是“我以为”
如果复盘这次访谈,最值得记住的不是某个报错信息,而是一句“我以为”。
“我以为装好开发工具就能跑模拟器了。” “我以为真机运行只要连上 USB 就能安装。” “我以为后台放到几分钟甚至几十分钟,应该也能继续执行。”
这三个“我以为”,几乎概括了原生开发新手的第一道墙:对环境、系统和发布链路没有建立完整的心理模型。会写代码不等于会做软件,会做功能也不等于能交付一个 App。对个人开发者来说,这些认知差距会在第一次踩坑时被迅速放大,因为身边没有团队帮你补位,也没有基建平台帮你抹平。
2. 第一次失败:开发环境、签名、模拟器,原生开发的入场费比教程里写的贵
2.1 第一步不是写代码,而是把环境当成一个项目来对待
访谈里没有夸张地说“配置环境花了一周”,但从他的描述里能看出来,第一次失败的时间大量消耗在工程准备阶段。
开发者最开始下载的是最新版开发工具,然后根据教程创建了一个默认工程。问题出现在几个环节:SDK 组件没有装完整;工程默认 API 版本和本机工具链版本不完全匹配;模拟器又因为硬件或镜像原因始终无法启动。他一开始以为是自己电脑配置不够,后来又怀疑是安装包损坏,最后才发现多个版本混用造成的兼容问题。
这给我一个很强烈的经验:鸿蒙开发入门,真正要学的第一课不是语言语法,而是版本匹配意识。
不同版本的开发工具、SDK、模拟器镜像和真机系统之间,兼容情况可能不一样。教程里写的路径,换一个版本就可能对不上。新版工具默认创建出来的工程结构,可能和旧教程完全不一致。这时候如果你照着旧文章硬套,就会陷入“别人都行,为什么我这里不行”的泥潭。
所以我会建议一条保守路线:
- 先确认设备系统版本。
- 再选择与设备匹配的 SDK 或 API 版本。
- 然后安装与当前电脑系统匹配的开发工具。
- 最后用官方默认模板创建工程,先不改任何代码,直接跑一次空页面。
把“空工程能跑”当成第一个里程碑。不要跳过去直接写计时器逻辑。
2.2 模拟器不等于真机,尤其当你的应用涉及后台计时
开发者在第一次失败里还碰到了另一个很典型的问题:模拟器始终启不来,即使后来能启动了,运行体验也非常迟钝。于是他跳过模拟器,尝试真机调试,结果又卡在设备连接和签名配置上。
这里有一条非常明确的原则:模拟器适合验证界面布局和基本交互,不适合替代真机做所有判断。尤其是计时器这种涉及前后台切换、系统资源调度和通知提醒的应用,模拟器里的表现和真机上的表现可能差异很大。
模拟器环境通常不会完整复刻真机的省电策略、后台进程管理、通知服务功耗控制等行为。你在模拟器里把一个倒计时放在后台,过了十分钟切回来发现还在走,真机上未必如此。系统可能为了省电把你的页面挂起,也可能推迟你的任务调度,甚至清理掉后台进程。
与其一开始就纠结模拟器为什么卡顿,不如尽快进入“用真机验证最小功能”的状态。第一次失败的人,往往是在环境准备阶段花了太长时间,却迟迟没有让应用出现在真实设备上。开发者的核心循环应该是:改代码、装到真机上、看现象、再改。环境准备不能拖到这个循环之外无限延长。
2.3 这张表可以帮助你快速定位环境问题
如果你是第一次做鸿蒙原生开发,可以先按这个顺序排查:
| 阶段 | 要确认的点 | 失败后从哪里看 |
|---|---|---|
| 工具安装 | 开发工具版本与系统版本是否匹配,SDK 组件是否完整 | 开发工具里的 SDK Manager |
| 工程创建 | 空工程能否正常编译,默认模板是否能运行 | 首次构建日志 |
| 模拟器 | 镜像版本、电脑虚拟化能力、模拟器日志 | 设备管理器中的运行日志 |
| 真机连接 | 是否开启开发者调试选项,是否安装对应驱动,是否被电脑识别 | 命令行hdc list targets |
| 签名配置 | 是否配置调试证书,是否能自动签名 | 工程设置里的签名与项目配置 |
| 安装运行 | HAP 是否生成,设备是否授权安装,空间是否充足 | 安装日志与设备端提示 |
当多个变量同时不确定时,不要同时修改多个配置。一次只动一个变量,确认结果稳定后再改下一个。
2.4 第一次失败的根因不是“不懂鸿蒙”,而是没有跑通最小闭环
开发者的第一次失败,最终落在了一个非常朴素的问题上:他花了很多时间研究“如何把一个功能做好看”,却没有先确认“我能不能把一个空页面装到手机上”。
如果你连一个空的 HAP 都无法在真机上启动,那后面写的倒计时逻辑、UI 动画、数据存储都没有物理载体。再漂亮的代码,无法触达用户设备时,价值就是零。
这件事的本质是软件开发里的“最小闭环”概念。不要先写完整功能再一次性测试,而是先搭一条最窄但完整的通路:源码编译、打包、签名、安装、启动、热更新或重装调试。任何一次代码改动,都能在几十秒内跑到真机上观察结果,这才算进入可迭代状态。
很多原生开发新手没有意识到,这条通路本身就是工程的一部分。第一次失败的人,通常把时间花在了“更完整功能”的幻想里,而没有把“更短的反馈回路”当成真正的效率杠杆。
3. 第二次失败:功能“更大”不等于“更完整”
3.1 从“计时器”扩张成“计时器+记录+同步”
如果他第一次失败后就此放弃,故事到这里就只是环境踩坑。但访谈里的开发者没有停在这里,他换上了一种更熟悉的心态:既然重来一次,那就做得更完整一点。
于是需求开始膨胀。他不再只想做一个倒计时,而是想在计时结束后保存每一次专注记录,想按日期查看历史,想在另一个设备上看到同一份记录,甚至想为不同任务设置不同颜色和标签。听起来每一项都合理,每一点都紧跟“用户需要”。
但这里隐藏着一个致命问题:这些需求本来就有天然的优先级差异。计时是高频核心操作,数据记录是中频需求,跨设备同步则是基础设施级需求。把基础设施级需求塞进第一个可用版本里,等于把一栋楼的地基和装修放在同一天完成。
访谈者后来说,第二阶段最疲惫的不是不会写代码,而是每次刚想专注做一个功能,就发现前置依赖还没有完成。想保存记录,需要先设计数据结构;想显示历史列表,需要先决定读取时机;想跨设备同步,需要先考虑账号体系和网络异常;账号体系又会拉出隐私、登录、状态保持、离线处理这一连串问题。
到这一步,项目已经不是“加一个功能”的问题,而是“重新造一个系统”的问题。一个个人开发者靠业余时间想把这件事做完,复杂度会指数级上升。
3.2 核心功能不稳固,后端扩展只会放大问题
在复盘第二次失败时,我特别关注到他发现了计时器后台更新的问题:页面一旦退到后台,定时器的行为开始变得不可靠。这比环境问题更接近产品内核。
计时器这个需求,天然绕不开“应用在后台运行还能不能准时提醒”这个问题。用户不可能一直盯着页面看,他一定会切出去回复消息、看文档、接电话。如果页面被系统挂起后定时器停摆,那这个计时器的核心价值就崩塌了。
要解决它,不能只依赖 JavaScript 或 ArkTS 里的普通定时器。更稳妥的设计套路是:不要靠“定时器一直跳动”来计算剩余时间,而是记住一个目标结束时间,在页面回到前台或系统再次调度时,用当前时间减目标时间,重新算出“到底还剩多久”。UI 的刷新频率是次要问题,真正的时间基准应该是时间戳,而不是某个setInterval回调被调用了多少次。
// 示意:用目标结束时间作为时间基准,而不是依赖定时器每秒触发 function getRemainMillis(targetTimeMillis: number): number { const remain = targetTimeMillis - Date.now() return remain > 0 ? remain : 0 }先把这个逻辑想清楚,再去考虑要不要给应用增加后台长任务、闹钟提醒、通知栏常驻提醒等系统能力。很多人的误区是先写一个看似正确的界面逻辑,最后发现后台一切换就翻车。计时工具真正的难点不在“怎么显示秒数”,而是在各种不可预知的前后台切换里,如何保证用户看到的时间是准确且可信的。
3.3 项目失控的根本原因,是没有一条“验收线”
实际开发里,功能蔓延比语法报错更可怕。因为你无法编译期发现一个需求已经超载,也无法通过运行日志提示你“这个版本已经失去意义”。
第二次失败的项目里,界面代码已经写了不少,历史记录的数据结构也做了多次调整,但计时器本身连“从后台切回来还能继续准确显示”都没有被真正验证过。他每写一个功能,都会发现旧代码需要调整;每次调整,又担心影响另一个功能。到最后,他发现自己陷入了一个没有底层的自定义框架里,总是在反复修改,却没有一个版本能让身边的人正常用三天。
这不是动力问题,而是缺少一条“验收线”。你觉得哪个功能做完了?用户能以多快的速度完成一次完整计时?这个版本可以离开开发环境独立跑多久?如果这些问题答不上来,就说明项目还停在“功能碎片”阶段,没有被收拢成一个可用产品。
很多成功的小工具,并不是因为功能特别全,而是因为它在自己承诺的范围内可靠。一个不能准时的计时器、有时会丢记录、同步又不稳定的软件,就算功能再多,也只会带来更多不确定性。真正建立信任的方式,是先把最核心的场景做到稳定,再考虑扩展。
4. 为什么原生开发本质上是在跟系统写契约
4.1 生命周期:页面不是你想活多久,就活多久
经历了两次失败,他终于明白了一个更底层的道理:原生应用开发不是只跟自己的代码打交道,而是在跟整个系统写契约。
系统会决定你的页面何时创建、何时退到后台、何时被销毁。页面可见时,你可以随意更新界面;页面不可见时,你的代码优先级就会降低;如果系统资源紧张,后台进程甚至可能被清理。这些都不是“Bug”,而是平台的设计约束。
对普通 Web 开发来说,你很少需要关心浏览器什么时候把你页面关掉。但原生开发完全不同,你必须把“生命周期回调”当作产品的一部分:页面启动时读取数据、页面回到前台时重新计算时间、页面即将销毁时保存状态。只有把这些状态迁移处理干净,应用才谈得上稳定。
这也能解释为什么很多从网页转原生开发的人会感到无力。不是 API 记不住,而是思考模型需要转变。网页开发更像在一张白纸上画画,原生应用则更像在棋盘上下棋,每一步动作都属于特定回合,回合结束后,你的权限可能就被回收了。
4.2 权限与通知:用户信任是产品的一部分,不是附加项
当计时器需要提醒用户时,就要向系统申请通知权限。什么时候弹权限弹窗、如何解释用途、如何在用户拒绝后继续保持基础功能,这些不是一个可有可无的交互细节。
开发者一开始会天然抵触这些环节:为什么一个小工具要这么麻烦?但从产品视角看,权限申请恰恰是用户建立信任的重要关卡。用户允许通知推送,意味着他愿意让你打断他的注意力;如果应用在后台无法准时提醒,用户失去的不仅是功能,还有对整个产品可靠性的信任。
很多个人开发者觉得通知权限只是调一个接口,难的是保证通知出现时机正确、文案明确、重复次数合理。做得好的计时器,会在开始倒计时前就解释清楚:结束后你会收到一条提醒,点击可以继续休息。这种“行为可预期”比任何炫酷功能都能建立安全感。
4.3 HAP、签名与升级:每一次安装都是一道信任闸门
原生应用和网页应用还有一个重要区别:它不是通过 URL 访问,而是通过安装包存在于设备上。
签名机制保证安装包没有被篡改,应用升级时也要验证来源;安装权限、开发调试模式、用户安装确认都是系统安全边界的一部分。这不是专门为难个人开发者,而是在保护每一位普通用户。
很多初学者把签名、HAP、设备调试看成纯技术负担,恨不得找个方式“绕过去”。但一旦绕过了这些边界,产品就失去了可追溯性。对个人开发者来说,规范签名和版本信息不是为了应付考试,而是为了让你未来能安全地更新应用、处理崩溃、判断不同设备上的版本差异。若没有留下签名、版本号和构建时间,等用户报告问题时,你甚至没法确定他装的是哪一个版本。
4.4 写在鸿蒙原生的场景里:小工具也需要全局视角
把这个道理落到鸿蒙原生开发里,就意味着一个计时器也要关注:应用进入后台后,系统是否允许继续提醒;用户从最近任务列表划掉卡片时,应用如何恢复;应用在跨设备流转或多窗口场景下,会不会出现多个页面同时运行的状态冲突。
如果一开始只把开发理解成“画界面”,这些问题是永远不会出现的。只有当系统开始接管你的行为边界,你才会意识到:原生开发的核心能力,不是掌握某个特殊的 UI 控件,而是理解系统分配给你的生命周期与资源是一份精确契约。
5. 第三次为什么能跑通:最小可行工具的三个步骤
5.1 先定义“只做一件事”,写不写代码都行
第三次,他做了一件看起来很不技术的事情:用纸写下了这个工具只能做的一件事。
在计时器场景里,什么才算“最小核心”?答案不是“显示倒计时文字”,而是“用户从开始动作到结束提醒,整个过程不依赖用户一直打开页面”。如果他只想做一个最简单的可用版本,那就只需要三个节点:设置时长、开始计时、到点后通知。
用俗话来讲:开始后你可以把应用切到后台,放心去做别的事;到了时间,系统会提醒你。这个闭环成立,工具才成立。
这不是说历史记录、第二组场景、状态同步不重要。它们有价值,但它们不是“最小闭环”的必要环节。个人开发者最稀缺的资源是注意力和可验证时间,不应该在核心闭环没有建立前,就把资源分散到外围功能上。
5.2 三部分按顺序推进:先本地,再后台,最后美化
基于这个最小定义,我给出一条常见的推进顺序:
- 第一步:本地页面完成“设置时长并启动”的基础动作,先不限前台后台,只确认 UI 状态能更新。
- 第二步:加入结束时间戳逻辑,让页面退到后台再返回时,剩余时间仍然正确。
- 第三步:回到页面验证界面刷新,再检查通知权限与提醒是否能被正常展示。
- 第四步:再做视觉美化、动画、音效和历史记录。
- 第五步:如果未来要长期使用,再考虑不同设备之间的数据同步、多场景预设、小组件等扩展。
每一步都要有可验证结果。尤其是第二步,一定要在真机上反复验证:切后台三十秒、三分钟、屏幕锁定再解锁、从最近任务切回等不同表现。
5.3 用一份“前台后台检查表”来代替盲目测试
我整理了一份可以复用的测试动作表:
| 场景 | 预期行为 | 常见失败 |
|---|---|---|
| 页面打开计时 | 状态即时变化 | 生命周期里没有初始化数据 |
| 点击 Home 键退出到桌面,等 30 秒再回来 | 剩余时间仍正确 | 只依赖页面内的定时器跳秒 |
| 锁屏 5 分钟后回来 | 剩余时间仍正确,被清理后重新打开也有恢复 | 没有保存并恢复目标结束时间 |
| 计时结束,应用在后台 | 收到系统通知 | 没有申请通知权限,或底层任务被系统挂起 |
| 用户从最近任务列表划掉应用再打开 | 界面回到合理状态,不显示过期时间 | 把关键状态只存在内存中 |
这套检查表不是“测试专用文档”,它可以倒推你的代码该如何组织。比如:为了让“划掉应用再打开”也能恢复时间,你必须把目标结束时间持久化到本地存储;为了让“系统清理进程后通知仍到达”,你可能需要根据具体系统能力选择合适的后台调度方式。这样,功能需求就会自动转成技术需求,而不是堆一堆看似全能的代码。
先不要追求把页面做得像成品。先让最核心动作在任何中断下都能恢复,再谈视觉体验。
5.4 这次没有失败的秘密:把“不做清单”也视为需求
一个容易被人忽略的细节是:第三次成功后,开发者也列出了很长的“不做清单”。
不做账号系统,不做周报导出,不做多人协作,不做历史图表,不做充满动效的欢迎页。清单里的每一项都不是“永远不做”,而是“当核心计时闭环还没有被长期使用验证之前,不要做”。
很多人把功能取舍理解为妥协,但实际恰恰相反。功能取舍是一种主动设计:是你说清楚了“这个版本不是给所有人用,只给一种高频场景用”。真正的失败,往往发生在你什么都不肯舍弃的时候。什么都做,结果就是产品没有核心,代码没有边界,开发者也没有余力处理真正重要的问题。
6. 给后来者的可复用检查链路
6.1 遇到环境问题时,按这个顺序查
如果你是第一次接触鸿蒙原生开发,遇到报错后先不要急着搜索错误码的零散解决方案。按照下面这条链路来,能省掉大量无用操作:
- 先看错误发生在构建阶段、安装阶段还是运行阶段。
- 如果是构建失败,优先检查工具链版本、SDK 组件、依赖包是否完整。
- 如果是安装失败,优先检查设备连接状态、开发者调试开关、签名配置和设备剩余空间。
- 如果是运行后崩溃,先查看崩溃日志和日志过滤,不要猜测。
- 如果是运行结果不对,先构造最小复现,用单个页面、单条记录、固定输入去验证。
这几个顺序背后有一个统一原则:不要同时怀疑所有环节。当你面前有五个可能原因时,最快的方法不是凭感觉改代码,而是先把变量隔离开。你可以先创建一个空白工程,只加一个按钮,看能否在真机上跑通。如果空白工程也失败,问题就在环境;如果空白工程正常,再逐步加入计时相关代码,问题定位就会清晰得多。
6.2 运行期最常见的问题,往往出在“状态”而不是“语法”
很多人在运行期遇到时间不对、页面不刷新、后台回来后状态丢失,第一反应都是去检查 UI 代码、检查计算逻辑,最后才发现是状态保存与生命周期配合出了问题。
建议用这个顺序排查:
- 当前值是不是在页面启动时读取了旧数据?
- 页面退到后台时,有没有把“目标结束时间”保存到本地?
- 页面重新进入前台时,有没有重新计算剩余时间并刷新 UI?
- 应用被系统清理后,用户重新打开应用时,是从冷启动进入,还是想恢复之前的状态?
- 通知权限是否已经申请并获准?系统设置的电池优化、自启动策略是否可能影响提醒?
别看这一串问题好像很多,顺着它走会非常高效。因为它能帮你区分:到底是你代码逻辑没写对,还是系统策略限制了你的后台行为。 比如,如果你已经申请了通知权限,却在真机上收不到提醒,那就需要去看设备的后台运行策略、通知权限设置、应用是否被设为允许后台活动。这里的排查重点是“系统认为你的应用处于什么状态”,而不是单纯看公式或代码。
6.3 什么情况下不建议做自己的原生 APP
写到这里,我也想给另一种判断:不是每个计时需求都应该用原生 APP 解决。
如果你的核心诉求只是“偶尔提醒一下自己”,那手机自带计时器、语音助手、桌面小组件可能已经够用。如果你希望跨设备、跨平台,还要和别人共享,那更应该先考虑成熟协作工具。如果你没有长期维护一个应用的精力,也没打算处理新版系统适配和用户反馈,那做个 H5 页面或小程序也未必不行。
个人开发原生应用,并不是“成本最低”的路径。它更像一种长期投入:你愿意为了控制体验细节,去承担环境维护、系统适配、签名更新和产品迭代的完整成本。只有当这种投入能换来足够大概率的使用频率时,才真正划算。
那位开发者的案例之所以成立,是因为他真的会高频使用这个计时工具,而且他对计时交互有非常具体的想法。换句话说,他不是把原生开发当成“热门方向”来追,而是有了一个长期困扰自己的真实问题,再反过来选择用原生开发解决。这两者的顺序不同,结果完全不同。
6.4 失败经验最容易沉淀成可复用认知
第一次失败教会了他:环境准备也是一种产品设计。 第二次失败教会了他:功能边界才是个人开发者的护城河。 第三次成功的价值,不是代码多漂亮,而是他终于知道如何快速验证一个软件想法是否成立。
这种经验一旦沉淀下来,换到任何操作系统、任何框架上都有效。很多人的误区是把“学过鸿蒙开发”理解成记住了几个 API,实际上真正值钱的是判断力:知道先做什么、不做什么、出现问题去哪个环节查、在什么条件下相信自己的应用能被长期使用。
7. 回到那场访谈:最该带走的不是“成功方法”,而是“失败前发生了什么”
7.1 失败并不是因为不努力,而是早期信号没有被当成信号
那篇访谈里,开发者在复盘两次失败时说过一个很诚实的结论:每次失败其实都有早期信号,只是他当时没听懂。
第一次失败的信号,是环境配置充满不确定性时,他没有停下来重搭结构,而是一遍遍试下去,以为只要绕过某个具体错误就能前进。 第二次失败的信号,是功能列表越写越长时,他已经感觉到自己无法判断“哪个功能能做完了”,但他没有及时缩小范围,反而把这种感觉理解成了“还需要更努力”。
这两句话很值得记录下来。如果你也曾从 Web 或跨端开发转入原生开发,或者正在规划自己的第一个正式应用,不妨把这两条当作自检点:
- 当环境配置迟迟无法收敛时,问题通常不是配置本身,而是工具链、版本和工程结构不匹配。
- 当功能列表越来越长但你对核心场景不再笃定时,问题通常不是能力不够,而是你失去了“这个版本不做什么”的判断力。
7.2 个人原生开发项目的真正边界
你可以开发一个功能简单的计时器,但你无法回避完整原生工程链路;你可以只做单机版,但你无法回避系统对后台、权限和生命周期的约束。这就是个人原生开发的魅力与麻烦:你有最大自由度,也要为所有不确定性负责。
如果让我给后来者一句话,我会说:开发一个自己的原生 APP,最好的起点不是宏大的“做一个平台”,而是某个你再也不能忍的重复劳动。它小到不解决也不会死人,但它足够具体,让你每天都有动力去验证、修改、失败、再重来。那场访谈里的开发者最后发现自己得到的不只是一个计时器,而是一套判断软件可行性的方法:跑通最小闭环,再谈体验;看清系统契约,再谈自由。
7.3 失败两次不是黑历史,而是你唯一不会被 AI 代写的经验
工具和 AI 以后可能会帮你生成页面,自动补全代码,甚至给你建议架构。但有一件事很难被替代:你真的知道自己为什么需要这个工具,你真的经历过“从完整想法到最小可用版本”的痛苦收敛过程,你也能在功能列表不断扩张时,亲手砍掉那些看起来合理但你当下不需要的东西。
这种判断力无法通过看教程获得,只能来自一次一次把项目推到真实设备上的过程。下次再有人跟你说“我准备给鸿蒙写一个原生应用”,我不会先问他会用什么语言、会不会某个组件,而会先问他:你到底在哪个场景里被现有工具折磨过?你愿意为了这个场景,连续失败两次再继续做下去吗?
愿意,才是你真正进入原生开发世界的入场券。