4.6 KiB
4.6 KiB
tags, aliases, date created, date modified
| tags | aliases | date created | date modified | |
|---|---|---|---|---|
|
星期一, 十二月 8日 2025, 12:04:31 凌晨 | 星期一, 十二月 8日 2025, 12:05:12 凌晨 |
渐进式开发最佳实践
1. 必须在写代码前锁定的“硬约束” (The Non-Negotiables)
即使是后规划细节,但这 4 样东西 是一旦开工就很难改的,必须在骨架阶段定死:
-
目录结构 (Directory Layout):
cmd,internal,pkg怎么分。这决定了你能不能顺畅地加代码。- 现状: 我们已经定好了 (Modular Clean Architecture)。
-
核心技术栈与基础设施: 选 Gin 还是 Echo,用 GORM 还是 SQLX,依赖注入用 Wire 还是手写。
- 现状: 我们已经定好了 (Gin+GORM+Wire+Viper)。
-
统一的交互规范: API 怎么返回错误?数据库怎么管理变更?日志打在哪里?
- 现状: 我们已经定好了 (JSON Envelope, Golang-Migrate, Zap)。
-
核心领域模型 (Core Schema): 最关键的表(User, Role)。
- 原因: 它们是系统的地基,地基不稳,后面写 Service 逻辑会反复推倒重来。
2. 可以(且应该)推迟设计的“软逻辑” (The Deferrables)
这些内容不要现在想,想了也是白想,等写到那个函数时再具体的“具体问题具体分析”:
-
复杂的业务算法: 比如“文章的热度排名算法”、“复杂的权限递归校验逻辑”。
- 策略: 先写个
return true或简单的逻辑占位,跑通流程再说。
- 策略: 先写个
-
极致的性能优化: 比如“这里要不要加 Redis 缓存?”、“这里 SQL 要不要分表?”。
- 策略: 先跑通功能 (Make it work),再优化性能 (Make it fast)。
-
非核心字段的定义: 比如文章表里要不要加
seo_keywords,用户表要不要加wechat_id。- 策略: 用到了再加 migration,不要为了“未来可能用到”而过度设计。
-
具体的 API 参数细节: 比如“更新文章是传 ID 还是传 UUID”。
- 策略: 写 Handler 的时候,顺手定义 DTO 就行。
3. 个人开发者的“曳光弹”开发流 (The Tracer Bullet Workflow)
不要试图“横向”开发(先把所有 50 张表设计完,再把所有 API 定义完)。
要进行 “纵向”切片开发(Vertical Slice)。
推荐的实操步骤:
第一阶段:搭建“行走的骨架” (Day 1 - 也就是你现在该做的)
目标: 一个能跑起来、能连数据库、有日志、有 Swagger 文档,但没有任何业务功能的空壳。
- 初始化项目: 建立文件夹,
go mod init。 - 配置基础设施: 放入
Makefile,docker-compose.yml,config.yaml。 - 连通性测试: 写一个简单的
GET /ping接口,确保能读到配置,能连上 DB,能打出日志。 - 依赖注入跑通: 确保
wire能自动生成代码并启动 Server。 - 结果: 你拥有了一个**“生产级”的 Hello World**。
第二阶段:第一个“核心切片” (Day 2-3)
目标: 打通 User 模块的完整闭环。
- DB: 设计
users表,执行 Migrate。 - Entity: 生成 User Struct。
- Repo: 写
CreateUser和FindUser的 CRUD。 - Service: 写
Register逻辑(这里涉及到密码加密,此时再去查 Argon2 怎么用)。 - API: 定义
RegisterReqDTO,写 Handler。 - 测试: 用 Postman/Swagger 调通注册接口。
第三阶段:具体问题具体分析 (Day 4+)
目标: 遇到什么写什么。
- 场景: 比如你做到了“文章发布”,突然发现需要“敏感词过滤”。
- 动作: 停下来,在
pkg/util里设计一个敏感词过滤函数(或者找个库),然后在 Service 层调用它。 - 这就是你说的: “进行到具体的业务逻辑的时候进行设计”。
4. 总结给你的建议
你现在的焦虑在于试图预见未来。
作为个人开发者,你的代码就是你的设计文档。
你的下一步行动:
- 停止思考复杂的业务场景。
- 立即按照我们之前确定的目录结构,新建文件夹。
- 立即把
docker-compose跑起来,把main.go跑起来。 - 立即实现“用户注册”这一个功能。
只要“骨架”(架构分层、依赖注入、数据库管理方式)是对的,后面你往里面填什么肉(业务逻辑),怎么填,都不会把楼盖歪。
准备好开始初始化项目文件夹了吗?