接手过一个没有文档的老项目吗?打开目录,前端代码和后端接口搅在一起,公共函数散落在各个角落,数据库脚本藏在某个不知名的文件夹里,想知道项目用了什么技术只能靠一行行翻package.json和pom.xml。这种混乱并非个例,多数全栈项目在快速迭代中都会走向失控。要扭转局面,成本最低的两个手段就是写好技术栈声明和画好架构图,前者解决"项目里有什么"的问题,后者解决"东西之间怎么关联"的问题。

为什么项目结构会越来越乱
结构混乱通常不是一开始就存在的。项目初期,团队成员往往为了快速上线,把代码往最顺手的地方放:前端页面写在static目录下,后端接口和工具类放在同一个包里,配置文件随手丢在根目录。当业务规模还小的时候,这套做法确实跑得很快,问题被速度掩盖了。
随着功能不断叠加,混乱开始暴露代价。第一是职责不清,一个utils目录里既有前端的日期格式化,也有后端的加密工具,改一处可能影响两端;第二是依赖失控,模块之间互相引用,谁也说不清调用链路;第三是新人上手困难,没有文档说明各目录的用途,只能靠口头相传,知识沉淀为零。
本质上,结构混乱反映的是项目缺少显式的架构约束。代码怎么组织全凭个人习惯,而没有一份团队共同认可的"地图"。技术栈声明和架构图就是这份地图的载体,它们不需要多复杂,但必须存在、必须更新、必须让每个参与者都能看到。
技术栈声明应该怎么写
技术栈声明是一份放在项目根目录的说明文件,通常直接写在README.md的开头部分。它的作用是让任何人在三十秒内搞清楚:这个项目由哪些部分组成,每个部分用了什么技术,版本是多少。很多人写README只写一句"一个全栈项目",这种声明等于没写。
一份合格的技术栈声明至少包含四个部分:技术选型清单、模块划分说明、运行环境要求、目录结构索引。下面是一个可以直接套用的模板:
# 项目名称 ## 技术栈声明 ### 前端 - 框架:Vue 3 + TypeScript - 构建:Vite - UI组件:Element Plus - 状态管理:Pinia ### 后端 - 语言:Java 17 - 框架:Spring Boot 3 - 数据库:MySQL 8 + Redis 7 - ORM:MyBatis Plus ### 基础设施 - 部署:Docker + Nginx - CI/CD:GitHub Actions ## 目录结构 ├── frontend/ # 前端工程(独立package.json) ├── backend/ # 后端服务 │ ├── controller/ # 接口层 │ ├── service/ # 业务层 │ └── mapper/ # 数据访问层 ├── docs/ # 架构图与设计文档 └── deploy/ # 部署脚本与Dockerfile
写声明时有几个容易踩的坑。一是版本不写或写模糊,比如只写"Spring Boot"不写版本号,半年后排查兼容性问题时无从下手;二是目录说明写成了目录树的完整复制,几十行看得人眼花,正确做法是只标注一级、二级目录,说明职责即可;三是声明写完就不管了,技术栈一旦调整必须同步更新,否则文档比代码还误导人。建议把"更新README"写进代码评审的检查项里。
用架构图把模块关系讲清楚
技术栈声明解决的是"有什么",架构图解决的是"怎么连"。对于全栈项目,至少应该有两张图:一张分层架构图,展示从用户浏览器到数据库的完整链路;一张模块依赖图,展示代码内部各模块之间的调用方向。
分层架构图建议按请求流向自上而下绘制:客户端层、网关层、前端应用层、后端服务层、数据层,每一层标注使用的技术。这张图的价值在于划清边界,比如当团队争论"这个请求拦截逻辑应该放前端还是后端"时,看图就能得出结论——拦截属于网关层职责,不该塞进业务代码。
模块依赖图则更贴近代码,用箭头表示谁依赖谁。画这张图有个隐含的好处:一旦发现箭头出现交叉或循环,说明代码耦合已经超标,该重构了。绘图工具不必追求专业软件,用Mermaid直接写在Markdown里,随代码一起进版本库,改动有记录,维护成本低。示例:
graph TD
Browser[浏览器] --> Nginx[Nginx 静态资源与反向代理]
Browser --> FE[Vue 3 前端应用]
FE -->|HTTP API| Gateway[API 网关]
Gateway --> Auth[认证服务]
Gateway --> Biz[业务服务 Spring Boot]
Biz --> MySQL[(MySQL)]
Biz --> Redis[(Redis 缓存)]
两张图配合使用效果最好。分层架构图给管理层和新成员看,快速建立全局认知;模块依赖图给日常开发看,做改动前先确认影响范围。图中的每个节点都应该能在目录结构里找到对应位置,如果图里有但代码里没有,或者反过来,就说明文档和代码脱节了,需要立刻修正。
把声明和架构图落地成团队习惯
文档写得再好,不落地就是摆设。要让技术栈声明和架构图持续发挥作用,需要把它们嵌入开发流程。首先,在项目的docs目录下建立固定位置存放架构图,README里给出链接入口,任何人找文档不用问人;其次,涉及新增框架、更换数据库这类技术栈变更时,把"同步更新声明"作为合并请求的必要条件;最后,定期做一次架构对齐,比如每个季度花半小时对照架构图检查代码现状,清理漂移的部分。
对于多人协作的项目,还可以更进一步,用脚手架把目录结构固化下来。比如提供一个项目模板仓库,新人初始化项目时自动生成标准的目录骨架和README模板,从源头上避免结构跑偏。当结构有约束、文档有更新机制时,全栈项目才能在长期迭代中保持清晰,团队协作的沟通成本也会显著下降。