Python
19 节 · 9.3小时
全面学习 Python。语法、数据结构、面向对象编程、生成器、异步编程、测试和打包。
查看课程Go
20 节 · 12.3小时
全面学习 Go 语言。从包、变量和控制流入手,深入探索结构体、接口、并发、测试、HTTP 服务器、数据库、泛型、性能分析,以及将真实二进制文件发布到生产环境。
查看课程React
17 节 · 10.2小时
从零学习 React。涵盖组件、状态、钩子、上下文、性能、路由、测试以及一个综合实战项目。
查看课程Linux
17 节 · 8.5小时
从命令行开始学习 Linux,涵盖文件、进程、网络、systemd、脚本编写以及运行实际服务。
查看课程Docker
13 节 · 6.6小时
从第一个容器到生产环境,全面学习 Docker。涵盖镜像、网络、数据卷、Compose、多阶段构建和安全镜像仓库。
查看课程Git
13 节 · 5.9小时
真正学会 Git。提交、分支、远程仓库、变基、冲突解决、恢复以及拉取请求工作流。
查看课程Kubernetes
14 节 · 8小时
从 Pod 到生产环境,全面学习 Kubernetes。涵盖部署、服务、入口控制器、Helm、扩缩容、RBAC 和可观测性。
查看课程Ansible
12 节 · 6.1小时
从第一个清单文件到多主机部署,学习 Ansible。涵盖 Playbook、角色、模板、Vault 以及幂等自动化。
查看课程Bash
12 节 · 5.7小时
学习 Bash 脚本编程,从变量到健壮的生产级脚本。涵盖循环、数组、信号捕获、set -euo pipefail 以及服务器引导启动实战项目。
查看课程Helm
10 节 · 5.4小时
学习 Helm,从安装 Chart 到编写自己的 Chart。涵盖模板、值、钩子、依赖项和发布。
查看课程GitLab CI
11 节 · 5.8小时
从您的第一个 .gitlab-ci.yml 开始学习 GitLab CI/CD, 逐步掌握包含产物、环境和部署的多阶段流水线。
查看课程Jenkins
11 节 · 5.3小时
从自由风格任务到声明式流水线、共享库、Docker 代理和流水线即代码,全面学习 Jenkins。
查看课程PostgreSQL
14 节 · 7.6小时
全面学习 PostgreSQL。涵盖 SQL 基础、连接查询、索引、事务、JSONB、EXPLAIN 及模式设计。
查看课程MySQL
13 节 · 6.8小时
从命令行到模式设计,系统学习 MySQL。涵盖 SQL 基础、连接查询、索引、事务、存储过程、EXPLAIN 分析及运维操作。
查看课程Web
14 节 · 5.9小时
学习 Web 的实际运作原理。HTTP、HTTPS、DNS、Cookie、会话、CORS、缓存、TLS、安全标头和速率限制。
查看课程TypeScript
18 节 · 7.7小时
TypeScript 就是在 JavaScript 之上加了一层类型系统。本课程从零讲起,覆盖类型、interface、generic、class、模块、工具类型、mapped/conditional 类型、声明文件以及编译器配置。
查看课程Vibe Coding
12 节 · 5.8小时
在一个 AI 搭档的陪伴下构建真实的软件。心态、工具、prompt 手艺、架构、调试、重构、扩展、团队协作与交付。你将对着一个实时的 DeepSeek 模型练习,正是在每节课里审查你代码的那个 AI。
查看课程Prompt Engineering
11 节 · 6.2小时
从 generative AI 中获得可靠的结果。学习 large language models 如何生成文本、每个好 prompt 背后的五条原则、few-shot 与 structured output、function calling、retrieval-augmented generation、自主 agents,以及 diffusion models 如何把 prompts 变成图像。最后你将把文本、图像和 agents 接线成一个可运行的应用。
查看课程Vibe 编程:基础
12 节 · 4.5小时
从零开始到你的第一个 AI 驱动的产品。为没有编程背景的创始人和构建者编写。学会把一个模糊的想法变成清晰的需求文档、提示 AI 来构建它、评判它做出的东西、修复坏掉的部分,并发布一个真实产品,而这些都不需要你自己写代码。每个概念都会在 EasyEnv 内部变成一次动手实践,你会提示一个真实的 AI,看着你的产品栩栩如生地诞生。
查看课程Vibe 编程:从原型到生产
12 节 · 5.5小时
把你在基础课程中建造的项目变成一个真实的产品,让陌生人也能信任。为不懂技术但通过提示 AI 来构建的创始人编写。你将添加真实的注册和登录、适当的数据层、对常见攻击的防护、测试、部署到一个实时地址、监控,以及一个扩展和维护的计划。到最后,你从一个原型开始,上线一个生产就绪的产品,而这些都不需要你自己写代码。
查看课程Vibe 编程:多智能体工程
12 节 · 5.3小时
停止只和一个 AI 助手工作,开始领导一个智能体团队。为已经上线生产产品的创始人编写,他们现在想以真实工程团队的速度进行构建。你将学会创建专化的 AI 智能体:一个产品经理、一个架构师、一个开发者、一个评审者、一个安全专家、一个 DevOps 工程师,给每一个赋予明确的角色,并像现代软件团队一样协调他们。你指挥团队,智能体去执行工作。到最后,你用完整的 AI 工程团队而不是单个助手来运行一个完整的软件项目。
查看课程Vibe 编程:高级工程
12 节 · 7.3小时
为已经在上线产品的人提供的 AI 辅助工程。为高级工程师和技术主管编写,他们知道怎样编码,现在想在专业标准上运行模型和智能体。上下文工程、规格驱动的开发、你自己的测试框架、验证循环、对生成代码的审核、遗留代码考古学、大规模迁移、调试、安全性,以及判断什么时候根本不应该使用 AI。
查看课程你的语言,你的节奏
每一门课程,提供 11 种语言
同样的实操课程、AI 导师和测验。选择你思考时使用的语言。
全部课程内容
22 门课程共 299 节。每一节都在真实机器上运行。
- 1. 你好,Python欢迎。如果你以前从没写过代码,那你来得正是地方。Python 是一门编程语言,也就是用一种看着有点像英语的东西,给计算机一步一步下指令。这一课结束时,你会跑完自己的第一行...
- 2. 数字与字符串欢迎回来。在第 01 课里你运行了第一个 Python 文件,也知道了变量就是一个贴着标签、用来装值的盒子。今天来看你最常用到的两类值:数字(用来做运算)和字符串(用来处理文本)。...
- 3. Asking the User a Question到目前为止,你写的程序每次点播放都做同一件事。跑十遍,得到同样的十个答案。它们有用,但还算不上工具,因为工具是一个人能拿去对着自己的问题使的东西。
- 4. 控制流到目前为止,你的程序都是从上到下一行接一行直着跑完的。写个问候语这样没问题,但大多数有用的程序需要做选择(「密码对上了就让他进来」),也需要重复干活(「给名单上的每个人发一条提醒」...
- 5. 列表与元组到目前为止,每个变量装的都是单独一个值:一个数字,一个字符串。而真实的程序通常需要把一小组彼此相关的值放在一起,比如一份来客名单,或者一个点的坐标。这一课介绍 Python...
- 6. 字典与集合欢迎回来。当顺序重要、而且你按位置取元素时,列表非常好用;但现实中很多数据是按名字组织起来的:一个人有年龄,一个国家有首都,一件产品有价格。本课介绍两种新的容器类型,它们能干净利落...
- 7. 函数欢迎回来。到目前为止,你用过几个 Python 自带的函数,比如 print() 和 len()。这一课你要自己写函数了。函数是一段起了名字的代码,你想运行多少次就运行多少次,每次...
- 8. 推导式 (Comprehensions)你已经会写一个 for 循环,一次一项地建起一个新的列表、字典或集合。推导式(comprehension)就是把同一个循环写在一行里的更短写法。结果一样,敲的字更少,而且眼睛习惯之...
- 9. 文件与 IO只往终端打印东西的程序,一结束就把一切都忘了。下一步,也是让 Python 忽然显得有用起来的那一步,是教它读写磁盘上的文件。这一课里你会打开一个文件、往里写几行、再读回来,并学会...
- 10. 模块与包 (Modules and Packages)到现在为止,每个程序都住在单独一个文件里。学的时候这样没问题,但真实的项目会把代码摊到很多文件上,好让每个文件都短小、专注。这一课告诉你 Python...
- 11. 类与 OOP欢迎来到 Python 里比较大的一个概念。到目前为止,你一直在用内置的工具(字符串、列表、字典、函数)来组织数据。本课你将学会写一个类,从而设计出属于你自己的一种种东西,并看到类...
- 12. 继承与组合第 10 课里你从零开始写了类。在真实的代码里,类很少独来独往。有时一个类是另一个类的更具体版本(Dog 是一种 Animal),有时一个类是用别的类当零件搭起来的(Car...
- 13. 异常处理你已经见过错误了。每当你把名称打错、除以零,或者向列表要一个不存在的索引时,Python 就会停下来,打印出一大片红色文字。这一大片文字叫做堆栈跟踪...
- 14. 迭代器与生成器 (Iterators and Generators)前面几课你已经会写 for item in something: 了。这一课我们掀开盖子,看看每次这个循环跑起来时 Python 到底在做什么。看明白之后,只要再学一小点新语法...
- 15. 装饰器 (Decorators)欢迎来到 Python 比较难缠的话题之一。装饰器(decorator)是你套在一个函数外面的一层小包装,让它多出一点额外行为(记日志、计时、做一次权限检查),而不必改动这个函数自...
- 16. 上下文管理器 (Context Managers)欢迎回来。从第 08 课开始,你一直在写 with open(...) as f:,并且相信代码块结束时文件会被关掉。这一课要把这个盒子打开。你会弄明白 with...
- 17. 并发:线程与异步 (Async)欢迎回来。到目前为止,我们的程序都是一次做一件事,从上到下,这样也挺好。麻烦出在程序把大部分时间花在等待上的时候(等一个网站回应,等一个文件加载,等数据库回话)。这些等待全是浪费掉...
- 18. 使用 pytest 进行测试欢迎回来。到现在为止,你都是运行代码,然后用眼睛看输出对不对。几行代码这样还行,可你一改动什么东西,就得把所有东西重新看一遍。测试会替你做这件重新检查的活,每次都做,几秒钟就完事。...
- 19. 打包与部署到目前为止,你写的 Python 都是自己敲 python something.py 跑起来的,而且也只有你自己在跑。这一课讲的就是那一小步,基本上是机械操作:把一个脚本变成别人可...
- 1. 你好,Go欢迎。如果你以前从来没写过代码,那你来对地方了。Go 是一门编程语言,也就是一种给计算机下达一步步指令的方式,写出来的样子有点像加了不少标点的英文。学完这一课,你会跑通自己写的第一...
- 2. 变量与类型上一课你打印了一段固定的文本。真正的程序需要记住会变的东西:客户的名字、一件商品的价格、某个勾选框有没有勾上。变量是一个名字,代表存放在内存里的某个值,这样你的代码就能提到"价格"...
- 3. 控制流:if 与 for到目前为止,你写的每个程序都是从上到下一行接一行地跑,路上没有任何选择。真实的程序需要作出反应:大额订单收另一种运费,对成年人和未成年人打印不同的话,反复向服务器要响应直到拿到一个...
- 4. 函数到目前为止,你写过的每个程序都活在 func main() 里面。十来行代码这样写没问题,但真实的程序常常需要在不止一个地方算同一件事:校验年龄、格式化价格、判断一个数是不是偶数。...
- 5. 切片(slices)与映射(maps)到目前为止你用过的每个变量都只装一个值:一个名字、一个年龄、一个价格。而现实中的大多数问题涉及的是一组东西:一份学生名册、一个购物车、一张按商品名查价格的对照表。Go...
- 6. 结构体(structs)与指针(pointers)到目前为止,这门课里你写过的每个变量都只装着一个孤零零的值:一个数字,一个字符串,一个切片。可现实中的数据很少是单个出现的。屏幕上的一个点,需要 x 和 y...
- 7. 方法(methods)与接口(interfaces)上一课教你把相关的字段打包进一个结构体,但结构体本身只装数据,没有行为。如果你想让 Rectangle 自己会算面积,要么写一个普通函数、把 Rectangle...
- 8. 错误处理在这门课程里,你已经不止一次敲下 if err != nil,却没有停下来问一句 err 到底是什么、又从哪来。函数会以各种平常且在意料之中的方式失败:调用方要的文件不在磁盘上,调...
- 9. 模块(modules)与项目结构这门课程里你到目前为止写过的每个程序,都只是一个文件,一条命令就能运行。真实的 Go 项目几乎从来不会一直这么小:代码随着增长会拆到许多文件和文件夹里,其中一部分会被别的程序共用,...
- 10. 迷你 CLI 综合项目到目前为止,你写过的每个程序,输入都是硬编码在源码里的。想加另外几个数字,就得改文件再跑一遍。学习阶段这样没问题,可作为工具就毫无用处,因为工具是你交给别人、由别人来决定它处理什么...
- 11. 标准库之旅学任何一门语言,都会有那么一刻:你不再琢磨循环怎么写,开始琢磨怎么读一个文件,怎么格式化一个日期,怎么把自己的数据变成别的程序看得懂的东西。在很多语言里,答案是出门采购:找一个包,...
- 12. 测试与基准测试(benchmarks)你写了一个函数,运行程序,看到正确的答案,然后就往下走了。一周后你改了旁边的某样东西,这个函数悄无声息地开始对负数返回错误结果。一个月里没人发现。软件就是这样坏掉的,这不是因为程序...
- 13. 协程(goroutines)与通道(channels)你的程序要下载二十个文件。按最普通的写法,它下载第一个,等着,再下载第二个,再等着,如此往复。这段时间里几乎全部都在干等,等一个比处理器慢上几百万倍的网络。如果这些等待能重叠起来,...
- 14. 并发模式协程(goroutine)和通道是原材料,就像木头和螺丝。知道它们是什么,并不等于知道怎么做一把椅子。实践中,几乎所有并发的 Go...
- 15. 泛型(generics)你写了一个函数,从一个 int 切片里找出最大的数。接着你需要一个 float64 版本,于是复制一份,改两个词。然后又要一个 string...
- 16. HTTP 服务器在大多数语言里,"写一个 Web 服务"的第一步是挑一个框架,而且这个选择很要紧,因为框架决定了路由怎么工作、一个处理器长什么样、你又该怎么把各种行为组合起来。在 Go...
- 17. 使用 database/sql 的数据库到目前为止你写的每个程序,一退出就把什么都忘光了。对于一个把输入变换一下就收工的小工具来说这没问题,但凡涉及用户、订单、会话或历史记录,它就毫无用处。Go...
- 18. 性能与分析某天有人说服务变慢了,你打开代码,一眼就看到那个"肯定是它"的循环。你把它重写了,现在写得聪明多了,而服务和之前一样慢,因为真正的开销在三层调用之外的一次 JSON...
- 19. Go 语言中的设计模式程序会越写越大。一个两百行时还完全说得通的文件,慢慢变成这样一个地方:改动一小处,三个文件之外的东西就坏了;测试越来越慢、越来越难写,直到干脆没人写。这不是能力不够,而是当程序里任...
- 20. 部署与生产一个能在你笔记本电脑上跑起来的程序,和一个你愿意放着通宵运行的程序之间,是有差距的。填上这道差距不是什么光鲜的工作,多半是机械性的活,这其实是好消息:每次冒出来的都是同样那五件事,...
- 1. 什么是 React?欢迎。如果你一行 JavaScript 都没写过,也不太清楚“框架”是什么,那你来对地方了。本课结束时,你会知道 React 是什么,会有一个小小的 React...
- 2. JSX 与组件 (Components)上一课里,你看到一个组件返回了看着像 HTML 的东西:return <h1>Hello, React</h1>;。那时你多半觉得有点不对劲。JavaScript...
- 3. 属性 (Props)到目前为止你写的每个组件都是写死的。Greeting 永远只向同一个名字打招呼,Card 永远只显示同一段文字。做演示够用,但这完全违背了组件存在的意义:写一次,然后在很多地方带着...
- 4. 使用 useState 管理状态 (State)到目前为止你写的每个组件,只要传进去的属性相同,渲染出来的结果就永远相同。对一个标题或一张卡片来说这没什么问题,但只要需要让用户盯着页面就能改动点什么,它立刻就撑不住了:点一下就往...
- 5. 处理事件一个只会依据属性和状态来渲染的组件,本身还谈不上可交互:必须有东西察觉到用户点了按钮、在字段里打了字或者按了某个键,并把这个动作转成一次状态更新。上一课你已经接过一个...
- 6. 条件渲染与列表你用过的几乎每一个界面,都会根据某个条件显示这个而不是那个:一条"你有新消息"的横幅,只有在真的有新消息时才出现;一个加载中的转圈图标,只在加载过程中显示。而几乎每一个界面也都会显...
- 7. 表单与受控输入 (Controlled Inputs)在普通的 HTML <input> 里敲一个字母,浏览器自己就把事情办完了:DOM 元素悄无声息地记住你输入的内容,不必告诉别人。只要应用不需要知道框里此刻装着什么,这样就够用了。...
- 8. 使用 useEffect 实现副作用 (Effects)到目前为止,组件的工作一直是:看一眼自己当前的属性 (props) 和状态,然后回答一个问题,此刻屏幕上该显示什么。只要输入相同,这个答案每次都应该一模一样,就像计算器算 2 +...
- 9. 数据获取真实的应用几乎没有哪个能只靠用户屏幕上已有的数据活下去。总有那么一刻,某个组件需要向服务器要点东西:一份用户列表、某个商品的详情、一页搜索结果。在答案回来之前,有一段时间组件手里什...
- 10. 组件组合 (Component Composition)你做了一张带边框和阴影的卡片,看着挺不错。现在你还要用同样的卡片去包一张照片,去包一个登录表单,再去包一串评论。这时候很容易做的事,是把卡片复制三份,或者给它加上能想到的每一种内容...
- 11. Context 与 useContext你的应用有一个深色模式开关。开关本身在设置面板里,可真正需要知道这个值的,是页面里一张卡片、卡片里一张表格、表格里往下第八层的一个按钮。想靠属性把值从这头传到那头,中间每一个组件都...
- 12. useReducer结账表单一开始都很简单。先有一个值,于是加一个 useState。接着需要一条错误提示,那就再加一个...
- 13. 自定义钩子 (Hooks)你写过一个能开能关的抽屉面板。三行 useState,加一个把布尔值翻过来的处理函数。接着下拉菜单也是同一套,弹窗又是同一套,「显示更多」链接还是同一套。现在有四个组件装着同样的六...
- 14. 性能与记忆化 (Memoization)你的应用里有一张两千行的表格,上面还有一个搜索框。每敲一个键都很沉重:你打字,半秒钟之后字母才出现在屏幕上。没有任何东西坏掉,代码看上去也很合理。真正发生的事情是,搜索框里的一个字...
- 15. 使用 React Router 进行路由到目前为止你写出来的东西都待在同一个地址上。整个应用只有一个页面,想让用户看到什么,就用状态把它显示出来或藏起来。这样做能撑一阵子,直到有人想把设置界面收藏成书签,或者想把某一个用...
- 16. 测试 React 组件 (Components)你改了共享组件里的一行代码,然后花二十分钟在应用里到处点,确认别的地方没被弄坏。下周再改一次,又是同样的二十分钟。到最后你干脆不再动它了,因为每次都要这样核查一遍,实在不划算,于是...
- 17. 顶点项目:待办事项应用到目前为止,每一课都只塞给你一个想法,外加一个围着它转的小例子。真实的应用不是这样。在真实的应用里,状态、列表渲染、表单、持久化和 URL...
- 1. Shell 与初识命令欢迎。如果你从来没用过终端,那你来对地方了。终端是一个窗口,你在里面靠敲字跟计算机对话。你敲一条命令,按回车,计算机就把答案敲回来。上完这一课,你会跑过五条真实的命令,屏幕上那一大...
- 2. 文件系统与导航上一课你跑了几条命令,读了它们的输出,但一步都没挪动过。你敲的每一条命令都发生在同一个位置上。这就要变了,因为 Linux...
- 3. 文件与权限你现在已经能在文件系统里找到路了,但到目前为止你只是查看那些本来就存在的文件。真正的工作意味着创建文件、往里面填内容、复制和重命名它们,最后再把不需要的删掉。而且,只要一台机器上不...
- 4. 文本工具:grep、sed、awkLinux 系统上几乎一切都是文本。配置文件是文本。日志是文本。机器上所有用户的名单是一个文本文件。命令的输出是文本。这是有意为之的设计,不是巧合,而它意味着有一项技能到处都用得上...
- 5. 管道(Pipes)与重定向上一课里你几乎是顺手就用 | 搭起了几条小流水线,把一个文本工具的输出送进另一个。现在该慢下来,看看这个字符到底在干什么,因为它并不是专为 grep 和 awk...
- 6. 进程与信号敲一条命令按下回车,总得有个实实在在跑起来的东西去执行它。那个东西就是进程(process),也就是操作系统给"正在执行中的程序"起的名字。一台 Linux...
- 7. 用户和组到目前为止你运行的每一条命令,都是以某一个特定账户的身份运行的,却从没有人问过你是谁。但 Linux 从第一天起就是为共享而设计的:...
- 8. 包管理有人跟你说"装个 htop 就行了"。在 Windows 或者 Mac 上,你得去找一个网站,下载安装程序,一路点下去,然后祈祷自己拿到的是正版。在 Linux...
- 9. 网络基础“站点挂了。”你打开一看,从自己的笔记本电脑访问一切正常,从服务器上却不行。两台机器之间的某个环节出了问题,而“网络”是个大得没边的地方。好消息是,几乎每个网络问题都归结为四个问题...
- 10. Shell 脚本编程你摸索出了一串六条命令的操作,能干一件有用的事:检查一个目录,建一个文件夹,复制几个文件,打印一份小结。它管用。明天你还需要它,于是凭记忆重新敲一遍,结果有一个实参敲错了。脚本就是...
- 11. systemd 服务你写了个能用的脚本。运行它,它把活干完,然后你一关终端,它就跟着会话一起死了。你希望它在机器开机时自动启动,崩溃后能自己回来,还能把输出写到某个你以后能翻看的地方。手工做到这些,工...
- 12. SSH 与远程访问你真正要用的那台机器在别处。可能是数据中心里的一台服务器,可能是云上的一台虚拟机,也可能是某人桌子底下的一台构建机。你需要在它上面开一个终端外壳,需要在它和本地之间来回传文件,而且...
- 13. 日志与记录昨天还好好的服务,今天不干活了。谁都没动过任何东西,至少大家都这么说。你可以对着配置文件盯上一个小时,也可以去读机器在出问题的那段时间里自己记下来的东西。Linux...
- 14. 磁盘与存储“No space left on device.”(设备上已无剩余空间。)服务停止写入,数据库拒绝连接,下游的一切跟着倒下,全都是因为某个你听都没听过的目录悄悄长大了。存储这类故...
- 15. Cron 与定时任务你写了个备份脚本,跑得漂亮极了,直到某天晚上你忘了跑它。服务器例行要做的事几乎都是这个样子:半夜轮转日志,每五分钟刷新一次缓存,周一早上发一封报表邮件。这些事没有一件难,可只要靠人...
- 16. 性能与监控有人发消息给你:「服务器感觉很慢。」你拿到的就这么一句。慢可能是某个进程失控,可能是内存耗尽,可能是磁盘跟不上,也可能是网络问题伪装成了上面三种。这时候人很容易凭猜测去重启一堆东西...
- 17. 顶点项目:服务器配置到目前为止,每次讲的都是一个知识点。真实工作从来不是一次只有一个知识点。有人扔给你一台光秃秃的 Ubuntu...
- 1. 什么是 Docker你在自己电脑上做出了一个东西,跑得好好的。你把它发给队友,或者放到服务器上,它就坏了。操作系统不一样,某个库的版本不一样,某个文件待的文件夹不一样。这是软件行业最老的头疼事之一,而...
- 2. 你的第一个容器 (container)在理论上你已经知道,镜像是一个封好的包裹,而容器是你真正把它打开之后发生的事情。理论能带你走的距离有限。这一课里,你要往上一课那座共享的房子里领进真正的客人:你会启动、列出、停止和...
- 3. 镜像 (image) 与 Dockerfile到目前为止,你打开的都是别人封好的袋子:hello-world、ubuntu、alpine。拿来探索没什么问题,但这解决不了第一课一开始就提出的那个问题:让你自己的程序在每台机器上...
- 4. 构建自定义镜像 (image)上一课那个 Dockerfile 从头到尾只做了一件事:装软件。它没有把你自己的任何文件带进镜像,也没有控制过它的命令究竟在镜像里的哪个位置执行。真正的应用程序两样都需要:把源代码...
- 5. 容器 (container) 网络你在一个容器里跑起过一个 web 服务器,看着它报告自己正监听 80 端口,然后在浏览器里打开...
- 6. 卷 (volume) 与持久化在容器里跑一个数据库,插进去几行数据,把容器删掉,再启动起来,那几行数据就没了。不是损坏,也不是藏起来了,是没了,就好像你从来没敲过一样。人人都会被这件事绊倒一次,而解决办法并不是...
- 7. Docker Compose到现在为止,启动一个像样的应用要敲四条命令,而且没有一条是短的。创建网络。创建卷。带上环境变量、卷和网络启动数据库。带上网络和对外发布的端口启动 web...
- 8. 多阶段构建 (multi-stage builds)用最直白的方式给一个编译型程序构建容器镜像,你会得到一个吓人的结果:一个 900 兆字节的镜像,里面真正有用的内容是一个 8...
- 9. 环境变量与密钥镜像在你自己的笔记本电脑上跑得很好。现在它要在预发布环境里连另一个数据库,在生产环境里再连第三个,而生产库的密码绝不能被任何拉得到这个镜像的人读出来。为此构建三个镜像显然是错的:它...
- 10. 健康检查 (healthcheck) 与重启策略栈已经起来了。docker ps 说所有东西都在运行,可站点返回的全是错误。你一路查下去,发现 API 比数据库先启动,第一次连接就失败了,从那以后一直在返回...
- 11. 镜像 (image) 优化与安全几乎没有哪起跟 Docker 有关的生产事故真的是 Docker 本身的缺陷。反复出现的情形要平淡得多:两年前用 node:latest 构建出来的一个镜像,以 root...
- 12. 注册表 (registry) 与发布到目前为止你构建的每一个镜像都只存在于一个地方: 本机上的 Docker 守护进程里。只要运行它的人只有你,这没什么问题,而这也恰好是"在我机器上明明是好的"变成真麻烦的那个点,因...
- 13. 综合实战:部署完整技术栈到目前为止,每一课都只讲一件事,验证的对象也都是一个只会打印一行字符串的容器。学一条指令本该这么学,但这样做会把真正难的部分藏起来:...
- 1. 初始化与你的第一次提交 (commit)设想你在文本编辑器里写一篇文章,每改出一点像样的东西,就把全文另存一份新名字:essay-v2、essay-v3、essay-final、essay-final-actually。...
- 2. 状态、差异和日志上一课你做了一次提交,那就是恰好一个快照。真实的工作是反复修改文件,而每次提交之前,你都会想知道三件事:我改了什么,具体改的是哪几行,以及我已经保存过什么。这一课讲的就是回答这三个...
- 3. 分支 (branch) 与合并 (merge)到目前为止你做的每一次提交,都排在同一条叫做 main 的历史线上。真实的工作很少这么简单。你想试一个想法,又不愿意冒险动到能正常跑的版本;或者两个人要同时做不同的功能,还不能互相...
- 4. 解决合并 (merge) 冲突Git 第一次拒绝把合并做完的时候, 感觉像是哪里坏了。什么都没坏。合并冲突发生在两个分支用不同的方式改动了同一个文件的同一批行, 而 Git...
- 5. 远程仓库 (remote): push、pull、fetch到目前为止你做的一切都只存在于自己的机器上。练手时这没问题,但真实的项目需要一份别人或者别的机器能够访问的共享副本:一台服务器上放着同一个仓库,让所有人的工作最终汇到一处。Git...
- 6. 暂存 (stash) 与择优拣选 (cherry-pick)改到一半,文件动过了,什么都没做完,这时同事发来消息:「能不能马上看一下 main 上的一个缺陷?」你没法把做了一半的活提交上去,因为一次提交应该让项目停在一个自身说得通的状态上,...
- 7. 变基 (rebase)周一你从 main 分出去,打算加个搜索框。现在是周四,你攒了三次提交,与此同时另外四个人已经往 main...
- 8. 交互式变基 (rebase) 与提交压缩 (squash)真实的工作不会只落成一个干净的提交。你提交一次, 五分钟后发现一个拼写错误又提交一次, 接着因为第一次提交前忘了保存某个文件,...
- 9. 标签 (tag) 与发布 (release)像 main 这样的分支是一个会移动的书签。它指向最新的那个提交,而你一提交,它就往前滑,指到新的地方去。你干活的时候要的正是这个效果,但有一件事它完全做不了:永久地宣布“我们发布...
- 10. 分支 (branch) 工作流你到目前为止学的所有东西,建分支、合并、变基、打标签,讲的都是 Git 的命令做了什么,但没有一条告诉你:什么时候该开一个分支,这个分支该留多久,谁可以直接动 main。这些事...
- 11. 恢复丢失的工作总有那么一次,你敲下一条命令,回车,看着终端不动声色地打印出一行盖棺定论的话,然后意识到自己刚刚删掉了一整天的活。谁都干过。好消息是,而且这是整个 Git...
- 12. 钩子 (hook)每个团队都有那么一条人人赞同、又人人会忘的规矩。提交前先跑一遍格式化工具。凌晨两点加的那句调试用的打印语句别提交上去。带着密码的文件别提交。这些规矩写在一个没人看的 wiki...
- 13. 综合实战: 完整的 Pull Request 流程到目前为止,学的都是一块一块的:这里一个提交,那里一个分支,历史需要理顺时来一次变基。在真实的工作里,这些零件是作为一整套固定流程出现的,一周要重复好几遍,而且这套流程有名字。你把...
- 1. 什么是Kubernetes欢迎。如果你用过一两次 Docker,现在总听到 Kubernetes 这个词却又说不太清它是什么,那你来对地方了。这一课结束时,你会清楚 Kubernetes...
- 2. 您的第一个 Pod上一课你和集群对过话,但从没让它跑起任何东西。这一课要补上的就是这块空缺。Kubernetes 不像 docker run 那样直接运行一个容器,它运行的是...
- 3. Deployment 与 ReplicaSet上一课结尾你已经亲眼见过:删掉一个裸 Pod,或者让它崩溃,就没有任何东西会把它拉回来。做五分钟的实验这样没问题,但只要是你真正在乎、希望一直跑着的东西,这就完全不够用。没人愿意守...
- 4. Service你已经有一个 Deployment 在维持三个 Pod 的存活,这解决了 Pod 死掉之后回不来的问题。但它没有解决第二个问题,而这个问题在你真的想跟这些 Pod...
- 5. 探针(Probes)与自愈一个已经崩溃的进程好办。它没了,操作系统发现了,Kubernetes 再起一个新的。难办的是那种还在运行、却已经不干活了的进程:数据库连接池死锁了的 Web...
- 6. ConfigMap 与 Secret眼下如果容器需要一项设置,比如日志级别或者数据库用户名,唯一能放的地方就是烤进镜像里。这样能撑到某一天:预发布环境要用一个跟生产环境不一样的值,或者每位开发者自己的测试集群各要一个...
- 7. Volume 与持久化存储到目前为止你部署的一切,都是故意让它失忆的。Pod 起来,干完活,死掉的时候,它写过的那套文件系统跟着一起没了。对一个只管发网页的 Web...
- 8. Namespace 与 Label一个只有六个 Pod 的集群很好办。运行 kubectl get pods,全部尽收眼底,每一个是干什么的你都清楚。而一个跨四个团队、三套环境、装着六百个 Pod...
- 9. Ingress你已经能把流量送进集群了。NodePort 会在每个节点上打开一个高位端口,LoadBalancer 会向云厂商要一个公网...
- 10. Helm 基础给 Kubernetes 写到第五个 Web 应用,你会注意到一件让人提不起劲的事:你在反复敲同样的 YAML。一个 Deployment、一个 Service、一个...
- 11. 扩缩容与水平Pod自动扩缩器(HPA)设想一家超市有十条收银通道,但当班的只有两个收银员。早上九点,这完全够用。傍晚六点,队伍排到了店的最里头,店长得亲自走过去,手动多开四条通道。每天傍晚都得来一遍,永远如此。
- 12. RBAC这门课里你运行的每一条命令,都是以你自己(集群管理员)的身份发出去的,而集群对它们全都说了"可以"。你一个人学的时候这没问题。可只要来了第二个人,或者集群内部有个应用程序需要跟...
- 13. 可观测性凌晨三点,有东西出问题了。用户看到了错误。你手上是一个装着四十个 Pod 的集群,而对眼下处境唯一诚实的描述是:你不知道是哪一个出了毛病,也不知道问题是一小时前才开始的,还是一周前...
- 14. 毕业项目:部署一个技术栈到目前为止,每一课都只讲一种对象,而且每一种都是单独演示的。学东西该这么学,但真实的系统从来不是这个形状。一个真实的应用程序是这些对象里的几个,只有凑在一起才说得通:...
- 1. 什么是 Ansible欢迎。如果你这辈子还没自动化配置过一台服务器,那你来对地方了。在动手运行任何东西之前,我们先把 Ansible 究竟是什么、人们为什么宁愿用它也不愿堆一大摞 shell...
- 2. Inventory 与 Ad Hoc 命令你已经知道 Ansible 通过 SSH 连接机器,而且它描述的是期望达到的状态,不是一步步的操作过程。但在 Ansible...
- 3. 你的第一个 Playbook临时命令适合做一次快速检查,或者打一个一次性的补丁,但它撑不起真正的环境搭建。你得记住每条 ansible...
- 4. Task、Module 和 Handler设想有一份剧本在管理一台 Web 服务器。里面有三个任务,各自改动一个不同的配置文件,而只要其中任意一个改动了,服务就得重启一次才能读到新配置。最直白的做法是把重启单独写成一个任务...
- 5. 变量与 Facts写一份剧本,把端口号、站点名字、软件包版本都直接敲进任务里,它能跑通,但只在你测试过的那一台机器上跑得通。把同一份剧本指向另一台 IP...
- 6. 使用 Jinja2 的模板把一个固定不变的文件复制到每台机器上,这套做法一直挺好用,直到某台机器需要换一个端口号、换一个主机名,或者需要一段只对部分服务器生效的配置。到那一步,你只剩两个都不怎么样的选择:给...
- 7. 循环与条件语句安装一个包的剧本 (playbook) 只需要一个任务。但安装十个包的剧本不该写成十个几乎一模一样、只有包名不同的任务;同样,只需要作用在部分机器上的剧本,也不该不加区分地把每个任...
- 8. Roles 与 Galaxy迟早会遇到这种情况: 两个项目都需要一台 Web 服务器, 于是你有了两个剧本 (playbook), 两边都在安装 nginx, 都在下发同一份配置模板,...
- 9. Vault 与密钥到目前为止你写下的所有东西,给谁看都无所谓。主机清单、模板、角色的默认变量,就算被陌生人读到也伤不到你。直到你写到创建数据库用户的那个任务,它需要一个密码。你把密码敲进...
- 10. 标签与调试你的剧本 (playbook) 一开始只有六个任务,改一次跑一次很轻松。现在它变成了四个角色、五十个任务,跑一趟要三分钟,而你只是在改 nginx...
- 11. Collections 与 Plugins这门课里的每一个模块名字都带着一段前缀,你可能一直悄悄忽略它:ansible.builtin.copy、ansible.builtin.template、ansible.built...
- 12. 综合实战:多主机部署到目前为止,每一课都是孤立地讲一样东西:这里一份主机清单,那里一个角色,一个模板,一个加密文件,几个标签。学的时候只能这么学,可你在真实工作里碰到它们时不是这个样子。真实的基础设施...
- 1. 什么是 Bash欢迎。如果你这辈子从没打开过终端,那你来对地方了。在敲下第一条命令之前,我们要先花十分钟把两件事弄清楚:Bash...
- 2. Shebang 与你的第一个脚本如果“脚本”这个词听上去还像是只有真正的程序员才写得出的东西,别紧张。脚本无非是一个文本文件,里面列着一串命令,而读完这一课,你就会写出一个、跑起来,并且完全明白它为什么能跑。这里...
- 3. 变量与引号如果你从来没用过变量,不用担心。它是整门课里最简单的概念之一,而 Bash 的这一套差不多是最朴素的写法了。这一课还会讲引号,几乎每个人都会在引号上栽一次跟头,而一旦想通了,就再也...
- 4. 条件语句与测试到目前为止你写的每个脚本,不管遇到什么情况都照着同样几行跑。真实的脚本需要做决定:"只有当这个文件存在时才做这件事"、"只有上一条命令成功了才继续"。这一课教你 Bash...
- 5. 循环到目前为止,你写的每个脚本都是从上到下,每一行只跑一次。脚本短的时候这没问题,可真实的工作总是重复的:重命名五十个文件、检查十台服务器、给名单上的每个人打一句招呼。把同一条命令敲五...
- 6. 函数写到现在,你的脚本已经开始出现重复了。也许你在三个不同的地方打印带时间戳的日志,又或者每次改动文件之前都要检查它是否存在,同样的三行代码反复出现。复制粘贴当然管用,直到有一天你要修...
- 7. 数组到目前为止,一个变量只装一个值。name="Ada" 装的是一个字符串。如果你想装三个名字,要么得准备 name1、name2、name3...
- 8. 字符串与算术展开你会不断遇到这样的情况:手里的变量装着的东西,跟你要的差那么一点点。你要的是文件名,它给的是完整路径。你要的是扩展名,它给的是文件名。一句话里只有一个词需要换掉。报告里要用的两个数...
- 9. IO 重定向与管道你在 Bash 里运行的每一条命令, 底层都接着三条各自独立的通道, 不管你有没有察觉到。可以想象一台信件分拣机: 信从一个投口进去, 分拣成功的信从一个出口出来,...
- 10. 错误处理与 trap到目前为止你写的每个脚本,都默认事情会顺顺利利。找不到文件的命令、不存在的目录、变量名里的一个拼写错误:按默认设置,Bash...
- 11. 调试与最佳实践迟早有一天,你写的脚本会做出你没让它做的事。它删错了文件,跳过了你确信一定会跑的循环,或者一声不响地产出一个空结果。你一行一行读过去,觉得写得没毛病,可离答案还是一样远。问题几乎从...
- 12. 综合实战:服务器引导脚本一台全新的服务器,就是一台上面什么都没有的机器。总得有人去装 web 服务器、建好你登录用的账户、把 SSH...
- 1. 什么是 Helm欢迎。这门课默认你已经在我们的 Kubernetes 课程里(或者别的地方)接触过 Kubernetes。如果 Deployment、Service...
- 2. 安装 Chart大多数你要用 Helm 的时候,你并不是在写 Chart,而是在安装别人的 Chart。Bitnami 的...
- 3. Chart 结构你已经装过别人写的 Chart,也看着 Helm 把它变成了跑起来的 Pod。可有个明摆着的问题还没解决:这东西里面到底装了什么?Chart...
- 4. Values 与 Templating打开你脚手架生成的 Chart 里的 templates/deployment.yaml,你会发现它并不完全是一份 Kubernetes...
- 5. Helpers 与命名 Template打开一个包含两个以上 manifest 的 chart,一种模式会立刻跳出来:同样的几行代码在每个文件里都出现一遍。Deployment 会根据 release 名称和...
- 6. 依赖项与 Subchart你部署的东西几乎没有一个是真正孤零零站着的。一个 Web 服务通常希望旁边有个缓存。一个 worker 需要队列。一个 API...
- 7. Release 管理第一次安装一个 Chart 是最容易的部分。真正的工作从那之后才开始:新镜像发布了,某个配置值要改,有人为了黑五把副本数调高,最后总会上线一个根本跑不起来、必须退回一小时前那个样子...
- 8. Hook 与测试有些活儿没法干净利落地塞进“渲染一份清单再应用它”这个模子。数据库表结构得在新的应用 Pod...
- 9. 发布 Chart你的 Chart 能用了。运行 helm install myapp ./mychart 就能得到一个跑起来的应用程序,也就是说难的部分已经过去了。现在一位同事想部署它,你的选择是...
- 10. 综合练习:你自己的 Chart到目前为止,每一课都递给你一个现成的 Chart,再让你改其中一处。这教会了语法,却把最难的部分藏了起来,那部分是设计。一个 Chart...
- 1. 什么是 CI/CD设想一个团队,还在用老办法发布一个 Web 应用。有人做完一个功能,在自己的笔记本电脑上跑一遍测试(也可能干脆跳过,因为那天是周五),手工把几个文件拷到服务器上,然后指望别的地方没...
- 2. 你的第一个流水线 (pipeline)词汇你现在都有了:流水线、阶段、作业、运行器。可有词汇不等于有把握。此刻,「GitLab 会在你每次推送时自动运行你的脚本」还只是别人下的一个论断,是你读来的,不是你亲眼看着发生的...
- 3. 任务 (jobs) 与阶段 (stages)上一课里你的流水线只有一个作业 (job)。真实项目从来不会一直这么小。一个真实的项目要编译代码、跑单元测试、跑代码检查,可能还要跑集成测试,最后部署,而这里的每一件事都是一个独立...
- 4. 变量和密钥一条不管谁推送、推到哪个分支都表现得一模一样的流水线, 分不清预发布环境和生产环境, 也分不清一把真正的部署密钥和一个占位符。任何正经的流水线都需要在运行的那一刻知道一些事情:...
- 5. 工件 (artifacts) 和缓存 (caches)流水线里的每个作业都从仓库的一次干净检出开始,跑在一个用完即弃的环境里,作业一结束这个环境就被扔掉。这是有意为之的设计,正是它保证了一个作业不会悄悄依赖另一个作业留下的残余状态。但...
- 6. 规则 (rules) 和条件任务 (jobs)到目前为止你写的每一个作业 (job),不管提交落在哪个分支上、也不管流水线 (pipeline)...
- 7. Docker 任务 (jobs) 和服务 (services)流水线的运行器就是一台空白机器,默认情况下它根本不知道你的项目需要 Python 3.12、某个特定版本的...
- 8. 环境与部署部署作业跑通了。它执行 scp、kubectl apply 或者一个 Ansible 剧本,结果变绿,新版本上线了。接着有人问了一个从流水线页面上答不出来的问题:预发布环境现在到底...
- 9. 包含 (includes) 和模板 (templates)写到第三个项目的时候,.gitlab-ci.yml 就开始互相押韵了。同一个静态检查作业。同一套测试环境,连缓存键都一样。同一段 docker-in-docker...
- 10. 运行器 (runners)这门课到目前为止讲的都是对工作的描述。你写下 script: 里的几行,GitLab 读到它们,然后不知怎么就冒出一个容器,跑完你的测试,再把结果报回来。这个"不知怎么"一直是免费...
- 11. 综合项目. 构建、测试、部署这门课的每一课都拿一个玩具作业教一个关键字。学关键字是这么学的,但真正遇到它们时不是这个样子。真实的流水线是所有这些东西一起上,而难点从来不在某一个关键字身上,而在于怎么把它们接起...
- 1. 什么是 Jenkins随便打开一家银行、电信运营商、医院信息科,或者一家做了十年以上软件的游戏工作室的招聘页面,你都能找到提到 Jenkins 的岗位。乍看之下这挺奇怪。Jenkins...
- 2. 你的第一个 Freestyle Job关于 Jenkins 是什么、它为什么能一直留存下来,你已经读过了。但这些在你亲眼看到 Jenkins...
- 3. 您的第一个声明式 Pipeline回到上一课你建的那个自由风格作业,想象半年过去了。那段 shell 脚本从三行长到了八十行。同事上周改了构建顺序,谁也没发现,直到一次部署出事,因为那次改动是浏览器里点了几下,不是...
- 4. 阶段、步骤与 Post 块你的第一条流水线只有一行 sh,而且跑通了。真实的流水线是签出代码、构建、测试、打包,一旦这四步连成一串,新的问题就来了:某一步失败了,而控制台日志是九百行没有任何路标的...
- 5. 工件 (Artifacts) 与测试结果凌晨两点构建变红了,总得有人查清楚为什么。他打开这个作业,页面上只有一个控制台日志的链接:一万一千行编译器噪声、测试运行器的絮叨和 shell...
- 6. 环境与凭据你的流水线要把镜像推到镜像仓库,而镜像仓库要一个密码。最快能跑通的做法是把密码直接粘进 Jenkinsfile,而 Jenkinsfile 就躺在仓库里,于是这个密码永远留在了...
- 7. 并行构建与矩阵构建五个阶段,每个三分钟,流水线就要跑十五分钟。这个数字不只是让人烦,它会改变大家的行为:没人再等 CI...
- 8. Agents 与 Docker周二构建通过了,周三就失败了,代码一行没动。后来发现,周二的构建落在了有人装过 Node 20 的那台代理节点上,而周三落在了还跑着 Node 16...
- 9. 触发器 (Triggers) 与计划一条只有人点了"立即构建"才会跑的流水线,算不上持续集成,它只是一个按钮。持续集成的价值来自那些没人主动要求的构建:合并出问题后四分钟就把它抓出来的那一次,或者夜里发现某个依赖发布...
- 10. 共享库 (Shared Libraries)在你们组织里随便打开三个 Jenkinsfile,会发现同样的十五行 Groovy 三个文件里都有。Slack 通知那一段。“构建并推送 Docker 镜像”那一段。知道你们...
- 11. 顶点项目:为 Node.js 应用构建代码化 Pipeline该把学过的东西全部接起来了。你要写一个 Jenkinsfile,把一个小型 Node.js 项目的活儿从头干到尾:拉取代码、安装依赖、并行跑代码检查和测试、构建 Docker...
- 1. 什么是 PostgreSQL设想你用一张电子表格记录一家小店的每一位客户、每一笔订单和每一件商品。一开始它够用,直到两个人同时去改同一张表,或者表格涨到几十万行、点一下就听见风扇狂转,或者有人手一抖敲错一个公...
- 2. psql 与初级命令你已经知道 Postgres 是拿来做什么的了。接下来的问题更实际:到底该怎么跟它对话?一个正在运行的 Postgres...
- 3. 创建数据库和表到目前为止,你只是在别人搭好的服务器上四处看了看。学工具够用了,但放到真实项目上就寸步难行:你需要一块属于自己的地方来放数据,而在往任何地方放进第一行数据之前,Postgres...
- 4. 数据类型到目前为止,你建的每一列都带着一个类型,TEXT、SERIAL、TIMESTAMPTZ,但没怎么解释为什么是这个类型而不是另一个。这件事比看上去要紧得多。类型挑得太窄,一个完全合法...
- 5. SELECT 与 WHERE一张表里有几千行,而你只要其中七行。不是全部,也不是前一百行,而是符合你心里那条规则的那七行:上个月出版、评分高于四分、作者名字以 K...
- 6. 关联 (joins)你的数据不在同一张表里,也不该在。用户住在 users 里,他们的文章住在 posts 里,把一篇文章和它的作者拴在一起的,只是某一列里的一个数字。这种拆分正是关系型数据库的用意所...
- 7. 聚合与分组有人问你上个月店里生意怎么样。他们要的不是那四千行订单数据,而是一个数字,或者顶多是每位客户一个数字。如果你把这些行全都拉出来,再在应用代码里加总一遍,那你只是把数据库天生就能瞬间...
- 8. 索引 (indexes)这条查询在你笔记本电脑上跑得好好的,表里有两百行测试数据。到了生产环境,面对四百万行,同一条查询要花十一秒,页面直接超时。除了表的大小,什么都没变,而这就是全部原因:没人帮忙的时候...
- 9. 事务 (transactions) 与隔离 (isolation)两条 UPDATE 语句把钱从 Alice 转给 Bob。第一条执行完,连接断了,第二条永远没有发生,于是三十块钱就这么凭空消失了。两条语句本身都没有任何毛病,问题在于它们本该是一...
- 10. 函数 (functions) 与触发器 (triggers)你库里的每一张表都有一个 updated_at 列,而且每一个都是错的。倒不是一直错,只是在某些代码路径上有人忘了给它赋值:那个管理脚本、你手工跑的那次数据订正、还有同样往这张表里...
- 11. JSONB 与数组有些数据就是不肯老老实实待在列里。比如一张产品表:笔记本电脑有内存大小,键盘有轴体类型,显示器有屏幕尺寸,下个月又有人往里加了一批蜡烛。你可以为每个属性加一列,然后看着这张表长出九...
- 12. EXPLAIN 与查询调优一个原本秒开的页面现在要加载九秒,人的本能反应是开始瞎猜。这里加个索引。把连接重写一遍。也许问题出在 ORDER BY。靠猜来调优数据库是个糟糕的办法,而之所以完全不必猜,是因为...
- 13. 备份与恢复那个每晚定时执行的任务,已经往磁盘上写了八个月的文件,却从来没人打开过。那不叫备份,那只是一个寄托着希望的文件。备份只有在你第一次把它恢复出来、亲眼看到数据回来的那一刻,才真正成为...
- 14. 顶点项目.设计一个模式到目前为止,每一课都是把一张表交到你手上,让你去查它。真实工作恰好反过来:有人描述一个产品,而你得决定表有哪些、哪些列可以为空、删掉一个用户时会发生什么、以及产品要跑的那些查询里哪...
- 1. 什么是 MySQL欢迎。如果你此前从没用过数据库,那你来对地方了。这一课没有查询要写。我们只想弄清 MySQL 是什么、从哪儿来、以及什么时候该请它出场。慢慢来就好。
- 2. MySQL 命令行工具与基础命令上一课全是纸上谈兵:MySQL 是什么、从哪里来、为什么存在。这些都没法让你真的向服务器问出一个问题。没人能连上的数据库服务器,不过是个白白烧内存的进程。要用 MySQL...
- 3. 创建数据库和表上一课你做的事情全都只是"看"。你连接上服务器,浏览了系统数据库,又窥探了 MySQL 早已替你建好的一张表。这是熟悉客户端的好办法,但和"拥有一个存放自己数据的地方"完全是两回事...
- 4. 数据类型回头看看上一课里的 products 表,你会注意到每一列都带着类型:INT、VARCHAR(120)、DECIMAL(10, 2)。这些不是摆设。给一列选定的类型决定了...
- 5. SELECT 和 WHERE你的表里有一万条产品,而你要的是 electronics 这个类别里断货的那六条。你以后拿数据库做的每一件事,都是这句话的某个版本: 要这些行、这些列、按这个顺序。SELECT...
- 6. Joins用户住在一张表里,他们的订单住在另一张表里,而把一笔订单和下单的人拴在一起的,只有某一列里的一个数字。这种拆分是故意的:它让一个用户的名字只被写下一次,改一处就等于处处都改了。可是...
- 7. 聚合与分组有人来问:EU 这个区域上个季度做得怎么样?他要的不是四千行数据,而是一个数。如果你把四千行全都取到应用代码里再加起来,那你就是用又慢又脆的方式,重写了一遍数据库几毫秒就能原生做完...
- 8. 索引登录接口在两百个测试用户下跑得好好的。上了生产环境,四百万用户,WHERE email = '[email protected]'...
- 9. 事务与存储引擎两条 UPDATE 语句要把二十英镑从 Ada 转给 Bilal。第一条跑完了,连接断了,第二条从未执行,于是二十英镑凭空消失。两条语句本身都没写错。错在它们本该是一件不可分割的事...
- 10. 存储过程与触发器系统里的每一笔订单,按规定都要写进审计日志。大部分确实写了。没写的那些,分别来自管理后台、每晚的导入作业,还有某人三月份随手跑过的一个一次性脚本。规则是真的存在,但它是靠应用代码来...
- 11. EXPLAIN 与查询优化"这条查询很慢。"这句话你往后一辈子都会听到,而人的第一反应往往是动手瞎改:这里加个索引,那里把联结重写一遍,说不定问题出在 ORDER BY...
- 12. mysqldump 与数据库恢复那个每晚跑的定时作业已经往磁盘上写了八个月文件,没有一个人打开过。那不是备份,那是一个寄托了希望的文件。备份只有在你第一次把它恢复回去、亲眼看到数据回来的那一刻,才真正成为备份,所...
- 13. 顶点项目,设计一个电子商务数据库 Schema到目前为止,每一课都是把一张表递到你手上,让你去查它。真实的工作正好反过来: 有人描述一家商店,而你要决定该有哪些表、哪些关系需要强制约束、删掉一个商品时会发生什么,以及创建一份订...
- 1. 什么是网络欢迎。如果你从来没想过,在浏览器里敲下一个网址之后到底发生了什么,那你来对地方了。Web 是这世上规模最大的一个例子,讲的却是一个极小的道理:一个程序向另一个程序要点东西,另一个程...
- 2. HTTP 与 HTTPS想象你正连着咖啡馆的免费 wifi。同一个网络里的另一个人,只要跑一个再普通不过的抓包工具,就能看到你的笔记本电脑发出的每一个请求。如果浏览器走的是明文...
- 3. 请求与响应结构解析你已经知道浏览器发出请求、服务器返回响应。你还没见过的,是这两样东西在网络上真正长什么样,也就是服务器收到的那段纯文本,以及客户端拿回来的那段纯文本。一旦你能读懂这个原始形态,很多...
- 4. Cookie、会话与令牌HTTP 没有记忆。你发出的每一个请求,在服务器看来都像是它头一次见到你,哪怕五秒钟前你刚发过一模一样的请求。一旦你需要服务器知道"这个请求来自刚刚登录的那个人",这就成了一个实实...
- 5. DNS 详解你把一个域名指向新服务器,改动提交上去了,从你的笔记本电脑访问一切正常,从同事的机器上却不行。又或者,站点对一半用户是挂的,另一半却好好的,而你的日志里连一条失败请求都找不到,因为...
- 6. TLS 与证书TLS 就是把普通 HTTP 变成 HTTPS 的那一层。学完这一课,你会大致明白握手过程里到底发生了什么,一张证书究竟证明了什么,以及怎么在自己的终端里把一张真实的证书读出来。
- 7. CORS你的前端跑在 localhost:3000,你的 API 跑在 localhost:8000,那个在 curl 里好好的请求,到了浏览器里却挂掉了,控制台还飘出一条关于...
- 8. REST API 基础有人让你给一个已有的 API 加个端点,你在第一个决定上就卡住了:该写 POST /users/42/deactivate 还是 PATCH...
- 9. WebSocket 与 SSE你要做的功能是"新消息一到就显示出来"。可你到目前为止学到的每一样工具,都假定客户端先问、服务器再答,也就是说服务器在被搭话之前根本没法开口。你可以靠一遍遍地问来装出这个效果,很多...
- 10. 缓存与 CDN你的首页要花 900 毫秒才能生成出来,而且给第一万个访客生成的东西,和给第一个访客的一模一样。你手上最大的一笔性能收益就藏在这个数字里,它不需要更快的数据库,不需要重写,也不用多...
- 11. 安全标头一份安全评审落到你桌上,上面列了十四条,其中六条最后都归结为你没有发送的响应头。这一类加固有个好消息:它不是重新设计,而是反向代理或者框架配置里的那么几行,而每一行都堵死了一整类攻...
- 12. 速率限制与节流上午 9 点 14 分,你的 API 开始对所有人超时。什么都没有发布。查下来是某个客户的集成里有一个不带延迟的重试循环,一台机器正以每秒四千个请求打向一个按每秒四十设计的端点。系...
- 13. 监控与日志记录凌晨三点,一位客户说结账挂了。你手上有一个名字、一个大概的时间,还有一套摊在五个服务上的系统。此刻你能查出来的一切,其实几个月前就被定死了,定它的人当初选择了记录什么、按什么形状记...
- 14. 综合项目:一个小型 Web 服务器这门课程里的每一课都是从外面往里看,讲一个响应头。你学过 Cache-Control 承诺了什么,Access-Control-Allow-Origin 允许了什么,一个 304...
- 1. 你好,TypeScript下面这个小小的 JavaScript 程序彻头彻尾是坏的,而 JavaScript 会乐呵呵地把它跑完:
- 2. 类型(Type)基础你已经能运行一个 .ts 文件了。现在来认识最基本的构件:TypeScript 自带的原始类型 (primitive type),外加两个"逃生口"(any 和...
- 3. 数组与 Tuple单独一个值很少够用。你有一份气温的列表,一份姓名的列表,一份价格的列表。而一旦你有了一份列表,一种新的错误就有了可乘之机:一份本该只装数字的列表里,不知从哪里混进了一个字符串,是三...
- 4. 对象类型(Type)与 Interface原始类型和数组能带你走很远,但真实的数据大多有结构:一个用户有名字和年龄,一个请求有方法和路径,一个结果有状态和主体。TypeScript...
- 5. 函数大部分缺陷都藏在函数里,而类型也正是在函数上最能回本。一个函数的签名(它的参数和返回类型)就是调用方和函数体之间的一份契约。TypeScript...
- 6. Union 与 Literal 类型(Type)有些值并不是单一的一种东西。一个查找用户的函数,要么找到一个用户,要么找不到。一个表单字段里装的,要么是用户输入的数字,要么还什么都没有。一个请求要么处于等待中,要么成功,要么失败...
- 7. 类型(Type) Narrowing联合类型说的是「这个值属于其中某一种类型」。收窄则是编译器根据你写下的运行时检查,推断出到底是哪一种的过程。这一课几乎没有新语法要写,功夫全在于像编译器那样去读代码。
- 8. Type Alias vs Interface之前你一直把对象结构直接写在用到的地方,这没什么问题,因为那些结构都很小。现在看一个来自真实代码库的函数签名:
- 9. Optional、Readonly 与 NullableJavaScript 里最常见的运行时错误长这样:
- 10. Enum有些值来自一个短小固定的列表。一个订单处于待发货、已发货或已送达。一条日志是 debug、info、warn 或...
- 11. Generic你需要一个函数,接收一个数组并返回它的第一个元素。很简单:
- 12. Class先看一个用普通对象写出来的银行账户:
- 13. 继承与 Abstract Class你为一个支付系统写了三个类:CardPayment、BankTransfer 和 Voucher。三个都有一个 amount、一个 currency 和一个...
- 14. 模块(Module)每个 TypeScript 文件都自成一个模块。一个文件里只要出现了 import 或 export,它顶层的那些名称就不再是全局的,而是变成模块作用域内的。这一课讲...
- 15. 工具类型(Utility Types)TypeScript 自带一小套泛型类型,它们把一个类型当作输入,返回一个变换过的类型作为输出。这些名字都不起眼(Partial、Pick、Omit、Record……),却在真实代...
- 16. Mapped 与 Conditional 类型(Type)你刚用过的那些工具类型(Partial、Pick、Record、ReturnType)全都建立在两个语言特性之上:映射类型负责改造一个对象的键和值,条件类型负责根据某个类型在几个结...
- 17. 声明文件(Declaration Files)与第三方库你装了一个库,导入它,编辑器立刻亮了起来:自动补全、参数提示,还有每个返回值的确切结构。换一个库,用同样的方式导入,拿到的却是:
- 18. tsconfig 与编译器(Compiler)tsconfig.json 就是 TypeScript 编译器读取的那个文件,编译什么、怎么编译,都从它这里得知。选项有一百多个,但一个真实项目用到的大概只有十来个。这一课讲的就是...
- 1. Vibe Coder 的心态这种经历你多半已经有过。你向人工智能要一个函数,它两秒钟就吐出四十行,看着都挺像样,你就把它粘贴了进去。有时候效果好得很。有时候它要花掉你一个下午,因为那段代码错得理直气壮又悄无声...
- 2. 吃饭的家伙:为成功搭好环境去问十个用 AI 编码工具很出活的人,他们的环境是怎么搭的,你会得到十个不一样的答案,而且没有一个稀奇古怪。他们的共同点不在工具,而在于从冒出一个想法到知道它成不成之间的那段时间。...
- 3. 打磨 Prompt:像专家一样和 AI 对话你一天会向 AI 要上百次代码,而回来的东西成色如何,多半在你按下发送的那一刻就已经定了。问得含糊,拿回来的是一份泛泛的东西,接下来你要花二十分钟把它捏成想要的形状。问得精确,拿回...
- 4. 从自动补全到架构几乎所有人的起点都一样:把 AI 当成一个非常好用的自动补全。补完这一行,写出这一个函数,给我一个正则表达式。这样确实管用,感觉也很好,但这只是泳池的浅水区。真正能改变你产出量的那...
- 5. 用 AI 调试:坏了就快速修好谁的代码都会出问题。AI 协助写出来的代码,坏起来有一种值得专门点名的方式:它看上去是对的。变量名合理,有文档字符串,结构也像模像样,而缺陷就坐在中间,你的目光会直接滑过去,恰恰是...
- 6. 重构 AI 代码的艺术AI 生成的代码有一种一眼就能认出来的特征:它能跑,但总比它应该有的样子差一点。一个函数干了三件事。同样的三行在两个地方各写了一遍。变量叫...
- 7. 性能、扩展与可靠性代码总有一天得跑得够快、扛得住足够的负载,还要在出问题的时候不倒下。在这些事情上,人工智能是个很得力的思考伙伴,但它“错得很自信”的毛病在这里造成的损失也最大:关于性能的判断听上去...
- 8. 用 AI 构建完整系统写一个函数很容易。系统则是许多函数必须彼此对得上。很多借助人工智能完成的项目就是在这里崩掉的:每一块单独看都能跑,但拼不到一起,因为没有人在把握全局。把握全局这件事是你的,交不出去...
- 9. 团队 Vibes:与 AI 和人协作在自己的项目里跟 AI 一起干活,读者只有一个:你。可同样的产出一旦进了共享仓库,它就有了另一批读者,他们没参与那场产生它的对话,看不到你用的提示词,而且在你去忙别的事之后还得维护...
- 10. 真实世界里的 Vibe Coding:项目、客户与遗留代码教程给你的是干净的空文件。真实的工作给你的,是一份没人完全搞得懂、有十年历史的代码库,一个希望昨天就交付的客户,还有一堆教程从来不提的约束:安全、许可证,以及别人的钱。这一课要讲的...
- 11. 保持锋利:学习、适应与持续进阶vibe coding 里藏着一个实实在在的风险:思考全让 AI 干了,你自己的思考能力就会变弱。真正被 AI...
- 12. 代码的未来,以及你的位置心态、工具、手艺、需要提防的地方,你都学过了。这最后一课先把技术放一放,问一个更大的问题:当人工智能写代码越来越强,你在那个世界里的位置在哪儿?答案比新闻标题给人的感觉乐观得多,但...
- 1. 什么是提示词(Prompt)你大概在聊天框里输入过东西:问一个问题,拿到一个回答,也许还惊讶过它怎么这么好,或者怎么错得这么离谱。这门课程要教的,是如何有意识地、稳定地拿到好回答。但在那之前,你得先掌握这个领...
- 2. 大语言模型如何生成文本你已经知道什么是提示词、什么是补全,也知道同一个提示词每次回来的措辞可能不一样。这一课带你看提示词另一侧发生的事:模型究竟怎么把你的话变成一段回复。现在把机制弄清楚,接下来要讲的提...
- 3. 提示工程的五项原则你已经知道什么是提示词,什么是补全(completion),也知道模型每次都是现写一份新回复,而不是把查到的东西背出来。这就引出一个显而易见的问题:既然模型只是一路猜出一份听起来合...
- 4. 文本生成的标准实践第二课和第三课让你体会到模型究竟是怎样一个词元一个词元地产生文本的,也讲了引导它的五条原则。这一课把那份理解变成一小套习惯,让文本生成可靠到足以在上面搭东西。这些是从业者每天都在用...
- 5. Prompt Template 与 Function Calling第四课里,你是手工排版一条提示词的:分隔符、角色、几个示例。一条提示词这么写没问题。可当同一条提示词要跑在成百上千个不同的输入上,或者你需要模型伸出自己的文字之外、真的去做点什么时...
- 6. 向量数据库与检索增强生成第 2 课里你已经看到模型为什么会产生幻觉:它预测的是接下来可能出现的词元,并不去查证事实,凡是训练数据和上下文窗口之外的东西,都是它猜的。第 5...
- 7. Autonomous Agents:memory 与 tools第 5 课里,你通过函数调用给模型配上了工具;第 6 课里,你通过检索给它配上了长期记忆。这一课要把这两块东西放进一个循环里,让模型可以先行动,再看结果,然后决定下一步做什么,一轮...
- 8. Diffusion 模型如何生成图像到目前为止,你写的每一个提示词产出的都是文本。这一课开启第 3 部分,同一个提示词将产出一张图。介质变了,但第 1...
- 9. 图像生成的标准实践上一课让你对扩散模型有了直觉:它是怎么从随机噪声一路去噪,把一段文字提示词变成一张图的。这一课把那份直觉变成一套习惯,让你写出的图像提示词落得离你脑子里那张画面更近。第三课的五条原...
- 10. 进阶图像技巧:inpainting、outpainting 与 ControlNet前两课里,你从一段文字提示词生成了整张图,也学会了用结构、风格和负面提示词去引导它们。那套做法给模型留了很大的创作余地,在你还在摸索时这是优势,可当你需要一个确定的结果时它就成了麻...
- 11. 构建 AI 驱动的应用这是结业项目。前面每一课都教了一个动作:生成文本、把输出塑造成结构化的形状、调用函数、用 RAG...
- 1. AI Is Not Magic接下来你要做的事,是把自己想要什么描述给一个人工智能(AI),由它替你写出并运行真正的代码。在这一切开始之前,你得对这个人工智能到底是什么有个诚实的认识。它不是许愿的神灯,不是搜索...
- 2. Thinking Before Prompting上一课你看到了,AI 是一个能干但会出错的助手,而含糊的要求换来的是含糊的答案。这一课就是治含糊要求的药。用 AI...
- 3. Explaining Your Idea在前两课里,你知道了 AI 是个能干但会出错的助手,也知道了清楚的请求胜过含糊的请求。现在要把这些变成一项真正的技能。你脑子里的那个想法,还不是 AI...
- 4. Talking to AI前面几课教你在动手写提示词 (prompt) 之前先把事情想清楚,也教你把自己的想法讲明白。这样你就能写出一条很像样的开场消息。这节课讲的是这条开场消息之后的事,因为跟 AI...
- 5. Learning What You Don't Know到这里,你已经练过思考、练过把想法讲清楚,也练过跟人工智能一来一回地对话。这一课再加一项不那么显眼的本事,创始人却天天靠它:在你正需要的那一刻,让人工智能把你不懂的那样东西教给你。...
- 6. Breaking Down Big Problems现在你手上有了一个真实的想法,也许是一整个应用程序。这时候人容易忍不住把整件事塞进一个巨大的请求里丢给人工智能,指望它交回一个成品。它不会的。第一课里你已经学到,人工智能在小而聚焦...
- 7. Reviewing AI's Work第 1 课里你学到,AI 是一个又快又自信、但有时候会出错的帮手,而做主的人始终是你。现在要把这个道理变成一个你真能做到的习惯。AI...
- 8. Build Your First Product到目前为止的一切,都是为这一课做准备的。你已经学会了先想清楚再提问,学会了把一个想法讲明白,学会了把一件大活拆成小块,也学会了检查 AI...
- 9. Fixing Problems with AI到这里,你已经和 AI 一起做出了一个真实的产品。迟早会有什么东西不好使:按钮点了没反应、图片不见了、某一段怎么也不出现。这一课讲的就是那个时刻。当初帮你把产品做出来的那个...
- 10. 把它做得更好前两课里,你做出了一个产品的第一版,也把冒出来的问题修掉了。那第一版是个实打实的成果,同时它也只是个开头。能跑起来,和做得好,不是一回事。这一课讲的就是这两者之间的距离,以及你怎么...
- 11. AI Workflows到现在,你已经做出了一个产品,修好了里面的问题,还把它做得更好了,而这一切都是靠给一个人工智能写提示词完成的。但真实的开发很少只靠一个助手。今天那些真的在做东西、真的在上线的人,通...
- 12. Becoming an AI Builder这是最后一课,也是把前面所有内容串到一起的一课。每一个动作你都单独练过了:确定目标、写一份简短的规格说明、把工作拆开、写提示词、检查、修复、改进。这一课几乎没有新知识。它的任务是把...
- 1. Preparing Your Product欢迎来到第二门课。在基础课里,你做出了一个能跑的东西,而且全程都是靠给 AI 提要求做出来的。这一课不会给它加任何一个功能。相反,你要像一个陌生人那样重新审视这个项目,找出它在真实...
- 2. Building a Strong Foundation上一课你老老实实地审视了自己在基础课程里做出来的项目,并把它在真实使用下会崩在哪里写了下来。这一课要修的是那张清单上的头一个弱点:一个只会在一个地方、也就是你自己屏幕上运行的原型,...
- 3. Managing Users and Authentication你在基础课里做出来的那个项目能跑,但它把所有人都当成同一个人。没有账户,没法登录,也没有"这是我的东西、那是你的东西"这回事。这一课要迈的就是这一步。你会让真实的人注册账户、安全地...
- 4. Working with Data上一课,你给基础课程里做的那个项目加上了账户和登录,让它知道用户是谁。现在要给它一个真正存放信息的地方:别人下的订单、写的笔记、选的设置。眼下这些信息多半在应用程序一重启就没了。这...
- 5. Keeping Your Product Secure前面几课里,你给基础课做的那个项目加上了真正的账户、登录,以及一个可靠的信息存放处。一个产品一旦装着别人的信息,网上的陌生人就会开始来捅它。这一课不是要吓唬你。它是一份很短的清单,...
- 6. Testing Before Release这门课程走到这里,你已经给基础课程里做出来的项目加上了真正的注册和登录、一层像样的数据层,还有针对常见攻击的防护。这些改动每一个都动了产品,而任何改动都可能悄无声息地弄坏原本好好的...
- 7. Working with Multiple AI Agents到目前为止,你给基础课里做的那个项目加上了真实的账户、数据层、安全防护和测试,而这些全是靠给一个人工智能写提示词、让它把事都办了。这样能行,但它对单条提示词的要求太高了:规划、决策...
- 8. Deploying to Production到目前为止,你的产品只活在你自己的屏幕上。它在这个工作区里跑着,你点来点去,一切正常。这当然是真实的,但只有你一个人能访问到。这一课要准备好那些部件,让世界上任何人都能通过一个真正...
- 9. Monitoring Your Product你的产品现在上线了。真人能访问到它,这也意味着在你没盯着的时候,真的会出真事。得知自己产品坏了的最糟糕的方式,就是事情发生几个小时之后,一个陌生人发邮件来告诉你。这一课讲的是反过来...
- 10. Scaling Your Product你的产品已经部署在一个真实地址上,而且靠着上一课,出了问题你能知道。现在开始有人用它了,于是一个新的担心冒了出来:要是很多人同时来用,会怎么样?这一课讲的是扩容,说白了就是让你的产...
- 11. Maintaining and Improving Your Product你的产品上线了。真实的人能访问它、注册、使用它。这是个里程碑,同时也是一份新工作的开始。上了线的产品不是完工了,而是活起来了:野外会出各种故障,它周围的世界会变,用户也会用行动告诉...
- 12. Running a Real Product这是本门课程的最后一课,也是把前面所有东西汇到一起的一课。在过去十一课里,你给基础课程中做的那个项目加上了真实的账户、数据层、安全、测试、部署和监控。这里已经没有什么新的、吓人的东...
- 1. Thinking Like an Engineering Leader在前两门课里,你学会了做出一个产品,并把它交付给真实用户,靠的全是跟一个 AI 对话。这门课要请你换一把椅子坐。你不再是自己带着一个助手把每一步都做完,而是要组建并带领一支 AI...
- 2. Creating Specialized AI Agents上一课你换了位置,从动手写代码的人变成了负责规划和协调的工程负责人。这一课要认识的,是你将要带的这支团队。它仍然是一节只读的课,没有代码,也不用打开工作区。它要做的事情只有一件:把...
- 3. Giving Every Agent a Role上一课你设计了一支团队:产品经理、架构师、开发者、评审者,还有其他几个角色,每一个都要交给同一个 AI...
- 4. Managing AI Collaboration前面三课里,你设计了一支智能体(agent)队伍,给每一个分了角色,也学会了用干净的交接在它们之间传活儿。现在,你要让这支队伍同时上手产品里的同一块东西。这一课的目标是:让几个智能...
- 5. AI Code Reviews上一课里,你让一个小功能依次经过了规划者、开发者和评审者,也看到了为什么评审者必须是另一个独立的智能体。这一课要把评审者变成一门真正的规矩。代码评审指的是一个智能体去读另一个智能体...
- 6. AI Project Management到目前为止,你已经学会带一支智能体团队:给每个智能体一个专注的角色,在它们之间交接工作时给足上下文,并在信任任何成果之前单独跑一遍评审。这是把活儿干好的方式。这一课讲的是你作为负责...
- 7. AI DevOps你已经带着一队智能体把产品做出来、评审过,也把项目管起来了。在前面那门课里,你还照着步骤亲手把它上线过一次。这一课要换的,是"上线"这件事归谁管。以后不再由你把每个新版本一个个推出...
- 8. AI Security Teams现在你的产品已经摆在真实用户面前,还有一个 DevOps 智能体负责把它发出去。第二门课里你学过保障产品安全的基本功,比如给密码做哈希,那时候这些都是你在开发过程中顺手做的事。这一...
- 9. AI Operations你的产品已经上线,有真人在用了。这件事改变了你要干的活儿。做产品是把新东西造出来;做运维是在别人依赖你的时候,把你已经交付出去的东西维持在健康状态。这一课里,你要往团队里再加一个职...
- 10. Building Your Own AI Workflow这门课程一路走来,现代工程团队需要的每一个角色你都见过了:决定做什么的产品经理、决定各部分怎么拼在一起的架构师、把它们做出来的开发者、检查成果的评审者、找弱点的安全专家,还有负责上...
- 11. Scaling AI Teams你已经学会了带一支智能体团队:给每个智能体一个明确的角色,交接工作时把上下文一并带过去,另外单独安排评审,再用冲刺和优先级把项目管起来。只要项目小到一个智能体能整个装进脑子里,这一...
- 12. Becoming an AI Engineering Leader这是进阶课程的最后一课,也是整条三门课路径的最后一课。你从“AI 不是魔法”开始学起,学会了做出一个产品,再把它发布到生产环境,然后不再依赖单个助手,而是带起一支各有专长的智能体团...
- 1. Context Is The Whole Game关于 AI 编码工具的抱怨,几乎每一条(“它凭空编了一个接口”“它把本来就对的代码重写了”“它在玩具项目上好用,一到我的仓库就崩”)说到底都是上下文问题换了个样子。模型,也就是你工...
- 2. Pick The Right Brain, Pay The Right Price选模型是一个工程决策,形态跟挑数据库或者挑队列一模一样:没有最好的选项,只有跟某类负载合不合适。每个请求都伸手去够最大的那个模型,相当于把每个作业都跑在最贵的机型上。能跑通,能把你...
- 3. Spec-Driven Development想最快地从模型那里拿到正确的代码,办法是别再描述你想要什么,改成把它定义下来。一句提示词是一个愿望,一份规格说明 (spec)...
- 4. Build Your Harness那些能从模型里稳定拿到好结果的工程师,写的提示词其实很少比别人高明。他们搭起了一套支架 (harness):围绕模型建起来的一整套可重复的配置,由规则、工具和检查组成,让好结果成为...
- 5. Verification Loops: Make It Prove Itself模型会告诉你它写的代码是正确的。它不是在撒谎,也不是说对了,它压根无从知晓。正确性要靠拿代码去跑一份「什么算正确」的定义才能确立,而对一个资深工程师来说,有意思的问题是:这份定义该...
- 6. Reading Generated Code Like A Senior你已经会评审代码了。换成生成的代码,变的是错误的分布。人写的代码在人犯迷糊的地方出错,而迷糊会留下痕迹:别扭的命名、一句含糊其辞的注释、一个横着长胖了的函数。生成的代码在模型自信的...
- 7. Legacy Archaeology把一份谁都看不懂的代码库丢给模型,问一句"这是干什么的?",这是模型能替你做的价值最高的事情之一,也是最容易做砸的事情之一。模型永远会给出一个答案。那答案流畅、有条理、听着像真的,...
- 8. Migrations At Scale让模型去改四百个文件,正是 AI 辅助的分水岭:要么真的成倍提速,要么产生的评审工作量比自己动手改还多。差别不在模型,而在于你有没有把改动中机械的那部分和需要判断的那部分分开,并且...
- 9. Debugging Code You Did Not Write调试自己写的代码,一开始就占着便宜:你记得当初想干什么。调试生成出来的代码,这份便宜彻底没了,还多了一个特有的陷阱。作者随叫随到,耐心无穷,而且不管你描述什么缺陷,它都会给出一份自...
- 10. The Security Model Of An Agent一个带工具的智能体,本质上是一个从文本里接收指令、然后在你的系统上动手的程序。这些文本里,有一部分是你写的。另一部分则来自网页、工单、某个依赖的说明文件,或者陌生人留下的一条代码注...
- 11. AI On A TeamAI 带来的个人效率提升是真实的,但它不会自动变成团队效率的提升。写得更快的代码,评审起来并没有更快,而大多数团队本来就卡在评审这一环。这一课讲的是系统层面的后果:什么真的变快了,...
- 12. Judgment: Knowing When Not To前面每一课讲的都是怎样把这件事做好。这一课讲的是排在它们全部之前的那个决定,也最可能把能力持续叠加的工程师和很快停在原地的工程师区分开:认出那些「找模型来做反而是错招」的情形,并且...
