#星光不负 码向未来# 一个“老程序员”的第四次转型:从前端到Java到全栈,再到被朋友“拖”进鸿蒙的这两年 原创 精华
一、写在前面:我是怎么“又一次”被时代点名的
我一直跟同事开玩笑说,我职业生涯像是按“十年一更”来的:
- 第一段:切图仔+jQuery+能写点后台的“万能兵”;
- 第二段:Node.js 兴起,开始往后端挪,补了 Java,进了企业;
- 第三段:做成了“能改前端、能写接口、能查库、能上服务器”的全栈;
- 第四段(现在):朋友一句“你搞鸿蒙不?”我又开始了新一轮啃文档的人生。
如果你是刚毕业的小伙伴,可能感受没那么明显,但只要你在一线/甲方里干过 5 年以上你就知道:很少有人能一辈子只写一种技术,更多时候是技术栈被业务推着走。
我不是第一次被“新技术”拍到脸上,但这一次——HarmonyOS——我是真的感觉到“这是国产生态里我能出点力的东西”,所以认真学了,考了证,去了几场活动,也写了几个真正在跑的应用。

确实我是老程序了,这篇就当是我这位“老程序员”的一次比较系统的回忆和复盘。
二、第一阶段:我原来只是想把页面写好(前端起手的那些年)
我最早入行的时候还没有现在这么多工程化、组件化、自动化的东西,那会儿是**“能把设计稿还原到 90% 就能生存”**的年代。那时候我每天的工作是:
- 切图 + 静态页;
- 做一点 jQuery 动效;
- 给后端留几个模版变量;
- 线上出问题了,赶紧 FTP 上去改。
那会儿我有两个印象特别深的事:
- 第一个趣事:我写了个轮播图,IE9 好好的,IE8 一片空白,我查了一上午,最后发现是我写了
for (var i in arr),结果 IE8 上循环出了个字符串属性,DOM 全乱了。我当时就暗暗发誓:以后能不用奇技淫巧就不用。 - 第二个趣事:我们领导说“你这动效太丝滑了,能不能卡一点?高端点。”我说“啊?”他说“要有力道,别太顺。”你看,做前端久了你就知道,很多体验是被产品和领导“消失掉的技术细节”。
总之,那时候我对自己的定位就是——我是一名前端,最多就是“顺手调下接口”,并没有觉得要去攻城略地。
三、第二阶段:被业务推着学 Java,那是我第一轮“硬转向”
转 Java 其实不是出于喜欢,是出于活儿的重心变了。那几年,前端工作量反而没那么大了,后端要写权限、要接支付、要连老系统,团队里能写 Java 的人就那么几个,领导说:“你前端写得快,你去把这两个接口补一下。”就从这里开始了。
我跟很多“前端转 Java”的人说过一句话:别幻想一夜之间从 Vue 切到 Spring Cloud,你要先变成能写业务接口的工程师,再变成能设计服务的工程师。
我那时候的学习路径大概是:
- 先补Java 基础 + Web 基础(Servlet、Filter、JSP 那一挂);
- 再上Spring / Spring MVC / MyBatis,把最常见的三件套摸顺;
- 后面才开始碰Spring Boot / 安全 / 消息队列 / 分布式配置。
也正是在这个阶段,我第一次认真地学了“后端怎么思考系统”。这个思维后来对我学鸿蒙很有帮助,因为鸿蒙的很多能力——近场、分布式、设备协同、云端配合——都不是“写个页面”能玩明白的,你得有一点**“后端看世界”的脑子**。
四、第三阶段:全栈的舒适与隐忧
我后来进了一家做企业业务的公司,前端人不多,后端人也不多,谁多会一点,谁就多做一点。慢慢地我就变成了那种:新功能我能一条龙从前端写到后端的“工具人式全栈”。
说实话,这个阶段是最爽的:
- 我能自己设计接口;
- 我能自己落地页面;
- 我能自己部署;
- 出问题我也能自己排查。
但也在这个阶段我发现一个隐忧:我写的东西都“只活在浏览器里”或者“只活在企业内网里”。
我做了很多功能,企业内部的人用了,但它离“用户端”“生活端”“IoT 端”还是有距离的。我写的是业务系统,不是生活化的应用。
我当时的直觉是:下一次转型,应该找一个能贴近终端、贴近用户、还能往上够到云能力的方向。
五、第四阶段:朋友一句“你搞鸿蒙吗”,我又掉进了文档里
真正把我拉进来的是一个老同事,他比我早玩一年 HarmonyOS。他看我还在写 B 端,就说了一句:
“你写前端、写 Java,又能做全栈,你搞鸿蒙比纯移动好使啊,这东西现在要的就是能把端+云+服务一块想的人。”
说实话我最开始是犹豫的,我脑子里是这样的画面:“又要学一套语法?又要装 IDE?又要搞签名?”
结果我装了 DevEco Studio 一看——ArkTS ——我整个人就松下来了一点:这不就是我熟的那一套 TypeScript 思路吗?
然后我又看了 HarmonyOS 的能力清单:分布式软总线、近场、云开发、应用分析、APMS、元服务……我突然意识到:这玩意儿是我前端、Java、全栈这三段经验的交汇点。
- 前端的 UI 能力:ArkUI 一上手就有;
- Java 的服务思维:鸿蒙很多场景要和云打交道,需要你写服务、设计接口;
- 全栈的交付视角:鸿蒙落地不是写完页面就结束了,要想“这玩意怎么发、怎么测、怎么观测”。
所以我干脆就当它是我的第四次转型,也是真正第一次往国产生态里扎。
六、学习中的几件趣事(真事)
趣事①:我以为是“写个页面”,结果老师讲的是“分布式软总线”
我第一次去线下听鸿蒙活动,本来想去听点 UI 小技巧,结果讲师上来就是“分布式软总线”“多设备协同”“元服务拆分”,我在下面疯狂记:“这不是普通 App,这是系统级协同啊。”
我那天回去就跟朋友说:“这玩意不像写个 App,更像是在写‘下一代端侧入口’。”
趣事②:我把装饰器写成了 Java 注解风格
有一次我写组件,写的是:
// 错误示意
public @Entry @Component class MainPage { ... }写完我自己都没发现问题,DevEco 一片红,我还以为是我导包不对。后来想想我笑了半天:这就是长期写 Java 写出来的肌肉记忆。
从那天起我在笔记上写了一句:“这是 ArkTS,不是 Spring。”
趣事③:我女儿说我写的是“鸿蒙作文”
我在家一边开着 DevEco,一边写示例代码,准备参加社区的征文活动,我女儿走过来看了看说:“爸爸在写作文嘛?”我说:“这是写代码。”她说:“那你怎么文字比代码多?”
我愣了一下才反应过来——鸿蒙的很多社区内容确实比代码更强调“你是怎么落地的”,而不是贴一堆源码就完事。这跟我过去写 B 端完全不一样,我过去写 README 都偷懒,但写鸿蒙我会主动写安装步骤、真机注意事项、签名说明、云端能力开关,这也算我这次转型里养成的一个好习惯。
七、我的鸿蒙学习路线(可给后来人参考)
我当时自己整理了一版,我就照着这个学的:
- 第一条线:ArkTS + ArkUI 基础
- 组件、状态、事件、路由、页面生命周期
- 容器组件(List/Grid/Swiper)、常用表单组件
- 规范化布局(padding/gap/Column/Row/Flex)
- 第二条线:系统/设备能力认识
- 分布式软总线的概念
- 近场发现与协同
- 元服务/卡片的使用场景
- 第三条线:云能力打通
- 云开发(Cloud DB / 云函数)
- 云测试
- 应用分析/APMS
- 第四条线:工程与交付
- 签名、包体优化、预加载
- 渠道/应用市场要求
- 版本升级策略
- 第五条线:社区与认证
- 参加线下/线上活动
- 做 1~2 个能拿得出手的 Demo
- 考相关证书(下面我会说)
这条线有意思的地方在于:它不是从“语法”往上走的,而是从“我要做一个能跑在用户设备上的东西”往下拆的。我觉得鸿蒙就应该这么学。
八、我做过的一个“小而真实”的鸿蒙项目:家庭设备巡检助手
既然是“成长纪实”,不能只有故事没项目,我挑一个最能说明“我这三段技术都用上了”的小项目说一下:家庭设备巡检助手。
1. 场景
我家设备多:路由器、NAS、小主机、打印机、孩子的平板,有时候谁掉线了、谁快没空间了、哪个设备关了,我都要一台台看,特别麻烦。
所以我做了一个鸿蒙小工具:一键巡检 → 端上展示 → 需要人工处理的项一键跳转。
2. 能力
- 端上:ArkUI 展示设备状态列表;
- 近场:在局域网/近端发现可用设备;
- 云端:上报巡检结果到云端;
- 分析:看哪台设备最常挂、哪天波动最大。
3. 简化版代码(示例)
// pages/DeviceCheck.ets
@Entry
@Component
struct DeviceCheckPage {
@State devices: Array<DeviceInfo> = []
@State checking: boolean = false
build() {
Column({ space: 12 }) {
Text('家庭设备巡检').fontSize(22).fontWeight(FontWeight.Bold)
Button(this.checking ? '巡检中...' : '开始巡检')
.onClick(() => this.startCheck())
.disabled(this.checking)
List() {
ForEach(this.devices, (item: DeviceInfo) => {
ListItem() {
Row({ space: 8 }) {
Text(item.name).fontSize(16)
Text(item.status).fontSize(14)
.fontColor(item.status === 'online' ? 0x00AA00 : 0xFF0000)
if (item.needAction) {
Button('处理').onClick(() => openFixPage(item))
}
}.padding(8)
}
}, (item: DeviceInfo) => item.id)
}
}.padding(20)
}
async startCheck() {
this.checking = true
// 1. 发现近端设备(示意)
const list = await discoverNearbyDevices()
// 2. 对每个设备做 ping/接口检查
const result = await Promise.all(list.map(d => checkDevice(d)))
this.devices = result
this.checking = false
// 3. 上报云端做历史分析
reportToCloud(result)
}
}
interface DeviceInfo {
id: string
name: string
status: string
needAction?: boolean
}这段代码其实不复杂,但它很好地体现了我前面说的那个点:鸿蒙开发不是只写 UI,是写“端上可操作的能力 + 云端可观测的闭环”。
我后来在社区里发过这个小项目的精简版,点收藏的人不算多,但私信问我要“近场发现那部分怎么写”的反而挺多,说明大家确实对端-端协同这一块是感兴趣的。
九、证书与参会:我为什么还是去考了
你要说我这个岁数了,还去考证,有点搞笑。但我还是考了两个鸿蒙相关的(这里不写具体编号,就当泛指),原因其实很简单:
- 我之前的技术栈太“通用”了:前端、Java、全栈,大家都会,简历里不亮。鸿蒙是新东西,一写上去,“哦你玩这个了?”
- 公司要给人培训、要招人,得有人能说“我过了”:很多时候不是为了自己,是为了团队。
- 考证是逼自己把零碎知识系统化的最快办法:我写项目的时候很多东西是“知道能用”,但考题里会问到“能力边界”“权限模型”“安全策略”“分布式组件的场景限制”,这个只有系统学才会看到。

我记得有一次参加线下的鸿蒙开发者沙龙(不过华为的HDD挺多的,推荐大家也去玩),我拿着我考过的证书和我做的小 Demo 去跟讲师聊,他说了一句话我挺认同的:
“现在玩鸿蒙的很多人还在写 UI,你要是能把端 + 云 + 分布式那条线讲清楚,在社区里是很缺的。”
这句话也让我更坚定写这种成长+实战+分析类的文章。
十、我参加过的活动我都做了笔记
这一点我觉得是老程序员比年轻程序员做得好的地方:我知道记笔记能省很多时间。
我一般都会记这几类信息:
- 版本信息(讲的是哪一版 HarmonyOS / SDK);
- 新能力的关键入口(是在 IDE 配置、在代码里 import、还是在 AGC 里开);
- 官方推荐的业务场景(比如元服务适合做“单一动作”);
- 自己能落地的方向(比如我家里/公司里能不能用)。
后来我发现在论坛发文的时候,这些笔记就能直接变成“大家都想看的那一段”。所以我这篇也写得比较细,就是这个思路。
十一、为什么我觉得鸿蒙适合“有前端底子又懂前端的老程序员”
- 语言门槛低:ArkTS 类 TS,你过渡很快;
- 工程要求高:签名、包体、版本、能力声明,这些对做过后端/运维的老程序员不算难;
- 生态在长:你现在做的东西,过一阵子可能就能接更多设备、更多场景;
- 社区需要“写得清楚的人”:新人写的是“能跑的代码”,老人能写“为什么要这么设计”,社区其实更需要后者。
所以我经常劝还在写 SSM / Spring Boot 管理后台的朋友:别只写后台、前端了,捎带学一下鸿蒙,能把你这十年里攒下来的思维用在一个国产生态上。
十二、如果你也想写征文,我的结构给你抄
你看我这篇其实就是这个骨架:
- 我是谁(老程序员多次转型背景)
- 我为什么学鸿蒙(技术交汇 + 朋友安利)
- 我怎么学的(路线)
- 我做了啥(实战)
- 我参加了啥(活动/证书)
- 我总结了啥(经验/建议)
你把你自己的经历一替换,就能发一篇结构完整的文章了,符合这次“#星光不负 码向未来#”的要求。
十三、结语:写给还在犹豫的“同龄人”
我知道看我这篇的人里会有一部分是跟我差不多年限、甚至比我还久的,你们可能在想:“我都这个岁数了,还要学一套新的体系吗?”
我想说:要。
原因不是“技术焦虑”,而是你终于能在国产生态里,把你前端 + Java + 全栈这一堆能力一次性用上了,这机会其实不多。
而且鸿蒙这条线,是可以写技术、写故事、写项目、写教程、写最佳实践的——这对老程序员特别友好,你不一定手速最快,但你一定能讲得最清楚。
希望明年 1024,我们还能在社区里看到彼此的名字。
——完 👍




















我也想学鸿蒙,有什么可以指点一下的么~
这个是真大佬!!!!