我以前基本只做客户端:界面、逻辑、上架,边界很清楚。开始做全栈不是因为「全栈更酷」,而是因为我遇到了几件「不问后端就没法解决」的事。
起因:几个撞到墙上的瞬间
想给自己的内容做一个「能被我完全控制」的展示站,结果发现这属于后端 + 运维;
想做一点自己的小工具,卡在「怎么让它在网上能被别人用到」这一步;
排查问题时,只会看客户端现象,看不出数据与接口那一侧发生了什么。
真正推我一把的是第三点:只想在边界内做事,遇到跨边界的问题就会一直停在「我这边没问题」。而问题恰恰常在边界上。
补上的第一块:后端 —— 从「调用接口」到「设计接口」
这两件事的差别比我想象的大:
调用方关心的是「我要的数据有没有拿到」;
设计方关心的是「这个接口会不会被误用、数据形状怎么定、错误怎么表达」。
我最大的收获是想清楚了一个词:**边界**。接口就是一条边界,边界上要处理的是校验、鉴权、失败情况和兼容性,而不是业务逻辑本身。
补上的第二块:数据 —— 从「存本地」到「长期可维护」
客户端存数据往往只要能读出来就行;服务端的数据要考虑的是:
数据会长期增长,结构改动的代价很高;
要能备份、能迁移、能在出问题时人工查;
要能承受「并发写」和「写到一半失败」。
所以我最明显的一个转变是:不再把「结构设计」当成可以后补的事。它几乎是所有东西里最难改的一块。
补上的第三块:运维 —— 这部分最难,也最容易被低估
如果让我给想转全栈的人排一个难度顺序,运维一定在第一位。因为它不是「写代码」,而是「让代码长期活着」:
域名、证书、反向代理、开机自启,这些第一次配都要查很久;
出问题时没有编译器提示你,只有日志和状态码;
最容易忽略的一点:部署流程本身也是要设计的(备份、回滚、验证)。
我的体会是:运维里最重要的能力不是「会修」,而是「让问题发生前就能发现」。健康检查、关键路径自检、发布后验证,这三样比任何技巧都实用。
踩到的几个思维差异
这几个差异是我从客户端思维切过去时最不适应的:
客户端出错可以「提示一下让用户重试」;服务端出错必须先保证数据不出问题,再谈体验;
客户端可以要求用户升级;服务端必须同时兼容新旧版本;
客户端一次只服务一个人;服务端要假设「很多人同时来」。
全栈这件事的边界在哪
我不想把它说成「什么都能做」。真实情况是:
全栈的核心价值不是「一个人做完所有事」,而是「没人替你兜住的那部分,你自己能兜住」。
这带来两个很实际的好处:一是遇到跨层问题能自己定位,不会被卡住;二是判断「这件事值不值得做、大概要花多久」会准得多。
我现在的分工方式
实际做项目时,我并不是追求每一层都精通,而是把每层做到「够用 + 知道深浅」:
重点投入:数据结构与接口边界(错了最难改);
够用就行:前端界面、运维配置(有成熟方案就直接用);
交给工具:能自动化的全部自动化,尤其是发布与备份。
给同样想补全栈的人三点建议
不要为了「学全栈」而学,找一个你自己真要用的东西做出来;
优先补「边界上的能力」:数据、接口、发布,而不是再学一个框架;
先把「让它在线上稳定跑一个月」当成目标,那比多写几个功能收获大得多。
这个站就是这套想法下的产物:它不大,但每一层我自己走过一遍,这就是我做全栈的全部理由。