从一次 API 调用开始:我的软件工程学习起点
| 这个作业属于哪个课程 | 2026 软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 第一次作业要求 |
| 这个作业的目标 | 梳理自己的能力与不足,体验模型 API 与前端交互开发,搭建个人主页,并熟悉用 Markdown 和博客记录、展示软件工程实践的过程。 |
| 学号 | 102302152 |
从一次 API 调用开始:我的软件工程学习起点
一、关于我:实践过什么,还欠缺什么
我是戴锴斌,福州大学数据科学与大数据技术专业的大三学生。学习之外,我喜欢打羽毛球、跑步,也喜欢打游戏。目前以毕业后就业为目标,关注 Java 后端开发、AI 应用/Agent 开发和数据开发三个方向。
我参与过校园网站的开发维护,也曾在星网锐捷实习,参与客诉数据分析平台相关工作。目前,我更熟悉在已有工程中实现具体功能,在技术原理、独立设计和项目表达方面仍有不足。
1. 当前技能树与自我评估
| 能力方向 | 已有知识与实践 | 仍需深入的部分 |
|---|---|---|
| Java 后端 | 在已有 Spring Boot 工程中参与接口与业务功能开发,处理参数、分层逻辑、文件传输和异常 | Java 集合、JVM、并发与事务的原理,复杂业务的独立设计 |
| 数据处理 | 使用 MySQL、Python 处理业务数据和文本,参与清洗、迁移方案整理及结果核对 | 索引原理、数据建模、数据质量验证与处理流程的可靠性 |
| AI 应用 | 对接模型 API,组织提示词与结构化输出,学习 Agent 循环和工具调用 | 上下文管理、工具失败处理、停止条件与模型效果评估 |
| 工程协作 | 使用 Git 管理变更,参与前后端联调、项目维护和部署交接资料整理 | 更系统的测试方法、需求拆解、技术文档和项目表达 |
对于 React/TypeScript、Docker/Nginx 和 MCP,我目前主要停留在使用与联调层面,对其原理和独立应用还需要深入学习。
2. 实习与项目经历
- 客诉数据分析平台——实习经历:参与工单与对话文本清洗、问题摘要、打标处理与结果核对,以及评估报告指标修正。项目涉及 Python、FastAPI、MySQL 和大模型接口。
- SOSD 实验室网站——团队项目:在已有 Java 工程中参与竞赛材料批量打包与选定材料下载、招新组别调整、数据库字符集修正和部署交接整理。
- AI Agent——学习实践:基于教程与开源代码复现、阅读 Agent Loop、工具执行与结果回传、会话和流式输出等内容,并接触 MCP 工具接入。
3. 最需要加强的三项能力
- 技术原理。部分技术仍偏重使用,对底层机制和适用边界的理解不够深入。准备结合项目问题读源码、做小实验,练习回答“为什么这样实现”。
- 独立设计。希望从在现有项目中实现功能,逐步过渡到独立拆解需求、划分模块、设计数据模型和异常路径。先从小模块做起,写设计、实现、测试,再复盘。
- 项目表达。需要更清楚地说明业务目标、个人贡献和技术选择。准备按“背景—问题—方案—取舍—结果”整理项目,避免只罗列框架名称。
4. 技术偏好与最希望学习的知识
我对后端业务逻辑、数据处理和 AI 应用之间的结合感兴趣。三个就业方向都与已有实践相关,目前尚未确定唯一方向,希望通过后续项目和实习进一步明确侧重。
最希望学习的是技术原理、系统设计与工程化方法:不仅把功能运行起来,还能理解方案的限制,独立作出设计,并用测试和记录验证结果。
二、代码量与本学期目标
| 项目 | 估计或目标 |
|---|---|
| 截至目前累计代码量 | 约 20,000 行,属于个人粗略估算,尚未进行准确统计 |
| 本学期希望新增 | 约 5,000 行 |
| 完成本学期课程后的累计目标 | 约 25,000 行 |
上述代码量为粗略估算,不包含第三方依赖和直接复制的模板代码。后续计划结合 Git 提交记录进行统计。
三、我对软件工程课程的期待
我最期待学习如何把一个需求转化为结构清晰、能够验证的软件,尤其是需求分析、系统设计和软件测试。
过去我更多是在已有工程中完成具体功能,希望通过本课程提高独立拆解需求、设计模块和验证结果的能力。同时,也希望练习团队协作与技术表达,能够清楚地说明项目背景、个人贡献和方案取舍,为后续实习与就业做准备。
四、Hugging Face API:让雨后的校园出现在页面上
1. 实验目标与实现方式
本次使用作业指定的 XLabs-AI/flux-RealismLora,生成一张偏真实摄影风格的校园图像,并通过前端页面实现提示词输入、提交生成、展示图片和查看调用记录。
实际请求通过 Hugging Face 路由访问 fal-ai 的 FLUX LoRA 推理服务,请求参数中明确加载指定模型仓库的 lora.safetensors 权重。
交互流程为:
前端输入提示词 → 本地 Python 后端 → Hugging Face 推理路由 → 获取结果并下载图片 → 前端展示图片和记录。
前端使用 HTML、CSS 和 JavaScript;后端使用 Python 标准库。Hugging Face 令牌只保存在本地后端配置中,不写进前端代码或公开仓库。
2. 实际操作步骤
- 在 Hugging Face 注册个人账号,创建用于调用推理服务的令牌。
- 将令牌保存在本地
.env中,配置项名称为HF_TOKEN;将.env加入.gitignore,截图和博文中不展示令牌值。 - 编写本地后端与交互页面,使用
python3 app.py启动服务,在浏览器打开http://127.0.0.1:8765/。 - 在页面中填写提示词,点击生成并确认提交。后端先保存请求记录,再发送一次真实推理请求。
- 接口返回后,下载 PNG 图片,保存提示词、参数、HTTP 状态码和耗时;前端显示生成结果,提供图片和记录下载入口。
3. API 调用核心代码
下面是后端 generate() 的核心请求逻辑节选。token 由后端读取,record 保存本次参数;完整程序还包含记录落盘、下载、状态区分和异常处理。
import json
from urllib.request import Request, urlopen
ENDPOINT = "https://router.huggingface.co/fal-ai/fal-ai/flux-lora"
LORA = (
"https://huggingface.co/XLabs-AI/flux-RealismLora/"
"resolve/main/lora.safetensors"
)
payload = {
"prompt": prompt,
"seed": record["seed"],
"image_size": {
"width": record["width"],
"height": record["height"],
},
"num_inference_steps": record["num_inference_steps"],
"guidance_scale": record["guidance_scale"],
"num_images": 1,
"loras": [{"path": LORA, "scale": 1}],
"enable_safety_checker": True,
"output_format": "png",
}
request = Request(
ENDPOINT,
data=json.dumps(payload).encode(),
headers={
"Authorization": "Bearer " + token,
"Content-Type": "application/json",
},
method="POST",
)
with urlopen(request, timeout=180) as response:
record["http_status"] = response.status
result = json.loads(response.read())
image_url = result["images"][0]["url"]
# 下载图片时不携带 Hugging Face 令牌。
前端不直接访问推理平台,而是调用本地接口。关键代码如下,state.session_key 是本地页面会话校验值,不是 Hugging Face 令牌:
const response = await fetch('/api/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Session-Key': state.session_key,
},
body: JSON.stringify({ prompt }),
});
const result = await response.json();
if (!response.ok) throw new Error(result.error || '提交失败');
// 完整程序刷新 /api/status,读取保存的记录后渲染图片。
await refresh();
4. 提示词设计思路
我选择“雨后的福州校园”,希望画面具有日常生活感,而不是过度戏剧化的海报效果。
提示词围绕五个方面组织:
| 设计要素 | 具体描述 | 用意 |
|---|---|---|
| 主体与地点 | 福州一处安静的大学校园 | 明确场景范围 |
| 环境细节 | 榕树、湿润石板路、朴素教学楼 | 用具体物体建立空间与生活感 |
| 人物与动作 | 一名远处撑伞、背向镜头行走的学生 | 增加日常活动,避免复杂正面人物特写 |
| 光线与色彩 | 阴天柔和光、自然颜色 | 追求自然、克制的摄影效果 |
| 摄影视角 | 纪实摄影、平视视角 | 让画面更接近日常观察 |
实际用于第一次调用的提示词为:
A realistic documentary photograph of a quiet university campus in Fuzhou,
China, just after light rain. A wet stone pathway leads past mature banyan
trees toward a modest teaching building. One student holding an umbrella
walks away in the distance. Soft overcast daylight, natural colors,
eye-level view, candid everyday campus atmosphere.
5. 真实调用成功记录
| 项目 | 实际记录 |
|---|---|
| 调用时间 | 2026-09-05 11:52:08,UTC+8 |
| 模型 | XLabs-AI/flux-RealismLora |
| 服务提供方 | fal-ai,经 Hugging Face 路由 |
| HTTP 状态码 | 200 |
| 本地最终状态 | success |
| 本地记录耗时 | 8.81 秒,包含推理请求及图片下载处理,不是纯模型推理时长 |
| 图像尺寸 | 1024 × 768 |
| 随机种子 | 20260905 |
| 推理步数 | 28 |
| guidance_scale | 3.5 |
| 实际生成图片数 | 1 |
本地 JSON 原始记录节选如下,未包含令牌:
{
"id": "1d65e16c61de44ad9bb0522ad8d89c6a",
"created_at": "2026-09-05T11:52:08+08:00",
"model": "XLabs-AI/flux-RealismLora",
"provider": "fal-ai",
"seed": 20260905,
"width": 1024,
"height": 768,
"num_inference_steps": 28,
"guidance_scale": 3.5,
"status": "success",
"http_status": 200,
"elapsed_seconds": 8.81
}
6. 生成结果与前端截图
下面是本次 API 返回并保存的原始图片:

下图为前端页面的展示截图,已使用 AI 修图清理两处辅助说明文字,可能有轻微重绘;API 原始生成结果见上图。

7. 观察结果与提示词修改
第一次结果中,阴天光线、湿路反光和树木形成的空间层次比较符合目标;但人物控制并不完全符合提示词:撑伞人物比预期更靠近镜头,远处还出现了另一名人物,与“一名远处学生”的描述存在差异。
因此,我在整理本次作业时形成了下面的提示词修订版,重点明确人物数量、位置和大小,并保留原来的环境与光线描述:
A realistic documentary photograph of a quiet university campus in Fuzhou,
China, just after light rain. A wet stone pathway leads past mature banyan
trees toward a modest teaching building. Exactly one student in the entire
scene, far in the background near the building, occupying a small part of
the frame, holding an umbrella and walking away from the camera. The
foreground and middle of the pathway are empty, with no other people.
Soft overcast daylight, natural colors, subtle wet-stone reflections,
eye-level view, candid everyday campus atmosphere.
8. 调用体验
这次实践中,我印象最深的是三个方面:
- 生成成功不等于完全符合需求。图片整体自然,但人物数量和距离仍需逐项检查,不能只看第一眼是否好看。
- 接口与前端需要共同考虑状态。提交中要防止重复点击,超时不能直接认定没有生成,下载失败也不应该立即重新请求推理。
- 记录比口头描述更可靠。保存提示词、参数、状态码、耗时和原图,才能说明到底调用了什么、得到了什么;后续修改也有比较依据。
API 降低了体验模型的门槛,但一个可用的小应用仍需要处理鉴权、输入、状态、错误和结果保存。后续还需要进一步完善异常处理和测试,提高程序的稳定性。
五、GitHub Pages:建立可持续更新的个人主页
1. 方案选择
我选择 GitHub Pages,使用与账号对应的仓库 dkb0704.github.io。
界面方案经历了调整:最初尝试自制页面,之后尝试深色交互作品集,但我更希望博客明亮、简洁,适合持续阅读和记录。对比 Chirpy、AstroPaper 和 Astro Cactus 的官方演示后,最终选择 Chirpy 浅色主题。
本次直接复用 Chirpy 官方开源主题及 Chirpy Starter,实际构建主题版本为 7.6.0。保留 MIT 许可证和页脚署名。我的工作重点是主题选型、配置、个人内容整理及部署实践。
2. 页面内容与自我评估
“关于”页集中展示姓名、学校、专业、兴趣爱好、实习与项目、能力与不足、技术兴趣和三年规划。首页以文章形式分别记录个人介绍、客诉平台实习、SOSD 项目、Agent 学习和就业规划。
关于页:个人介绍与技能自评
3. 未来三年规划
我的目标是毕业后就业,希望将学习成果用于实际业务,并在团队合作中继续成长。
| 阶段 | 主要目标 | 行动计划 |
|---|---|---|
| 大三 | 补基础、深入做项目 | 巩固 Java、算法、数据库、操作系统与网络;理解已有项目方案,练习独立设计小模块、测试与复盘,争取相关实习机会。 |
| 大四 | 明确侧重、完成求职 | 结合实践反馈选择主要投递方向,完成毕业设计,整理简历与项目材料,准备技术面试和校园招聘。 |
| 毕业后第一年 | 融入团队、承担模块 | 熟悉业务和开发流程,逐步负责模块的开发、测试与维护,在日志、性能、可靠性和沟通方面积累经验。 |
4. 部署过程与结果
- 创建公开仓库,并确认已有初始化提交。
- 配置博客的中文语言、浅色主题、姓名、简介、头像、文章和关于页。
- 在仓库 Settings → Pages 中,将 Source 设为 GitHub Actions。
- 在独立发布目录验证并提交源码,保留原有提交历史,不上传
.env、临时依赖和构建缓存。 - 等待主题工作流构建、测试和部署,再访问正式网址核对内容。
下面是正式上线后的首页截图:

六、AI 生成的软件工程课程学习指南与我的分析
1. AI 工具与任务
本次使用的 AI 工具为 ChatGPT。我提供了个人背景、项目经历、就业方向和希望加强的能力,请它在整理作业时生成一份简要的软件工程课程学习指南。
2. AI 生成的简要学习指南
软件工程课程学习指南
- 从需求开始。明确软件服务谁、解决什么问题、哪些功能不在范围内。把重要需求写成可以检查的验收条件,避免边开发边无限增加功能。
- 先设计,再实现。用适量文字和图说明模块职责、数据模型、接口与异常路径。结合项目规模选择方案,不为展示技术而增加不必要的复杂度。
- 小步开发与版本管理。把任务拆成可验证的小部分,使用 Git 保存清晰的变更。团队协作时明确任务负责人和接口约定,及时同步问题。
- 让测试贯穿开发。根据功能风险检查正常输入、边界条件、失败情况和模块之间的交互。修复问题后补充回归验证,保留测试依据。
- 重视文档和项目表达。持续记录运行方式、关键设计、已知限制和个人贡献。按照“背景—问题—方案—取舍—结果”介绍项目,而不只是展示最终界面。
- 有边界地使用 AI。可以让 AI 辅助解释、起草和排查问题,但需要自己核对输出、运行验证,并说明使用范围;不要输入密钥或真实客户数据。
- 定期复盘。每周回顾完成内容、遇到的问题和下周重点。以课程实际要求为准,逐步把需求、设计、实现、测试和交付串起来。
3. 合理性与对我的帮助
整体上,这份指南比较合理,因为它没有把软件工程缩减为“多写代码”,而是覆盖了需求、设计、实现、测试和交付等环节。
对我最有帮助的是三点:第一,需求与验收条件能够帮助我练习独立拆解任务;第二,设计和测试能够促使我解释方案,而不是只追求运行成功;第三,持续记录与结构化复盘对应了我希望加强的项目表达能力。
但它也有局限:内容比较通用,不知道课程每次作业的具体安排,也不能替我判断已经真正掌握了哪些知识。实际执行时应以课程要求和项目规模为准,不需要每个小功能都写很长的文档,更不能机械照搬一个固定流程。
我的计划是把它落实为小行动:实现前写清需求和验收条件,完成后检查正常与异常情况,每周整理一次问题与收获。技术原理仍需结合教材、官方文档、源码与实验学习,AI 指南只能提供组织思路。
七、Markdown 编辑与本次小结
博客园已经完成申请与开通,新建随笔页面中选择的是 Markdown 编辑器。本次用表格整理目标和结果,用代码块展示接口逻辑,用图片记录实际页面,并通过链接提供个人主页和源码仓库。

这次作业让我把个人能力梳理、模型 API 调用、前端交互、GitHub Pages 和博客记录联系起来。对我而言,一个重要的起点是如实区分“已经完成”“接触过”和“还需要学习”:既展示实际做过的事情,也保留不足与后续改进的空间。

浙公网安备 33010602011771号