软件工程第一次作业
| 这个作业属于哪个课程 | 202601 软件工程 |
|---|---|
| 这个作业要求在哪里 | 软件工程第一次作业 |
| 这个作业的目标 | ▎ 通过搭建 GitHub 与博客园的开发者身份、调用 Hugging Face Flux 模型实现前端交互式图像生成,以及梳理个人技能树与未来规划,快速适应以博客园为主的课程实践体系,并初步体验大模型在实际应用中的能力。 |
| 学号 | 102401317 |
一、前期准备工作
二、Hugging Face API 调用:Flux 真实感图像生成
本次作业使用 Hugging Face 的 Inference Providers,调用 XLabs-AI/flux-RealismLora 模型生成写实图像。我先用两种最简方式把调用跑通,再封装成一个前后端分离的 Node.js 服务,接入交互页面。
2.1 账号与 Token
- 注册 Hugging Face 账号(huggingface.co),在个人设置页面生成具备调用权限的 User Access Token。
- 本地开发时,Token 由用户在页面输入、随请求体传给后端,不硬编码在源码里,避免直接泄露。
![312ac0a499a7fc26a17dc3be0e12548]()
2.2 实现思路
整体架构:浏览器前端 index.html → 本地后端 server.js → @huggingface/inference SDK → Hugging Face Inference Provider → 图片以 base64 回传预览。
为了跑通,我走了「三步走」:
- 纯前端直连:
index.html直接fetchHugging Face 的 REST 接口api-inference.huggingface.co,用 Bearer Token 调模型(flux作业版本); - Python 脚本:
main.py用huggingface_hub.InferenceClient.text_to_image生成并保存result.png; - Node.js 服务封装:
flux-node用 Express +@huggingface/inference做成后端接口,前端提交 Token 和 prompt,后端返回 base64 图片,形成完整的前后端分离结构。
2.3 核心代码
后端 server.js(Express + @huggingface/inference):
import express from "express";
import { InferenceClient } from "@huggingface/inference";
const app = express();
app.use(express.json({ limit: "20mb" })); // 允许较大的 JSON(base64 图片)
app.use(express.static("public"));
app.post("/generate", async (req, res) => {
const { token, prompt } = req.body;
if (!token || !prompt) {
return res.status(400).json({ success: false, error: "缺少 token 或 prompt" });
}
try {
const client = new InferenceClient(token);
// provider 默认 "auto",SDK 自动选择第一个支持该模型的 Provider
const blob = await client.textToImage({
model: "XLabs-AI/flux-RealismLora",
inputs: prompt,
});
const buffer = Buffer.from(await blob.arrayBuffer());
const base64 = buffer.toString("base64");
res.json({ success: true, mime: blob.type || "image/png", image_base64: base64 });
} catch (err) {
res.json({ success: false, error: err.message });
}
});
app.listen(3000, () => console.log("http://localhost:3000"));
前端 index.html 提交 prompt 并预览返回图片:
const resp = await fetch("/generate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ token, prompt }),
});
const data = await resp.json();
if (data.success) {
img.src = "data:" + data.mime + ";base64," + data.image_base64;
}
2.4 API 调用成功记录

2.5 提示词设计思路与迭代
我先将画面主题确定为「窗边少女的纪实人像」,围绕「纪实感、真实皮肤质感、自然光线」三个目标来组织提示词。
最终提示词:
a candid portrait of a young woman by a window, soft natural daylight, realistic skin texture, subtle freckles, 85mm lens, shallow depth of field, natural colors
这份提示词按「主体 → 场景 → 光线 → 质感 → 镜头 → 色彩」分层设计:
candid portrait:纪实抓拍风格,避免摆拍的僵硬感;young woman by a window:明确主体与场景,用窗边自然光作光源;soft natural daylight:柔和自然日光,营造真实的光照氛围;realistic skin texture, subtle freckles:强调皮肤质感与雀斑等细节,更接近真实人像照片;85mm lens, shallow depth of field:85mm 人像镜头 + 浅景深,突出人物、虚化背景;natural colors:自然克制的色彩,避免过度饱和失真。
实际调用过程:第一次提交后,前端返回失败,报错为「This authentication method does not have sufficient permissions to call Inference Providers」——这是 Hugging Face 认证权限不足导致的,与提示词和代码无关。调整 Token 权限后重新提交,第二次成功返回图片并预览。


2.6 使用体验与心得
- 排查报错先分清「谁的锅」:第一次调用失败,报错是认证权限不足,而不是代码或提示词写错。这提醒我遇到报错不要急着改代码,先读错误信息本身——问题往往出在账号权限、网络环境这些代码之外的地方。
- 提示词要分层设计:把主体、场景、光线、质感、镜头、色彩分开来写,模型对画面的控制会更稳定,比一句模糊的描述效果好得多。
- 云端 API 降低硬件门槛:全程云端算力,不需要在本地部署庞大的 Flux 大模型,普通电脑就能生成高清写实人像。
- 封装成服务是软件工程的关键一步:从「纯前端直连」到「Node.js 后端封装」,把 AI 能力封装成后端接口后,前端只需调接口,职责更清晰、也更好扩展——这正是「后端 AI 服务 + 前端交互」的软件工程思想。
- 密钥与隐私要当心:Token 不能硬编码进源码;截图发布前记得给 Token 打码,避免泄露。
三、GitHub 个人主页搭建
本次选择创建个人资料自述文件(Profile README)的方案:在与 GitHub ID 同名的仓库中,用 Markdown 编写根目录下的 README.md,把个人介绍和技术栈展示在 GitHub 个人资料页。

四、个人技术梳理|软件工程课程随笔
4.1 技能树与自我评估
✅ 已具备的专业知识与能力
- 能力 A:Python 编程与脚本自动化
- 使用 Python + pygame 独立开发过多个小游戏,例如「切水果」(fruit-ninja)、手势交互类应用(gesture-lab);
- 编写过 PDF 文本提取(pdf_text)、鼠标自动点击等自动化工具脚本。
- 能力 B:Web 与后端开发(JavaScript / Node.js)
- 独立完成过一个完整的 Node.js 项目(birthday-blessing),包含 Web 服务和 TG Bot 两部分;
- 使用 Docker 打包应用并部署到 Railway 平台,实际处理过容器依赖缺失(如 Chromium 系统库)、自定义启动命令等部署运维问题;
- 使用 Playwright 做过浏览器自动化。
- 能力 C:C/C++ 与计算机底层入门
- 熟悉 C++ 基础语法(使用 Dev-C++),写过 Windows 桌面小工具(如鼠标连点器);
- 接触过汇编语言(.asm),对程序在底层的运行方式有初步认识。
- 能力 D:3D 图形与建模
- 能够使用 Blender 进行建模、骨骼绑定、蒙皮和渲染(熟悉 EEVEE / CYCLES 渲染引擎)。
- 能力 E:AI 工具的实际应用
- 使用过 Flux 等图像生成模型并做过相关项目(flux-node、flux作业),接触过三模态(文本 / 图像等)相关实验;
- 平时习惯使用 AI 工具辅助编程和学习,具备一定的 AI 应用实践能力。
🎯 感兴趣的技术方向
- 人工智能:图像生成、多模态模型的应用;
- 游戏开发与计算机图形学:从 pygame 到 Blender,对「做出来的东西看得见、能互动」有天然的兴趣;
- 全栈 Web 与后端开发:从写代码到真正部署上线跑起来的完整链路;
- 自动化脚本:用程序替代重复劳动。
❌ 当前欠缺的能力
- 数据结构与算法基础不够扎实:多数项目是「能跑通就行」,缺乏对时间/空间复杂度的系统训练;
- 缺乏系统化的软件工程方法论:需求分析、系统设计、设计模式、单元测试、文档规范等环节做得少,项目偏向「凭感觉写」;
- 计算机基础理论薄弱:操作系统、计算机网络、编译原理等底层原理理解不深;
- 大型项目的架构设计经验不足:目前多是个人小项目,缺少模块化、分层、多人协作的经验;
- 数据库与后端工程化能力欠缺:对数据库设计、接口规范、CI/CD 等接触较浅。
4.2 代码量现状与学期目标
- 截至目前累计代码量:约 3000~4000 行(覆盖 Python、JavaScript/Node.js、C++ 等语言)。
- 本学期希望达到的代码量:10000 行以上。希望通过本课程的系统训练,让代码量上一个数量级,并且从「写得多」进一步走向「写得规范、写得可维护」。
4.3 课程期待学习的知识与收获
本课程中,我最期待学到的是一套完整的软件开发方法论——从需求分析、系统设计、编码实现,到测试、部署、维护的完整流程,而不是零散的编程技巧。
具体希望获得的收获:
- 掌握规范的开发流程:学会做需求分析、画设计图、写技术文档,让「写代码」之前有清晰的规划;
- 学会团队协作:真正使用 Git 分支管理、代码评审、任务拆分来和他人合作,而不是一个人闷头写;
- 建立质量意识:理解单元测试、集成测试的价值,学会用测试来保障代码的正确性;
- 提升架构能力:能够把一个中等规模的项目拆分成清晰的模块,写出可读、可维护、可扩展的代码。
五、AI 生成的《软件工程学习指南》及我的分析
以下指南由 AI 工具(ChatGPT)生成,原文复制如下,随后附上我的分析。
(ChatGPT 生成的)软件工程课程学习指南
第 1 阶段:打好计算机基础(第 1~2 周)
- 复习数据结构与算法(数组、链表、栈、队列、树、图、排序、查找);
- 掌握至少一门语言(如 Python 或 Java)的基本语法和标准库;
- 熟悉命令行操作和版本管理工具 Git 的基本命令。
第 2 阶段:理解软件工程核心流程(第 3~6 周)
- 学习需求分析:如何把用户需求转化为可验证的功能点;
- 学习系统设计:UML 类图、时序图、数据库设计(ER 图);
- 学习设计原则与常见设计模式(单一职责、开闭原则,工厂、观察者等);
- 学习测试:单元测试、集成测试,了解 TDD(测试驱动开发)。
第 3 阶段:动手做一个完整项目(第 7~12 周)
- 以小组形式从 0 到 1 完成一个项目,覆盖需求→设计→编码→测试→部署全流程;
- 使用 Git 进行分支管理,配合代码评审;
- 接入 CI/CD,做到「提交即构建、构建即测试」。
第 4 阶段:总结与拓展(第 13~16 周)
- 复盘项目中的问题,形成自己的开发习惯;
- 补充软件工程进阶知识:重构、性能优化、代码审查、工程化工具链;
- 持续积累代码量,形成个人作品集。
这份指南是否合理?
我认为整体上是合理且结构清晰的。它把软件工程学习拆成「基础 → 核心流程 → 项目实践 → 总结」四个阶段,由浅入深,逻辑通顺;尤其把「动手做一个完整项目」作为重头戏,和我对这门课的期待(学到完整开发流程、学会团队协作)高度一致。它提到的 Git 分支管理、代码评审、CI/CD、测试这些内容,也正好是我目前比较欠缺、最想补上的部分。
能否对自己带来帮助?
能,但需要结合我的实际情况做一点调整:
- 指南默认读者「数据结构与算法基础已经不错」,而我这块恰恰偏弱,所以第 1 阶段不能一带而过,需要多花时间补基础;
- 指南语言假设是 Python/Java 等通用语言,我目前更习惯 Python 和 JavaScript,可以沿用自己的语言栈来练,效果一样;
- 指南里「TDD」「CI/CD」等内容对我来说还比较抽象,需要在真实项目里用过一次才能真正理解,所以我会把重点放在「跟着项目走一遍」上,而不是死记概念。
总的来说,这份指南给我画了一张清晰的学习地图,我会以它为框架,再根据自己的弱项(算法基础、设计方法论)做针对性补充,让它真正落地。
六、随笔后台编辑截图



浙公网安备 33010602011771号