CS1602计算导论
Lab 15Part 6 Pythonic 与现代实践AI Level 2

团队项目开发

本周没有独立题目——整节课用于团队项目开发。但有四个必须完成的里程碑,助教会逐组检查。

截止:小作业 5 · 12 月 29 日 周二 23:59
本页目录

本次目标

  • 完成团队项目的核心功能
  • 建立可运行的测试套件
  • 用 L15 的方法与 AI 协作,并留下证据
  • 为下周的 Demo 做准备

本节课怎么用

整整两学时都是你们的开发时间。助教全程在场,随时可以问。

但不是自由活动——下面四个里程碑要在本节课结束前给助教看。


里程碑一:核心功能可运行(必须)

至少完成:

  • Array.__init__ 能从嵌套列表构造,并校验形状规整
  • shape / ndim / size 三个属性
  • __repr__ 能看出内容和形状
  • __getitem__ 至少支持 a[i] 和 a[i, j]
  • 四则运算至少完成 __add__ 和 __mul__(含 Array 与标量两种情况)

给助教演示一遍,能跑通下面这段:

a = Array([[1, 2, 3], [4, 5, 6]])
print(a.shape, a.ndim, a.size)
print(a)
print(a[1, 2])
print(a + a)
print(a * 2)

里程碑二:测试跑得起来(必须)

  • 有一个 test_array.py,python3 -m pytest 能跑
  • 至少 15 个测试用例
  • 至少覆盖:正常运算、形状不匹配抛异常、空数组、单元素数组
  • 至少有一个与真 NumPy 对拍的测试

对拍长这样:

import numpy as np
from myarray import Array

def test_add_matches_numpy():
    data_a = [[1, 2, 3], [4, 5, 6]]
    data_b = [[7, 8, 9], [10, 11, 12]]
    mine = Array(data_a) + Array(data_b)
    theirs = np.array(data_a) + np.array(data_b)
    assert mine.tolist() == theirs.tolist()

里程碑三:AI 协作记录(必须)

按 L15 的方法,至少完整走一遍下面这个流程,并把过程记录下来:

  1. 你先写接口规格——签名 + 文档字符串 + 三个例子(含边界)
  2. 你先列边界情况——不看 AI 的输出,自己列至少 6 条
  3. 把规格交给 AI,拿到实现
  4. 用你的边界情况测它
  5. 记录:它漏了哪几条?

提交一份不超过一页的记录,包含:你的规格、你的边界清单、AI 的实现、测试结果、以及它漏掉的部分。


里程碑四:分工与一致性检查(必须)

  • README 开头有一段项目约定:内部表示、命名风格、错误处理方式
  • 有一份分工说明:谁写了哪些部分
  • 互相 review 一次:各自挑对方写的一段代码,问”这一行为什么这么写”

在中期检查里回答:互相 review 时,有没有出现答不上来的情况? 如实回答,这一问不扣分。


本周的现实建议

先让它跑起来,再让它好看

核心功能没通就去做广播、布尔索引这些加分项,是最常见的翻车方式。里程碑一优先。

内部表示定了就别改

如果你们现在还在为”嵌套列表还是扁平列表”纠结,今天必须定下来。到下周再改就来不及了。

拿不准就选扁平列表 + 形状元组——它对 reshape 和 transpose 友好得多,而这两个是必做项。

复杂度自己盯

L15 说过,AI 不会主动告诉你它给的 dot 是 O(n³)。你自己测一下:100×100 要多久?200×200 是不是 8 倍?

这个测量结果本身就可以写进 Demo。

两个人都要碰全部代码

Demo 时会分别问两个人关于整个项目的问题。如果你完全没看过队友那一半,下周会很难受。

建议今天花二十分钟互相讲一遍自己那部分。


中期检查提交(本周日 23:59)

打包提交:

  1. 当前的全部代码
  2. pytest 的运行输出截图或文本
  3. 里程碑三的 AI 协作记录(一页)
  4. README(含项目约定与分工说明)
  5. 一句话说明:下周 Demo 你们打算展示什么?

下周 Demo 预告

  • 每组 8 分钟:5 分钟演示 + 3 分钟提问
  • 演示要包含:核心功能、你们做的选做部分、测试运行
  • 提问两个人都会被问到,问题涉及整个项目
  • 准备好回答:「你们的内部表示为什么这么选?」