结对编程实践:基于 AI 工具开发图书管理系统 —— 从需求到落地的完整流程
陈豪杰(需求与 AI 交互):ChatGPT 的代码生成能力超出预期,但需要非常精准的提示词。比如最初我只说 “生成图书管理系统代码”,得到的是很简陋的版本;后来学会拆解需求(如 “先设计领域模型→再实现核心功能→最后优化交互”),产出质量才明显提升。孙晟继(测试与优化):结对编程让测试工作更有价值。当我发现 “借阅后图书状态未更新” 的问题时,XXX 能快速和 AI 沟通定位,这种 “发现问题→
一、作业背景与组队协作模式
作为23 计科7班软件工程专业的大二学生,我们在 “软件工程导论” 课程中接触到 “结对编程” 这一经典开发模式。本次作业要求 2-3 人组队,借助代码自动生成工具完成一个可运行的小型项目,旨在让我们体会 “人机协作 + 人际协作” 在软件开发中的价值。
我们小组由 陈豪杰(需求分析与 AI 交互)、孙晟继(代码测试与 Bug 修复;文档编写与技术复盘)两位成员组成。采用 “轮值主导 + 互补支持” 的协作模式:每次功能迭代由一位成员主导执行,另外两位从旁提供思路并记录过程,确保每个环节都有多元视角的参与。
二、工具选型与技术栈决策
在代码自动生成工具的选择上,我们对比了三类主流方案:
| 工具 | 优势 | 不足 | 最终选择理由 |
|---|---|---|---|
| GitHub Copilot | 与 VS Code 深度集成,实时代码补全 | 对复杂需求的理解能力较弱 | 更适合 “编码辅助”,而非 “需求→代码全流程” |
| 豆包代码助手 | 中文交互友好,支持多轮需求迭代 | 生成代码的工程化程度一般 | 备选方案 |
| ChatGPT | 自然语言理解能力强,支持复杂需求拆解 | 需要手动调整代码适配本地运行环境 | 能完整承接 “需求描述→代码生成→问题优化” 全流程 |
最终我们选择ChatGPT(GPT-4 版本)作为核心工具,技术栈为Python 3.9(选择 Python 是因为其语法简洁,适合快速验证功能)。
三、项目开发全流程详解
1. 需求工程:从模糊想法到可执行需求
起初我们对 “图书管理系统” 的需求仅停留在 “能借还书” 的模糊认知,通过小组头脑风暴和 “需求细化提问法”,逐步明确了功能需求、非功能需求和用户场景:
-
功能需求:
- 基础功能:图书信息 CRUD(创建、查询、更新、删除);
- 核心流程:借阅(需验证图书状态)、归还(需更新状态和记录);
- 拓展功能:图书分类(按作者、出版社)、借阅统计。
-
非功能需求:
- 性能:单批次处理 100 本图书时响应时间 < 1 秒;
- 可靠性:数据持久化,程序崩溃后可恢复;
- 易用性:控制台交互需有清晰的菜单引导。
-
用户场景:
- 场景 1:图书管理员添加新到的 “人工智能” 系列教材;
- 场景 2:学生查询 “Python 编程” 相关图书并借阅;
- 场景 3:管理员月末统计本月图书借阅 Top3。
2. 代码生成:AI 的 “理解 - 生成” 能力边界
我们将需求拆解为 “领域模型设计→核心功能实现→交互逻辑开发” 三个阶段,逐步向 ChatGPT 投喂需求:
-
领域模型设计:向 AI 提问:“请设计图书管理系统的领域模型,包含 Book、User、Library 三个核心类,需体现类之间的关联关系。”AI 生成的 UML 类图描述(文本版):
+----------------+ +----------------+ | Book | | User | +----------------+ +----------------+ | - title: str | | - name: str | | - author: str | | - role: str | # 如"学生"、"管理员" | - isbn: str | | - borrow_history: list | | - status: str | +----------------+ | - borrower: User|--------|*--------------| +----------------+ | | +----------------+ +----------------+ | Library | +----------------+ | - books: list | | - users: list | +----------------+ | + add_book() | | + borrow_book()-+----+ | + return_book()-+ | +----------------+ | | +----------------+ | | Main | | +----------------+ | | - library: Library|<-+ | + run() | +----------------+ -
核心功能实现:基于领域模型,进一步要求 AI 生成代码:“请基于上述类图,生成 Python 代码实现图书借阅、归还功能,要求借阅时检查图书状态,归还时记录归还时间。”AI 生成的关键方法示例:
python
class Library: def borrow_book(self, book_isbn, user_name): for book in self.books: if book.isbn == book_isbn: if book.status == "可借阅": book.status = "已借阅" book.borrower = user_name book.borrow_date = datetime.datetime.now() # 为用户添加借阅记录 for user in self.users: if user.name == user_name: user.borrow_history.append({ "book_title": book.title, "borrow_date": book.borrow_date }) return True, "借阅成功" else: return False, "图书已被借阅" return False, "图书不存在" def return_book(self, book_isbn): for book in self.books: if book.isbn == book_isbn: if book.status == "已借阅": book.status = "可借阅" return_date = datetime.datetime.now() borrow_date = datetime.datetime.strptime(book.borrow_date, "%Y-%m-%d %H:%M:%S") days_borrowed = (return_date - borrow_date).days book.borrower = None book.borrow_date = None return True, f"归还成功,借阅时长{days_borrowed}天" else: return False, "图书未被借阅" return False, "图书不存在"
3. 测试驱动的优化迭代
孙晟继 同学采用黑盒测试 + 白盒测试结合的方式,对系统进行了多轮验证:
-
黑盒测试场景:
- 场景 1:输入无效 ISBN(如 “123”),验证系统是否提示 “ISBN 格式错误”;
- 场景 2:借阅已被借出的图书,验证系统是否提示 “图书已被借阅”;
- 场景 3:连续添加 10 本不同图书,验证数据持久化是否完整。
-
白盒测试重点:针对
borrow_book方法,通过单元测试验证分支逻辑:python
def test_borrow_book(self): # 初始化图书馆、图书和用户 lib = Library() book = Book("测试图书", "测试作者", "测试出版社", "9787111694220") lib.books.append(book) user = User("测试用户", "学生") lib.users.append(user) # 测试正常借阅 result, msg = lib.borrow_book("9787111694220", "测试用户") self.assertTrue(result) self.assertEqual(msg, "借阅成功") self.assertEqual(book.status, "已借阅") # 测试借阅已借出的图书 result, msg = lib.borrow_book("9787111694220", "另一用户") self.assertFalse(result) self.assertEqual(msg, "图书已被借阅")
基于测试结果,我们又向 AI 提出了3 类优化需求:
- 数据层:“如何将图书数据保存到 SQLite 数据库,实现更可靠的持久化?”
- 交互层:“如何优化控制台菜单的交互体验,比如添加颜色提示?”
- 功能层:“如何实现图书逾期提醒(假设借阅期限为 30 天)?”
AI 针对 “逾期提醒” 生成的代码片段:
python
def check_overdue(self):
overdue_books = []
now = datetime.datetime.now()
for book in self.books:
if book.status == "已借阅":
borrow_date = book.borrow_date
due_date = borrow_date + datetime.timedelta(days=30)
if now > due_date:
overdue_days = (now - due_date).days
overdue_books.append({
"title": book.title,
"borrower": book.borrower,
"overdue_days": overdue_days
})
return overdue_books
四、项目成果与延伸思考
1. 最终系统功能全景
我们的图书管理系统最终实现了7 大核心功能:
- 图书信息管理(添加、修改、删除、查询);
- 多维度查询(按书名、作者、ISBN、出版社);
- 借阅 / 归还流程(含状态校验、时间记录);
- 数据持久化(支持 JSON 文件和 SQLite 数据库双模式);
- 逾期提醒(自动计算并提示超期图书);
- 用户管理(区分管理员和普通用户权限);
- 借阅统计(按月、按用户生成借阅排行)。
其中 “多维度查询” 的运行示例:
请输入操作序号:2
===== 请选择查询方式 =====
1. 按书名查询
2. 按作者查询
3. 按出版社查询
4. 按ISBN查询
请输入序号:2
请输入作者关键词:张三
查询结果:
1. 《Python编程从入门到精通》 ISBN:9787111694220 状态:可借阅
2. 《数据结构与算法分析》 ISBN:9787115537930 状态:已借阅
2. 对 “AI + 编程” 未来的思考
通过本次实践,我们对 “人工智能辅助软件开发” 有了更具象的认知:
- AI 的当前定位:是 “超级助手” 而非 “替代者”。它能高效处理标准化、重复性的编码工作(如生成 CRUD 接口、基础算法实现),但对业务逻辑的深层理解、系统架构的全局设计仍需人类主导。
- 工程师的能力进化:未来的开发者需要更强的 “需求拆解能力” 和 “代码校验能力”—— 能把模糊的业务需求转化为 AI 可理解的精准提示,也能快速识别 AI 生成代码中的潜在问题(如性能瓶颈、逻辑漏洞)。
以本次项目为例,AI 生成的 “数据持久化” 代码最初仅支持单线程写入,在我们提出 “多用户并发访问” 的假设后,又通过提示 “如何实现 Python 文件的并发安全写入?” 得到了带锁机制的优化方案:
python
import threading
class SafeLibrarySystem(LibrarySystem):
def __init__(self):
super().__init__()
self.file_lock = threading.Lock() # 新增文件锁
def save_to_file(self):
with self.file_lock: # 加锁保证并发安全
super().save_to_file()
五、团队总结与致谢
- 陈豪杰(需求与 AI 交互):ChatGPT 的代码生成能力超出预期,但需要非常精准的提示词。比如最初我只说 “生成图书管理系统代码”,得到的是很简陋的版本;后来学会拆解需求(如 “先设计领域模型→再实现核心功能→最后优化交互”),产出质量才明显提升。
- 孙晟继(测试与优化):结对编程让测试工作更有价值。当我发现 “借阅后图书状态未更新” 的问题时,XXX 能快速和 AI 沟通定位,这种 “发现问题→解决问题” 的闭环效率很高;文档与复盘,整理过程中发现,把每次和 AI 的对话记录下来(包括失败的提示词),是很好的学习素材。比如有一次我问 “优化图书系统”,AI 回复很宽泛;后来改成 “从性能、可靠性、易用性三个维度优化图书管理系统的 Python 代码”,得到的建议就具体多了。
感谢本次作业让我们深入体验了 “AI 辅助结对编程” 的完整流程,也期待在后续课程中探索更多软件工程实践方法!
班级:23 计科7班 小组成员:陈豪杰 孙晟继
更多推荐


所有评论(0)