Lab 8Part 3 问题求解与 AI 协作AI Level 1
Linux 入门与 AI 代码审查实战
上半场是 Linux 命令行——几乎所有服务器和计算集群都跑在上面。下半场是 AI 代码审查:不写代码,找别人代码里的问题。
截止:小作业 3 · 11 月 17 日 周二 23:59
本页目录
本次目标
- 会用命令行在文件系统里走动、看文件、找东西
- 用
ruff和调试器审查代码 - 独立发现 AI 生成代码里的四类问题
- 写出合格的 AI 使用声明
上半场:Linux 命令行
为什么要学
你写的程序,将来大概率跑在没有图形界面的服务器上。科学计算集群、云服务器、CI 流水线——只有命令行。
而且很多工具本来就是命令行的:装包、跑测试、查看日志、管理版本。
怎么开一个 Linux 环境
| 你的系统 | 怎么做 |
|---|---|
| macOS | 直接用「终端」。macOS 是 Unix,绝大多数命令通用 |
| Windows | 装 WSL(Windows Subsystem for Linux):管理员开 PowerShell,运行 wsl --install,重启后就有一个真的 Ubuntu |
| Linux | 你已经在用了 |
走动与查看
pwd # 我在哪
ls # 这里有什么
ls -l # 详细信息:权限、大小、修改时间
ls -a # 包括隐藏文件(以 . 开头的)
ls -lh # 大小用 KB/MB 显示
cd /path/to/dir # 进入某目录
cd .. # 上一级
cd ~ # 回到家目录
cd - # 回到上一个目录
文件操作
mkdir mydir # 建目录
mkdir -p a/b/c # 一次建多级
touch file.txt # 建空文件
cp a.txt b.txt # 复制
cp -r dir1 dir2 # 复制整个目录
mv a.txt b.txt # 改名 / 移动
rm file.txt # 删文件
rm -r dir # 删目录
看文件内容
cat file.txt # 全部打印出来(适合小文件)
head file.txt # 前 10 行
head -n 20 file.txt # 前 20 行
tail file.txt # 后 10 行
tail -f log.txt # 持续跟踪新增内容(看日志用)
less file.txt # 分页浏览,按 q 退出,按 / 搜索
wc -l file.txt # 数行数
查找
grep "error" log.txt # 找包含 error 的行
grep -i "error" log.txt # 忽略大小写
grep -n "error" log.txt # 显示行号
grep -r "TODO" . # 在当前目录递归搜索
find . -name "*.py" # 找所有 .py 文件
find . -name "*.py" -size +10k # 而且大于 10KB
管道:把命令串起来
| 把前一个命令的输出,喂给后一个命令。这是命令行最强大的地方。
ls -l | wc -l # 数这个目录有多少个文件
cat data.txt | grep "2026" | wc -l # 数含 2026 的行有几行
ps aux | grep python # 找正在跑的 python 进程
history | grep git # 回忆自己敲过什么 git 命令
跑 Python
python3 hello.py # 运行脚本
python3 -c "print(2**10)" # 直接执行一句
python3 -m pip install ruff # 装包(推荐这种写法,避免装错解释器)
python3 -m pytest # 跑测试(L11 会用)
其他有用的
man ls # 看某个命令的手册,按 q 退出
which python3 # 这个命令实际是哪个文件
echo $PATH # 看环境变量
chmod +x script.sh # 给文件加可执行权限
df -h # 磁盘还剩多少
top # 看谁在占 CPU,按 q 退出
下半场:AI 代码审查
8-1 命令行热身
在你的 Linux 环境(或 macOS 终端)里完成,把每一步的命令和输出记录到提交说明里:
- 在家目录下建一个
cs1602/lab08目录 - 进去,建三个文件
a.pyb.pyc.txt - 用
ls -l列出,把输出贴上来 - 在
a.py里写一行print("hello"),用python3 a.py运行 - 用一条命令数出你的 Lab 1–7 代码目录里有多少个
.py文件 - 用
grep在你自己的代码里找出所有TODO或print(出现的位置
8-2 让 ruff 审你自己的代码
python3 -m pip install ruff
ruff check .
对你 Lab 1 到 Lab 7 的所有代码跑一遍。在提交说明里回答:
- 一共报了多少个问题?
- 出现最多的是哪三类?
- 挑三条你不理解的,查清楚它为什么这么要求,各写一句话解释
8-3 审查四段代码
下面每段代码都有恰好一个问题。对每一段,在提交说明里写:
- 问题是什么(属于 L8 讲的哪一类)
- 怎么发现的(读出来的?跑出来的?测出来的?)
- 改对的版本
# A
def second_largest(nums: list[int]) -> int:
s = sorted(nums, reverse=True)
return s[1]
# B
def title_case(s: str) -> str:
return s.capitalize_words()
# C
def has_duplicate(items: list[int]) -> bool:
for i in range(len(items)):
for j in range(len(items)):
if i != j and items[i] == items[j]:
return True
return False
# D
def count_chars(s):
d = {}
for i in range(len(s)):
c = s[i]
if c in d:
d[c] = d[c] + 1
else:
d[c] = 1
return d
8-4 用 AI 写一个函数,然后拆了它
这道题必须用 AI 完成第一步。
- 让 AI 写
is_valid_ipv4(s: str) -> bool,判断字符串是否是合法的 IPv4 地址 - 先别看它的代码。 自己列出至少 8 个测试用例,包含:
- 至少 3 个合法的
- 至少 5 个非法的(想想:段数不对?超过 255?有前导零?空字符串?有空格?负数?)
- 用你的用例测它
- 记录:它通过了几个?失败在哪?
- 如果它失败了,先自己改对,再问 AI 为什么它会漏掉这种情况
在提交说明里附上:你的测试用例、AI 的原始代码、测试结果、你的修正。
8-5 用调试器走一遍递归
用 VS Code 的调试器,在你 L7 写的 hanoi() 或 factorial() 上:
- 在递归调用那一行设断点
- 按 F5 启动,用 F11 步进
- 观察左侧的调用栈面板,截图一张递归到第 3 层时的样子
- 在提交说明里回答:调用栈面板显示了什么?和你在 L7 用缩进 print 看到的有什么对应关系?
8-6 写一份 AI 使用声明
为你本次实验的整体工作写一份 AI 使用声明。参考 L8 里的例子,包含三要素:用了什么、生成了哪部分、如何验证。
如果你这次完全没用 AI,就写”本次未使用 AI”,并说明原因——这同样是合格的声明。
提交前自查
- 8-1 的六步命令和输出都记录了
- 8-2 挑出了三条不理解的规则并查清楚了
- 8-3 四段代码都写了「怎么发现的」,且不全是”读出来的”
- 8-4 的测试用例是看代码之前写的,至少 8 个
- 8-5 有调用栈面板的截图
- 8-6 AI 使用声明写了
- 个人项目 A 已提交(本周日截止,Level 0)