软件工程第一次作业

这个作业属于哪个课程 202601 软件工程
这个作业要求在哪里 软件工程第一次作业
这个作业的目标 ▎ 通过搭建 GitHub 与博客园的开发者身份、调用 Hugging Face Flux 模型实现前端交互式图像生成,以及梳理个人技能树与未来规划,快速适应以博客园为主的课程实践体系,并初步体验大模型在实际应用中的能力。
学号 102401317

一、前期准备工作

  • GitHub 账号:power819,已完善头像、昵称和个人资料。
  • 博客园账号:power1897,已完善头像、昵称和个人资料。
  • 关注任课老师的博客:吴越钟
  • 关注助教的博客:张明圣、王奇蕊

二、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 回传预览

为了跑通,我走了「三步走」:

  1. 纯前端直连index.html 直接 fetch Hugging Face 的 REST 接口 api-inference.huggingface.co,用 Bearer Token 调模型(flux作业 版本);
  2. Python 脚本main.pyhuggingface_hub.InferenceClient.text_to_image 生成并保存 result.png
  3. 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 调用成功记录

65d0038a665c8ecde5ddea611d4c176

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 权限后重新提交,第二次成功返回图片并预览。
65d0038a665c8ecde5ddea611d4c176
e86afe287f6204ab915ddbd78c2619a

2.6 使用体验与心得

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

三、GitHub 个人主页搭建

本次选择创建个人资料自述文件(Profile README)的方案:在与 GitHub ID 同名的仓库中,用 Markdown 编写根目录下的 README.md,把个人介绍和技术栈展示在 GitHub 个人资料页。
d2490bda34ab48157d35c45f30c5574

四、个人技术梳理|软件工程课程随笔

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 课程期待学习的知识与收获

本课程中,我最期待学到的是一套完整的软件开发方法论——从需求分析、系统设计、编码实现,到测试、部署、维护的完整流程,而不是零散的编程技巧。

具体希望获得的收获:

  1. 掌握规范的开发流程:学会做需求分析、画设计图、写技术文档,让「写代码」之前有清晰的规划;
  2. 学会团队协作:真正使用 Git 分支管理、代码评审、任务拆分来和他人合作,而不是一个人闷头写;
  3. 建立质量意识:理解单元测试、集成测试的价值,学会用测试来保障代码的正确性;
  4. 提升架构能力:能够把一个中等规模的项目拆分成清晰的模块,写出可读、可维护、可扩展的代码。

五、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. 指南默认读者「数据结构与算法基础已经不错」,而我这块恰恰偏弱,所以第 1 阶段不能一带而过,需要多花时间补基础;
  2. 指南语言假设是 Python/Java 等通用语言,我目前更习惯 Python 和 JavaScript,可以沿用自己的语言栈来练,效果一样;
  3. 指南里「TDD」「CI/CD」等内容对我来说还比较抽象,需要在真实项目里用过一次才能真正理解,所以我会把重点放在「跟着项目走一遍」上,而不是死记概念。

总的来说,这份指南给我画了一张清晰的学习地图,我会以它为框架,再根据自己的弱项(算法基础、设计方法论)做针对性补充,让它真正落地。

六、随笔后台编辑截图

232ae032e8dd6f29ddddb6ea9033af7

posted @ 2026-09-08 22:25  power1897  阅读(25)  评论(0)    收藏  举报