WEEK 08 / 16 工程化 · 代码质量与模块化
PYTHON 程序设计 · V2 · 第 8 周(100 分钟 · L17–L18)

AI 写的代码
为什么不能直接用

功能一样、样子天差地别的两段代码,差距在哪?本周学会审查 AI 代码的五类常见问题、 用 assert 写最轻量的测试,再把单文件巨石拆成专业的项目结构——工程化收官。

所属模块 M4 工程化← → 翻页 · F 全屏

今日课表(100 分钟)

时间环节要点
0–8开场对比两段功能相同的代码:干净版 vs AI 暴力堆砌版——好在哪?
8–22五类常见问题命名不一致/超纲语法/边界缺失/异常粗暴/过度工程化——逐类反面教材
22–34现场审查重构「能跑但糟」的代码逐步修:密钥/命名/边界/全局变量/零测试
34–44审查三步法密钥→名字职责→边界;过完三问再运行
44–58动手练习运行场:可变默认参数陷阱 + assert 三连测试
58–70模块化300 行巨石的三大问题;按职责拆分;厨房类比
70–82配置分离.env + python-dotenv + config.py;密钥进 .env、代码只读
82–92M4 收官虚拟环境+质量+结构=工程化基本功;下半学期预告
92–100小测随堂小测 3 题

审查三步法在期末项目里每天都要用,从今天开始养成习惯。

AI 生成代码的五类常见问题

①命名不一致——同一个变量一会儿叫 data、一会儿叫 result、一会儿叫 output
②超纲语法——用了你没学过的装饰器 / 元类 / 上下文管理器,看得懂才敢用
③边界缺失——没处理空列表、None、空字符串;一传边界值就崩
④异常处理粗暴——一个 except Exception 吞掉所有错误,bug 更难找
⑤过度工程化——简单需求上了三层抽象工厂;课程范围内坚持轻量方案

现场案例:审查一段「能跑但糟糕」的代码

# AI 初稿:功能是对的,问题你来找
api_key = "sk-abc123"                    # 问题①:密钥硬编码!
def process(d):                          # 问题②:process 是什么?d 是什么?
    return d.split()                    # 问题③:d 为空串/None 时崩
results = []                               # 问题④:全局变量,多函数共用
# ...零测试...                          # 问题⑤:没法验证对错
重构后:密钥进 os.getenv() · 函数改名 count_words(text: str) -> dict · 空输入返回 {} · 结果收进函数返回 · 补 assert count_words("a a b") == {"a":2,"b":1}

审查三步法(贴在工位上)

① 密钥与敏感信息
有没有进代码?
→
② 名字与职责
能自解释吗?只做一件事吗?
→
③ 边界
空输入/超长/非法类型会怎样?

动手:找 bug + 写测试

交互 · 先猜输出,再运行验证

测试思维:不是证明代码对,而是尽早发现代码错——正常输入 + 边界输入各测一条。

模块化:把巨石拆成积木

300 行的 main.py——你愿意接手维护吗?

  • 单文件三大问题:找代码难、改一处怕崩别处、没法复用
  • 拆分原则:按职责——一个文件一个主题
  • 厨房类比:储物间(配置)/ 切配(数据处理)/ 烹饪(API 调用)/ 摆盘(输出)
my_ai_app/
├── .env               # API Key(不进仓库)
├── .gitignore
├── requirements.txt
└── app/
    ├── config.py      # 读环境变量
    ├── client.py      # LLM 调用封装
    ├── stats.py       # 数据处理
    └── main.py        # 入口

配置与代码分离

# .env(已被 .gitignore 排除)
DEEPSEEK_KEY=sk-xxxxxxxx

# config.py —— 密钥进 .env,配置集中管理
import os
from dotenv import load_dotenv
load_dotenv()

API_KEY = os.getenv("DEEPSEEK_KEY")   # 读不到就是 None,不会泄露
MODEL = "deepseek-chat"
MAX_TOKENS = 2048

M4 收官:工程化基本功

W7 已完成
  • 虚拟环境与依赖锁定
  • requirements.txt 复现
本周完成
  • AI 代码审查五类问题 + 三步法
  • assert 轻量测试
  • 模块化结构 + 配置分离
下半学期预告(W9–W13):AI 应用开发。 API 参数与流式输出 → Prompt 工程 → 结构化输出与 Function Calling → RAG → 多模态 → Agent → FastAPI 前后端。期末项目的全部零件,五周内集齐。

随堂小测(3 题)

交互 · 点击选项作答

课后与下半学期预告

本周课后
  • 练习:把之前的单文件脚本拆成 config / client / main 三模块
下周:W9 大模型 API 深入与 Prompt 工程 拧开引擎盖:temperature 等四参数 + 流式输出;然后学「怎么问才准」的 Prompt 工程。 提前看下周课件 →

深入阅读:M4 模块页 · 经典笔记 10.2 包管理 · 9.3 包