从文科生到前端:我的技术探索与实践碎碎念

移动端Tech
2025-12-29 00:35
阅读 2299

三年前,我还在图书馆啃《西方哲学史》,如今却在深夜和 Chrome DevTools 谈恋爱。作为一个非科班出身的文科生,转码这条路走得磕磕绊绊——没有数据结构基础,不懂算法复杂度,连“闭包”都听成了“包子”。但好在,公司给了容错空间,我也硬着头皮啃下了一个又一个项目。

如今在这家公司待了三年多,双11大促熬过通宵,需求评审被产品经理画饼画到怀疑人生,也经历过线上白屏事故后被运维小哥“亲切问候”。最近开始琢磨跳槽的事儿,倒不是对公司不满(虽然 PM 的 PRD 经常半夜 11 点发),而是觉得该换个环境,看看外面的世界有没有更香的“韭菜地”。

在这个节骨眼上,我想聊聊这几年在技术探索与实践中的一些真实体会——关于怎么从“能跑就行”进化到“稳如老狗”,以及如何把那些看似高大上的概念,落地成真正能用的产品能力。

书单不是摆设,是救命稻草

刚入行那会儿,我特别迷信“实战出真知”,觉得看书太慢,不如直接上手写代码。结果第一次重构组件库,把状态管理搞成意大利面条,同事 review 时只回了一句:“你看过《深入浅出 React》第 7 章吗?”

打脸来得猝不及防。

后来我逼自己每月精读一本技术书。不是那种收藏夹吃灰的“伪阅读”,而是边读边敲代码、做笔记、甚至给团队分享。比如《Designing Data-Intensive Applications》(DDIA)这本书,虽然是讲分布式系统的,但我作为前端,居然从中悟出了不少产品协同的门道:

  • 幂等性 → 用户重复点击提交按钮怎么办?
  • 最终一致性 → 多端数据同步延迟时如何给用户反馈?
  • CAP 权衡 → 离线场景下,是保可用性还是强一致?

这些概念原本属于后端范畴,但一旦理解了底层逻辑,写前端交互时就不再只是“调接口 + 渲染”,而是能站在系统全局去思考用户体验。有一次,我们做离线表单编辑功能,我直接套用了 WAL(Write-Ahead Logging)的思想,先本地存操作日志,网络恢复后再批量重放——产品经理惊呼:“这体验也太丝滑了吧!”

文科生的优势可能就在于:能把抽象概念翻译成人话,再反哺到产品设计里。

求职不是比谁会背八股文,而是拼综合解题力

最近刷 LeetCode 刷到头秃,但越刷越觉得不对劲——面试官真的在乎我会不会手写红黑树吗?未必。他们更想确认的是:面对模糊需求,我能拆解出技术路径,并推动落地

举个例子。上个月有个需求:提升 H5 页面在低端安卓机上的首屏速度。PM 的原话是:“用户说打开太慢,能不能快点?” —— 典型的“模糊需求文学”。

如果只盯着前端性能优化 checklist(懒加载、代码分割、缓存策略……),可能事倍功半。我拉上后端和运维一起对齐,发现瓶颈其实在 API 响应时间 + CDN 回源策略。于是我们做了三件事:

  1. 前端:采用渐进式 hydration,骨架屏 + 关键数据优先渲染
  2. 后端:对首页接口做缓存预热,TTL 动态调整
  3. 运维:调整边缘节点缓存规则,减少回源频次

最终首屏 FCP 从 3.2s 降到 1.4s。这个案例后来成了我简历里的“高光项目”——不是因为用了什么黑科技,而是体现了跨角色协作 + 系统思维 + 产品意识的综合能力。

现在看招聘信息,很多 JD 都写着“具备产品思维”、“能独立推进项目”。说白了,就是别只当需求搬运工,要能反问:“这个功能到底解决用户什么痛点?有没有更轻量的方案?”

开源源码:别只 star,要敢 fork

我喜欢研究开源项目源码,尤其是那些 star 数高但文档稀烂的。比如去年研究 Vite 的插件机制,为了搞懂 transformIndexHtml 钩子怎么用,硬是把 packages/vite/src/node/plugins/html.ts 啃了一遍。

过程中踩了个经典坑:我以为 transformIndexHtml 是同步的,结果在异步请求后返回 HTML 字符串,导致构建卡死。查 issue 才发现,它支持 async,但必须显式 return Promise。于是我在本地改了两行代码测试,顺手提了个 PR 补充文档注释——居然被 maintainer 合并了!

那一刻,感觉自己终于从“使用者”变成了“共建者”。这种参与感,比调通一个 bug 还爽。

更重要的是,读源码让我学会了技术选型的底层逻辑。比如为什么我们的微前端方案最终选了 qiankun 而不是 single-spa?不是因为前者更火,而是它的沙箱机制能更好隔离 CSS 污染——这在我们多团队协作的背景下至关重要。

方案 沙箱能力 子应用接入成本 社区活跃度 是否满足需求
single-spa 弱(需手动处理)
qiankun 强(JS + CSS 隔离)
Module Federation 高(Webpack5 依赖) ⚠️

你看,技术决策从来不是“哪个更酷”,而是“哪个更贴合业务约束”。

实践中的“脏活”才是真功夫

别被网上那些“一行代码实现 XXX”的标题骗了。真实项目里,80% 的时间都在处理边界情况、兼容性问题和历史债务。

比如我们有个老项目还在用 jQuery + RequireJS,新需求又要上 Vue3。怎么办?不能一刀切重写(老板不同意),只能渐进式迁移。我搞了个“微模块”架构:

// legacy-loader.js
window.registerVueModule = (name, component) => {
  if (window.Vue) {
    window.Vue.component(name, component);
  }
};

// 新模块入口
import MyNewFeature from './MyNewFeature.vue';
registerVueModule('my-new-feature', MyNewFeature);

然后在旧页面的 HTML 里动态注入:

<div id="new-feature-container">
  <my-new-feature></my-new-feature>
</div>
<script src="/vue3-bundle.js"></script>

虽然丑,但有效。上线后零故障,PM 甚至没发现这是两个技术栈混搭的。

这类“脏活”没人写博客,但恰恰是体现工程师价值的地方——在约束中创造可能

写在最后:技术是手段,不是目的

回顾这三年,我最大的转变是从“追求新技术”到“追求解决问题”。Rust 很酷,但我们的后台管理系统用不到;WebAssembly 性能炸裂,可用户根本感知不到 0.1s 的差异。

真正重要的,是理解产品目标用户场景团队现状,然后选择最合适的工具组合。有时候,一个精心设计的 loading 状态,比 SSR + SWR + CDN 的全套方案更能提升体验。

下周我就要开始投简历了。不指望一步登天,但希望下一站能遇到更多愿意一起“把事情做对”的人——而不是只关心 OKR 数字的 KPI 战士。

如果你也是非科班出身,别自卑。我们缺的从来不是天赋,而是持续把模糊问题变清晰的能力。共勉。

P.S. 最近在重读《程序员修炼之道》,里面有一句特别戳我:“Don’t live with broken windows.” —— 别容忍破窗。无论是代码坏味道,还是流程漏洞,看到了就修。毕竟,我们写的不是代码,是未来某天自己或同事要维护的“遗产”。

(完)

评论 0

最热最新
暂无评论
移动端TechLv.1
0
影响力
0
文章
0
粉丝