2026软件工程第一次作业
| 这个作业属于哪个课程 | H202601软件工程与软件工程实践 |
|---|---|
| 这个作业要求在哪里 | 2026秋软件工程个人作业(第一次) |
| 这个作业的目标 | 建立起自己的技术阵地(GitHub和博客),体验最新的AI开发工具(Hugging Face),并且诚实地面对自己当前的水平和不足,做好迎接软件工程课程挑战的准备。 |
| 学号 | 102401301 |
一、自我评估
个人背景概述
我是一名软件工程专业的学生,目前正在学习软件工程核心课程。在此之前,我已经完成了程序设计基础、数据结构、计算机组成原理等先修课程,具备一定的编程实践能力。通过课程学习和课外项目,我对软件开发的基本流程有了初步认识,但距离成为一名合格的软件工程师还有较大差距。以下将从“已具备的专业知识与能力”、“感兴趣的技术方向”、“还欠缺的能力”三个方面进行详细评估,并说明目前的代码量及学期目标。
已具备的专业知识与能力
能力 A:编程语言基础
- 掌握程度:熟练使用 C 和 C++ 进行面向过程与面向对象编程,能够独立完成中小规模命令行程序或简单 Web 后端接口的开发。
- 具体表现:
- 熟悉 C 的基本语法、列表推导式、装饰器、生成器等高级特性;
- 掌握数据结构中类与对象、继承、多态、异常处理、集合框架等核心概念;
- 了解 C++ 语言的基本语法,能够阅读并修改简单的 C 程序。
能力 B:数据结构与算法
- 掌握程度:理解常用数据结构(数组、链表、栈、队列、树、图、哈希表)的原理和适用场景,能够实现基本的排序、查找算法。
- 具体表现:
- 能够分析算法的时间复杂度和空间复杂度;
- 能够将实际问题抽象为数据结构问题,并选择合适的数据结构进行求解。
能力 C:基本调试与测试
- 掌握程度:能够使用调试工具定位简单错误,并编写基础单元测试。
- 具体表现:
- 熟悉 IDE 的断点调试功能;
- 理解断言、测试用例、测试套件的基本概念。
感兴趣的技术方向
方向一:后端开发与系统设计
我对后端开发有浓厚兴趣,尤其是如何设计高可用、可扩展的服务端系统。我希望深入学习微服务架构、消息队列、缓存技术(如 Redis)、数据库优化等知识,并能够独立设计一个中等复杂度的后端系统。
方向二:云原生与 DevOps
随着云计算的发展,我对容器化、持续集成/持续交付(CI/CD)、基础设施即代码(IaC)等概念非常感兴趣。我计划学习 Docker、Kubernetes、GitHub Actions 等工具,并尝试在项目中搭建完整的自动化部署流水线。
方向三:软件架构与设计模式
我意识到编写“能跑”的代码远远不够,如何设计出易维护、易扩展的软件架构是工程师的核心能力。因此,我对设计模式、架构风格(如分层、事件驱动、微服务)以及 SOLID 原则等内容有强烈的学习意愿。
方向四:人工智能工程化
我选修过机器学习导论课程,对将 AI 模型集成到实际软件系统中(如推荐系统、智能客服)很感兴趣。未来希望了解如何构建 ML Pipeline、模型部署与监控等相关工程实践。
还欠缺的能力
欠缺 A:软件需求分析与文档撰写
- 现状:过去做项目时往往直接开始编码,很少认真进行需求分析和编写规格说明书。对于用户故事、用例图、验收标准等工具的使用不熟练。
- 影响:导致开发过程中需求频繁变更,返工率高。
- 改进计划:本学期课程中,我会在项目开始前使用课堂所学的方法进行需求获取与分析,并输出一份完整的软件需求规格说明书(SRS)。
欠缺 B:系统设计与架构能力
- 现状:目前做过的项目规模较小,代码结构简单,没有经历过复杂系统的设计。对高并发、分布式、缓存一致性等高级架构问题只有模糊认识。
- 影响:难以胜任大型项目的开发,无法合理划分模块和选择技术栈。
- 改进计划:通过学习设计模式、架构课程,并在课程大作业中尝试使用分层架构或微服务思想进行设计,积累实践经验。
欠缺 C:团队协作与项目管理工具的实际使用
- 现状:小组作业中虽然使用过 Git,但没有使用过专业的项目管理工具,也没有系统地进行任务拆分、估算和进度跟踪。
- 影响:团队开发时容易出现任务分配不均、进度失控的问题。
- 改进计划:在课程团队项目中,尝试使用看板工具管理任务,并采用敏捷迭代的方式进行开发。
代码量说明
当前代码量
截至目前,我在课程学习和个人练习中累计编写的代码大约为 8,000~10,000 行(以课程作业、学科竞赛为主)。这些代码主要集中在小规模程序和算法练习上,代码结构相对简单,重复性较高。
学期结束后的目标代码量
完成本学期软件工程课程后,我希望累计代码量达到 20,000 行以上。这意味着在本学期内需要新增约 10,000~12,000 行代码,主要通过以下途径实现:
- 课程大作业(预计 5,000~7,000 行):一个中等规模的 Web 应用或微服务项目,包含完整的需求、设计、实现和测试。
- 个人练习与实验(预计 2,000~3,000 行):包括设计模式练习、TDD 练习、重构练习等。
- 参与开源项目或课外项目(预计 3,000~5,000 行):尝试为开源社区贡献代码,或自行开发一个感兴趣的工具。
当然,代码量并非唯一目标,我更注重代码质量的提升,希望在增加代码量的同时,能够写出更规范、更易维护的代码。
总结
通过以上评估,我认识到自己已经具备了软件开发所需的基础编程能力和部分工具使用经验,但在软件工程核心领域仍存在明显短板。本学期我将以课程项目为主线,重点补齐这些短板,努力从一个“会写代码的人”向“合格的软件工程师”迈进。我会持续记录学习过程,并在期末时再次进行自我评估,检验成长效果。
二、学习期望
1. 需求工程与软件设计方法
在以往的项目中,我常常跳过需求分析直接编码,导致后期频繁修改。本学期我最期待系统学习如何从用户需求出发,进行需求获取、分析、规格说明和验证,掌握用例图、用户故事等工具。同时,我也希望深入学习软件设计的原则与模式,例如 SOLID 原则、常见设计模式,以及如何绘制 UML 图来表达系统结构,从而提升自己设计可维护、可扩展系统的能力。
2. 软件架构与系统设计
我目前做过的项目规模较小,从未真正接触过复杂系统的架构设计。因此,我非常期待学习分层架构、微服务、事件驱动等架构风格,理解不同架构的权衡与适用场景。希望通过课程,能够学会如何将一个大问题分解为多个模块,合理划分服务边界,并了解高并发、缓存、消息队列等进阶概念。
3. 测试驱动开发与质量保证
测试是我之前最容易忽视的环节。我期待在本课程中真正实践测试驱动开发(TDD),体验“红-绿-重构”的开发节奏,并学习单元测试、集成测试、端到端测试等不同层次的测试策略。此外,我也希望了解代码审查、静态分析、持续集成等质量保证手段,养成写出高质量代码的习惯。
4. DevOps 与持续交付
我对云原生和自动化部署非常感兴趣,但到目前为止还没有搭建过完整的 CI/CD 流水线。本学期我期待学习如何使用 Git、GitHub Actions、Docker 等工具,实现从代码提交到自动构建、测试、部署的完整流程。掌握这些技能不仅能提升开发效率,也能让我更贴近企业中的实际开发环境。
5. 软件项目管理与团队协作
软件工程不仅是技术活,更是团队活动。我希望学习敏捷开发方法(如 Scrum、Kanban),掌握任务拆分、估算、进度跟踪和风险管理的基本方法。同时,期待在课程团队项目中实践看板工具、代码评审、结对编程等协作方式,提升自己的沟通和协作能力。
三、希望获得的收获
1. 形成完整的软件工程思维
我希望通过本课程,能够从“会写代码”转变为“会做软件”。具体来说,就是能够遵循需求分析 → 设计 → 编码 → 测试 → 维护的完整流程,每一步都有章可循,不再凭感觉开发。最终能够独立撰写规范的需求文档、设计文档和测试计划。
2. 独立完成一个中等规模的项目
我期待在课程结束时,能够和团队一起完成一个结构清晰、文档齐全、经过测试的软件项目。这个项目将成为我简历上的重要经历,证明我具备基本的软件工程实践能力,而不仅仅是编写小脚本或单页应用。
3. 增强团队协作与沟通能力
软件工程课程通常以团队项目形式开展,我希望在团队中扮演积极的角色,学会如何合理分工、如何表达技术方案、如何解决冲突。课程结束后,我能更有信心地参与开源项目或进入公司实习,与不同背景的开发者高效合作。
6. 明确职业发展方向
我希望通过自己对软件工程学科的学习,找到自己真正感兴趣并且擅长的领域,明确我的未来职业方向进一步去开发自己的潜能,发展自己。
四、huggingface-API的调用
本次作业根据指定的网站辅助AI指令操作生成
第一次:中文初稿,画面偏题
早晨的厨房里,窗边的木桌上放着两个橘子和一个装有水的透明玻璃杯,旁边有一块浅色的布。

[第一次调用:中文提示词,生成了女孩、山水和建筑的插画,耗时 20.12 秒]
我先用中文写出时间、场景和物体,希望生成窗边木桌上的静物。提示词指定了两个橘子、一个玻璃水杯和一块浅色布,没有说明物体的位置和光线方向。
返回的图像是插画。一个背着背包、穿红色裙子的女孩站在水边,周围有树木、花、山和中式建筑。画面没有厨房、橘子或玻璃杯,主体和风格都偏离了本次想要的照片。
我猜测第一张偏题与模型对中文提示词的支持不足有关。接口已经返回图片,但模型没有按中文描述呈现场景,因此下一轮改用英文。第二版也增加了照片风格的描述,这次对照还不能把语言与风格描述的影响完全分开。
第二次:英文短句,主体符合要求
A realistic photo of two oranges, a clear glass of water, and a light cloth on a wooden table beside a kitchen window in the morning.

[第二次调用:英文短句,生成窗边的两个橘子和玻璃水杯,耗时 17.07 秒]
第二版保留原来的物体、数量、环境和时间,改成英文,并用 A realistic photo 指定照片风格。
这次出现了两个橘子、一个玻璃水杯和浅色布。橘子在左,杯子在右,布铺在橘子下面。桌子靠近窗户,背景有虚化的植物和椅背。橘皮纹理、杯沿反光和水面可以看见,画面已有照片的外观。
短句没有规定布的位置、水量和背景内容,模型自行安排了这些部分。我希望露出更多旧木桌的纹理,让背景减少杂物,光从左侧窗户进入。因此第三版补充物体位置、光线、材质和取景角度。
第三次:长英文,作为最终结果
A documentary photograph of an ordinary home kitchen on a quiet morning. On a worn oak table beside a window are exactly two whole oranges and one plain, clear cylindrical drinking glass half filled with water. Place the oranges slightly left of center, close together but not overlapping, and the glass to their right and a little farther back. A loosely folded off-white linen cloth rests behind the oranges without covering them. Photograph the arrangement from a seated person's eye level, angled slightly downward so the tabletop and the water surface are visible. Soft morning daylight enters through the window on the left, producing gentle shadows toward the right and small highlights along the glass rim. Show fine pores and a few minor blemishes on the orange peels, shallow scratches following the wood grain, and irregular folds in the linen. The glass has one continuous rim, a level water surface, and subtle refraction of the tabletop through the water. Keep the objects resting naturally on the table with visible contact shadows. An ordinary pale kitchen wall is softly out of focus in the background. Use the perspective of a 50mm lens at f/5.6, enough depth of field to keep both oranges and the glass recognizable, neutral white balance, restrained colors, and an exposure that preserves the orange peel texture and the transparent glass. An unposed everyday still life, with no people, labels, added text, dramatic lighting, or illustration effects.

[第三次调用:长英文提示词及最终图像,旧木桌上有橘子和玻璃杯,耗时 41.07 秒]
截图中的输入框滚动到了末尾,只显示长提示词的后一部分。上方保留了完整图像,全文按本目录保存的提示词列在这里。
这一版把橘子放在画面偏左处,水杯放在右后方,布放在橘子后面。相机视线略向下,既能看到桌面,也能看到水面。左侧窗光、向右的阴影和杯沿高光用于描述同一光照关系。
我加入橘皮小孔、表皮瑕疵、木纹划痕和布面褶皱,让「真实」对应到物体的表面。玻璃部分写明连续杯口、水平水面和折射。50mm和 f/5.6 描述预期的透视与景深,不是额外的 API 参数。
第三张中,两个橘子位于画面中部偏左,水杯在右后方。桌面能看见木板接缝、深色痕迹和划痕,背景主要是左侧窗框和墙面,没有第二张的植物与椅背。光从左侧进入,橘皮上的亮部、杯沿反光和桌面阴影都能看见。
我把这张作为最终结果,因为背景、旧木桌和光线更接近长提示词的要求。它仍有偏差:前面的橘子遮住了后面橘子的一部分,没有做到不重叠;布延伸到了橘子和杯子下面,并非只放在后方;杯中的水超过了半杯。增加描述后,模型执行了其中一部分,没有逐条实现。
心得体会
第一次让我注意到,接口完成取图和生成内容符合要求是两件需要分别检查的事。页面显示成功,图像却没有橘子和水杯。我猜测模型对中文的支持不足,随后换成英文,画面才回到要生成的场景。第二张之后,修改有了具体对象。我不再只写「真实的照片」,而是说明光从哪里来、玻璃杯放在哪里、桌面有哪些使用痕迹。于是第三张出现了左侧窗光、旧木板和更少的背景物体,这些变化可以对着提示词检查。水量、布的位置和橘子的遮挡也提醒我,描述清楚之后仍要检查结果。
第三次长提示词的作用,是把主体、位置、光线和材质写得更清楚。由此让我明白,信息越明确,模型需要自行猜测的内容越少,生成结果就越容易接近我的要求。重复堆叠形容词只会增加字数,有效的改写要补上原来没说清楚的内容。
五、分析软件工程课程学习指南
📘 软件工程学习指南(点击展开)
软件工程学习指南
1. 软件工程概述
软件工程是一门研究如何以系统性、规范化、可定量的方法开发、运行和维护软件的学科。它涉及工程原理在软件领域的应用,旨在提高软件质量、降低开发成本、缩短交付周期。
1.1 为什么学习软件工程?
- 软件系统日益复杂,个人英雄主义开发模式难以应对大型项目。
- 软件质量直接影响企业运营和用户体验。
- 软件工程方法能够系统性地管理需求、设计、实现、测试和维护全过程。
- 提升团队协作效率,减少返工,降低风险。
2. 学习路径与阶段划分
建议按照以下阶段逐步深入,每个阶段包含理论学习和实践训练。
阶段一:编程基础与工具(1-3个月)
- 编程语言:至少精通一门主流语言(如 Python、Java、C++、JavaScript)。
- 版本控制:Git 基础与团队协作(分支、合并、冲突解决)。
- 开发环境:IDE(VS Code、IntelliJ IDEA)、命令行工具。
- 调试与测试基础:单元测试(如 JUnit、pytest)。
阶段二:核心软件工程知识(3-6个月)
- 软件过程模型:瀑布、迭代、敏捷(Scrum、Kanban)。
- 需求工程:需求获取、分析、规格说明、验证。
- 软件设计:架构设计、模块化、设计模式、UML 建模。
- 数据库基础:关系型数据库(SQL)、NoSQL 概念。
- 质量保证:测试策略、代码审查、持续集成。
阶段三:高级主题与工程实践(6-12个月)
- 软件架构:微服务、事件驱动、云原生。
- DevOps:CI/CD 流水线、容器化(Docker)、编排(Kubernetes)。
- 项目管理:敏捷估算、风险管理、团队沟通。
- 安全与性能:安全编码实践、性能优化。
阶段四:专业方向与深入研究(持续)
- 方向选择:前端/后端/全栈、移动开发、嵌入式、数据工程、安全、AI 工程化等。
- 参与开源项目:贡献代码、理解大型代码库协作规范。
- 论文与前沿技术:阅读顶会论文(ICSE、FSE)、关注业界技术博客。
3. 核心知识模块详解
3.1 需求工程
- 目标:定义系统必须做什么,避免范围蔓延。
- 关键活动:
- 利益相关者识别与分析
- 需求获取技术(访谈、问卷、原型、观察)
- 需求分类(功能/非功能、用户/系统需求)
- 编写需求规格说明书(SRS)
- 需求验证与确认
- 工具:用例图、用户故事、验收标准。
3.2 软件设计
- 架构设计:
- 分层架构、MVC、微服务、事件驱动
- 架构权衡:可伸缩性、可维护性、性能
- 详细设计:
- 设计模式(23种经典模式:单例、工厂、观察者、策略等)
- 模块化原则:高内聚、低耦合
- UML 图:类图、时序图、组件图
- 设计原则:SOLID、DRY、KISS、YAGNI。
3.3 编码与实现
- 编码规范:命名、注释、代码结构。
- 重构:识别坏味道,安全重构(Martin Fowler《重构》)。
- 代码质量工具:静态分析(SonarQube)、格式化工具(Prettier、Black)。
3.4 软件测试
- 测试层次:
- 单元测试、集成测试、系统测试、验收测试
- 测试类型:
- 功能测试、性能测试、安全测试、兼容性测试、回归测试
- 测试驱动开发(TDD):红-绿-重构循环。
- 自动化测试框架:Selenium、Cypress、JUnit、pytest。
3.5 软件维护与演化
- 维护类型:纠错性、适应性、完善性、预防性。
- 遗留系统:理解、重构、迁移。
- 技术债务管理。
3.6 软件项目管理
- 敏捷方法:Scrum(Sprint、站会、回顾)、Kanban。
- 估算技术:故事点、计划扑克。
- 风险管理:识别、分析、应对。
- 团队协作与沟通:代码评审、结对编程、文档管理。
3.7 DevOps 与工程文化
- 持续集成/持续交付(CI/CD):Jenkins、GitHub Actions、GitLab CI。
- 基础设施即代码(IaC):Terraform、Ansible。
- 监控与日志:Prometheus、Grafana、ELK Stack。
- 文化:自动化优先、快速反馈、责任共担。
4. 推荐学习资源
4.1 经典书籍
- 软件工程导论:《软件工程:实践者的研究方法》(Roger S. Pressman)
- 需求工程:《软件需求》(Karl Wiegers)
- 设计模式:《设计模式:可复用面向对象软件的基础》(GoF)
- 重构:《重构:改善既有代码的设计》(Martin Fowler)
- 敏捷:《敏捷软件开发》(Robert C. Martin)、《Scrum 指南》
- 测试:《测试驱动开发》(Kent Beck)
- 架构:《软件架构:实践者的研究方法》、《架构整洁之道》
- DevOps:《凤凰项目》、《持续交付》
4.2 在线课程与平台
- Coursera:Software Engineering(Duke University)、Agile Development(University of Virginia)
- edX:Software Engineering Essentials(TU Munich)
- Udemy:The Complete Software Engineering Course
- YouTube:freeCodeCamp、Traversy Media、GOTO Conferences
- 国内平台:中国大学MOOC(软件工程)、极客时间、慕课网
4.3 实践平台与工具
- 代码托管:GitHub、GitLab
- 项目管理:Jira、Trello、Notion
- CI/CD:GitHub Actions、GitLab CI、Jenkins
- 容器化:Docker、Kubernetes
- 文档协作:Confluence、语雀
4.4 重要网站与社区
- Stack Overflow:编程问题解答
- Software Engineering Stack Exchange:软件工程理论讨论
- InfoQ:技术新闻与文章
- Martin Fowler 博客:架构与敏捷思想
- Medium / Dev.to:开发者社区
5. 实践项目建议
通过真实项目巩固知识,建议逐步增加复杂度。
5.1 小型项目(个人)
- 待办事项应用(前后端分离)
- 博客系统(用户认证、文章管理)
- 图书管理系统(数据库设计、CRUD)
5.2 中型项目(团队协作)
- 在线商城(用户、商品、订单、支付模拟)
- 即时通讯应用(WebSocket、消息推送)
- 任务看板工具(类似 Trello)
5.3 大型项目(开源或实习)
- 参与知名开源项目(如 Vue.js、React、Django 的 issue 修复)
- 设计一个微服务架构的电商平台
- 实现一个 DevOps 流水线(自动构建、测试、部署)
每个项目应包含:需求分析文档、设计文档、代码仓库、测试用例、CI/CD 配置、部署文档。
6. 软技能与职业发展
6.1 软技能
- 沟通能力:清晰表达技术方案,与产品、设计、测试协作。
- 问题解决:系统性分析问题,寻找根本原因。
- 时间管理:优先级排序,应对多任务。
- 持续学习:技术迭代快,保持好奇心。
6.2 职业路径
- 初级工程师:掌握基础,能独立完成模块开发。
- 中级工程师:负责子系统设计,指导新人,参与技术决策。
- 高级/资深工程师:架构设计、技术规划、跨团队协作。
- 技术专家/架构师:深入某一领域(性能、安全、数据),主导技术方向。
- 管理方向:技术经理、项目经理、CTO。
6.3 面试准备
- 算法与数据结构:LeetCode、剑指 Offer。
- 系统设计:设计短链接、设计 Twitter、设计聊天系统。
- 行为面试:STAR 法则描述项目经验。
- 简历:突出项目影响、量化成果。
7. 常见误区与建议
- 只学语言不学工程:编程语言是工具,软件工程是方法论。
- 忽视测试:认为测试浪费时间,后期维护成本剧增。
- 过度设计:追求完美架构,忽视实际需求。
- 文档无用论:文档是团队协作的基础,至少需要轻量级文档。
- 盲目追逐新技术:理解基本原理,新技术是演进而非颠覆。
- 不参与团队项目:软件工程本质是团队活动,缺乏协作经验难以成长。
8. 总结
软件工程学习是一个长期积累的过程,需要理论与实践结合。建议制定学习计划,保持项目驱动,积极参与社区,不断反思总结。记住:软件工程的目标不是写出代码,而是构建高质量的软件系统,解决真实世界的问题。
📊 学习指南评价分析(点击展开)
我认为这份学习指南结构完整、内容全面,覆盖了软件工程从基础到进阶的主要知识领域,并给出了阶段划分、资源推荐和实践建议,适合作为入门者和初中级学习者的参考框架。整体上合理且具有较高的参考价值,但存在一些细节上的不足,实际使用时需要根据个人背景和目标进行裁剪和补充。
1. 对初学者的帮助
- 提供了一个清晰的“地图”,避免迷失在海量技术中;
- 阶段划分让初学者知道先学什么、后学什么,减少焦虑;
- 项目建议能引导学习者动手,而非只读书。
2. 对有一定基础者的帮助
- 可查漏补缺,例如发现自己忽略了需求工程或测试;
- 高级主题部分(微服务、DevOps、架构)可作为进阶方向指引;
- 面试准备和职业路径内容对求职有直接参考价值。
3. 可能的局限
- 信息密度较高:初学者如果完全按照指南同时推进多线学习,容易产生认知过载;
- 缺少具体时间分配和量化目标:例如“阶段一 1-3 个月”较模糊,没有说明每周投入多少小时、达到什么程度算完成;
- 缺乏评估手段:没有提供自测题、检查清单或里程碑标准,学习者难以判断自己是否真正掌握;
- 技术栈建议不够具体:例如编程语言只列了几种,没有说明各自适用场景,初学者可能仍不知如何选择;
- 部分内容偏向理论:如 UML、设计模式等,如果缺少实际代码示例,理解起来会比较抽象;
- 没有强调代码之外的重要技能:虽然提到了软技能,但篇幅较少,对沟通、协作、文档撰写等实际工作能力的指导不够深入。
六、Markdown编辑截图

浙公网安备 33010602011771号