需要给HDU-CSwiki写后端入门教程了, 在这里罗列一下自己的想法.
这个教程教授的目标我更希望是能传达后端开发的心法, 能教会小白在面对一个自己从来没接触过的Web框架甚至新的编程语言时, 如何用同样的思路, 通用的知识, 通过阅读框架文档, 来实现自己想做的项目功能. 明确这个目标, 才不会把教程写的像是重写了一遍Web框架文档, 变得像Gin框架学习笔记之类的东西一样.
教学语言和使用框架的选择我想到了几个, Node.js+Express, Python+FastAPI, Go+Gin.
Express的网络开源教程我感觉是最多最主流的, 核心思想. 然而本人现在实在没接触过js的生态, 如果真要写那要么现学现卖, 要么喊谷子哥代写了. (谷子哥留个博客链接我好加友链(x
Python+FastAPI, 好处是语法比较简单, Python也是一个非常适合初学者入门而不被劝退的语言. 缺点是有可能会不得不引入一些框架核心的高级特性, 比如通过依赖注入获取db_session, 以及显式的异步调用, 以及会有解释型语言不可避免的运行时类型错误问题.
Go+Gin, 语法很简洁, 没什么语法糖, 但没有传统的类和对象, 而是指针和结构体, 这对于小白来说可能会提高使用难度. 但是可能不那么简单也能算做优点, 因为Go的语言特性会让它的代码比较好读, 很适合让学习者思考这些框架是如何一步步搭建起来的, 核心的特性本质上是些什么东西, 可以去甚至可以尝试自己搭建一个简单的Web框架.
我有种比较大胆的想法是, 先用Python+FastAPI+SQLModel做最基本的后端开发导入, 用短时间无痛构建一个完整且现代的服务, 目标是用最简单的代码讲述后端几个比较重要的概念, API和HTTP, 数据库, 经典的三层架构, 中间件, 容器, git协作. 然后用Go, 深入原理, 知其然而知其所以然, 同时也能向上引申, 从单体应用到微服务架构, 云原生的概念, 引出现代企业级后端的很多解决方案, k8s, redis, 消息队列等等.
无论怎么转变语言和框架, 但是后端开发的本质思路是不变的, 路由注册, 请求解析, 业务逻辑, 数据交互, 响应生成. 教程需要强调的是教会人共通的后端思维, 教会人如何根据框架文档写代码. 我自己也并不熟悉很多的框架, 比如我从来没有用过Gin去写过代码. 但是我想把我如何通过查一个陌生的框架的文档, 找到如何注册一个路由注册一个中间件, 把这个过程给显式地表达出来. 我认为这种能力远比精通某一个Web框架更重要. 可能可以设置一个作业, 比如通过查找文档, 自己找到如何在FastAPI中实现一个文件上传的功能.
然后可以介绍很多很不错的开源教程, 介绍很多好用的工具, Git团队协作需要的基本知识等等, 可以有很多外链
我不太确定这样的教程思路是否合适, 还是很希望多提点建议的.
让Gemini给我列了一个按照我那种大胆思路的教学大纲. 它的大纲我觉得还是太侧重于推崇Go语言这一点了. 我觉得每个人都可能会有自己的喜好, 我可能会更倾向于客观告诉学习者不同语言的特点, 优缺点, 鼓励多尝试, 找到适合自己的, 也提升不同语言的适应能力.
Gemini的大纲如下:
第一部分:Python + FastAPI + SQLModel (快速入门与核心概念构建)
核心定位: “信心助推器”。在最短的时间内,让一个新手无痛地构建一个完整、现代且专业的 API 服务,使其快速获得成就感,并对后端开发的核心概念有一个直观、感性的认识。
教学目标 (Teaching Goals)
快速上手: 让学生在几小时内,从零开始搭建起一个功能完整的 CRUD (增删改查) API。
建立自信: 通过 FastAPI 强大的自动文档和 SQLModel 的易用性,让学生感受到现代工具带来的开发乐趣,消除对后端的畏难心理。
掌握核心概念: 深刻理解以下通用概念:
路由函数 (Routing) 与 HTTP 方法 (GET, POST, PUT, DELETE)。
ORM 与数据库操作 (CRUD)。
API-服务-数据 的三层架构模式。
中间件 (Middleware) 的作用。
学会现代部署: 掌握使用 Docker 和 Docker Compose 对应用进行容器化部署的基本技能。
课程大纲 (Course Outline)
模块一:你好,后端世界! (第一个 API)
环境搭建: Python 与 venv 虚拟环境,使用 pip 安装 FastAPI。
Hello, World: 编写第一个 @app.get("/") 路由函数。
核心讲解: 什么是 HTTP?什么是 API?GET 和 POST 方法的区别。
“魔法”展示: 介绍并使用 FastAPI 自动生成的交互式文档 (Swagger UI),让学生可以立刻测试自己的 API。
模块二:让数据持久化 (数据库操作)
ORM 与模型: 介绍 SQLModel,定义第一个数据模型 (例如 Article 模型)。
连接数据库: 使用 SQLite 作为入门数据库,配置数据库连接。
实现 CRUD: 编写完整的增、删、改、查四个 API 接口。
深入 Pydantic: 讲解 FastAPI 如何利用 Pydantic 模型自动完成请求数据的校验。
模块三:代码的专业化之路 (三层架构)
问题引入: 当业务逻辑变复杂时,所有代码都写在路由函数里的坏处。
重构代码: 引入三层架构思想,将代码清晰地分离为:
API 层 (api/routes.py): 只负责处理 HTTP 请求和响应。
服务层 (services.py): 负责处理核心的业务逻辑。
数据层 (data/repository.py): 负责与数据库进行交互。
核心讲解: 讲解分层的好处:解耦、可测试性、可维护性。
模块四:中间件的妙用
概念讲解: 什么是中间件?它就像一个洋葱,层层包裹你的请求。
实践: 编写一个简单的中间件,例如记录每个请求的处理时间,并将其添加到日志中。
模块五:交付你的第一个后端服务 (Docker 容器化)
Docker 入门: 讲解什么是 Docker,它解决了什么问题。
编写 Dockerfile: 为我们的 FastAPI 应用编写一个 Dockerfile。
使用 Docker Compose: 编写 docker-compose.yml,一键启动我们的应用服务和数据库服务。
第二部分:Go + Gin + GORM (深入原理与架构进阶)
核心定位: “能力深化器”。在第一部分的基础上,用更接近底层的语言重新构建同一个应用,让学生从“知其然”到“知其所以然”。同时向上引申,打开通往微服务和云原生世界的大门。
教学目标 (Teaching Goals)
深入原理: 通过 Go 的显式特性,让学生深刻理解路由、中间件、ORM 等概念的底层实现本质。
培养底层思维: 从一个“框架使用者”转变为一个能思考性能、并发、内存管理的“工程师”。
掌握 Go 后端开发: 熟练使用 Go 语言、Gin 框架和 GORM 来构建高性能的后端服务,并掌握 Go 的指针、错误处理等核心特性。
衔接微服务架构: 理解从单体应用到微服务的演进过程,初步掌握 RPC (gRPC)、服务注册与发现、容器编排 (Kubernetes) 等核心概念。
课程大纲 (Course Outline)
模块一:换一种语言,见一片新天地 (Go 与 Gin)
环境与基础: Go 环境搭建、工作区概念、Go Modules 依赖管理。
向下探索 (1) - 路由的本质: 先用 Go 标准库 net/http 手写一个简单的 Web 服务器,暴露路由函数。
引入 Gin: 讲解 Gin 如何用更优雅的方式解决了 net/http 的路由和分组问题。
核心讲解: Go 的 struct 与指针、if err != nil 的错误处理哲学。用 Go 重新实现第一个 API。
模块二:在静态类型世界里操作数据 (GORM)
GORM 基础: 使用 GORM 定义数据模型并连接数据库 (如 PostgreSQL)。
重构 CRUD: 用 GORM 重新实现增删改查功能。
对比思考: 对比 GORM 和 SQLModel,探讨静态类型 ORM 和动态类型 ORM 的设计差异。
模块三:再论架构与中间件的本质
Go 的分层: 在 Go 项目中再次实践三层架构。
向下探索 (2) - 中间件的本质: 手写一个最简单的 Gin 中间件,让学生明白它就是一个接收 *gin.Context 并调用 c.Next() 的函数。揭示其中间件“责任链模式”的本质。
模块四:释放 Go 的力量 (并发编程)
Goroutine 入门: 讲解 Go 如何用 go 关键字轻松开启一个协程。
实践: 举例说明并发的威力,例如模拟一个需要同时请求多个外部服务的场景。
模块五:向上引申 - 从单体到微服务
理论篇: 讲解单体应用的痛点,引出微服务架构。介绍什么是 RPC,以及 gRPC 为何在云原生时代如此流行。
实践篇: 将我们的“文章服务”改造成一个独立的 gRPC 服务。然后,创建一个新的 Gin 项目作为 API 网关,由它来接收外部 HTTP 请求,再通过 RPC 调用后端的 gRPC 服务。
模块六:云原生之巅的惊鸿一瞥 (Kubernetes)
概念讲解: 什么是容器编排?为什么有了 Docker 还需要 Kubernetes (k8s)?
初体验: 编写简单的 k8s Deployment 和 Service 配置文件,将我们之前容器化的 Go 微服务部署到本地的 k8s 集群 (如 Minikube 或 kind) 中。
课程总结: 回顾整个旅程,学生已经从一个 API 的实现者,成长为一个理解现代后端架构的准工程师。
后续和计科协后端组成员讨论出的几个点:
- 课程形式: 线上文档, 放在wiki
- 课程大作业: Proj1, 单体python后端应用(待定), 需要有前端, 可能和前端组进行沟通, Proj2, Go微服务架构的电商系统(参考去年青训营), proj2可以不用前端或提供简陋前端. 都是小组作业(git协作).
- 教程编写周期: 暑假把第一部分教程完成, 完成一部分Proj2内容.
- 教程学习周期: 一个学期学习一个部分. 第一学期需要一部分时间学习基础编程, 考虑达到CS61A的水准之后再开始学习本课程, 第二学期Proj2耗时较长, 可能需要两三个月
- 编写教程不是最终目的, 培养一个入门的后端开发者才是最终目的, 在此基础上尽量让教程可以被复用. 因此我们需要在教学过程中及时跟进学习者的反馈, 并且讨论出合适的大作业评估方案. 之后才是进一步精进教程.
- 对于教程编写者, 需要考虑教程实现的性价比最高的方案, 避免投入产出不成正比导致的教程编写未半而中道崩殂. 不要为了这个教程把自己搞的太累.