第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/13546
这个作业的目标 了解并使用git操作,熟悉并使用Markdown语法,了解软工课程的教学与思想,了解团队增进协作
学号 102301330

团队网站

个人资料截图

个人资料截图

技能树与技术偏好

核心编程语言

  • C/C++:精通指针、内存管理(动态分配 / 释放)、结构体 / 类、继承与多态,能实现链表、栈、队列等数据结构;

数据结构与算法

  • 掌握线性结构(数组、链表、栈、队列)的实现与应用(如用栈解决括号匹配、用队列实现广度优先搜索);
  • 掌握树形结构(二叉树、二叉搜索树)的遍历(前 / 中 / 后序、层序)与基本操作(插入、删除);
  • 熟悉基础排序算法(冒泡、插入、选择、快排、归并),能分析时间 / 空间复杂度(O (n²)、O (nlogn))。
  • 学习高级数据结构(红黑树、哈希表、堆、图),理解哈希冲突解决方法(链地址法、开放地址法);
  • 掌握贪心算法、动态规划的基本思想,能解决简单问题(如背包问题、最长公共子序列);

开发工具与环境

  • 代码编辑器 / IDE:熟练使用 VS Code(配插件调试 C/C++/Python)、Clion(C++ 开发)、PyCharm(Python 开发),掌握断点调试、变量监视;
  • 版本控制:精通 Git 基础(init、add、commit、push、pull、branch),能在 GitHub/GitLab 上管理个人项目,解决简单冲突;
  • 操作系统工具:熟悉 Linux 命令行(cd、ls、grep、awk、ssh),能在 Linux 环境下编译 C/C++ 程序(用 gcc/g++)、部署简单脚本。 - 构建工具:学习 CMake(管理 C++ 项目依赖)、Maven(管理 Java 项目);

代码量

目前代码量在8k+,学习本课之后,希望代码量达到16k+。

期望的课程收获

希望通过这门课,我能够了解软件开发的准备工作、整体流程以及大模型,学习前端后端的知识与实际运用,通过团队合作来开发出自己想做的软件。

软件工程学习指南

软件工程是一门结合计算机科学工程管理问题解决的交叉学科,核心目标是高效、高质量地构建和维护软件系统。这份指南将按“基础铺垫→核心知识→实战能力→进阶深化”的逻辑,帮助你建立完整的知识体系,避免盲目学习。

一、前置基础:筑牢技术地基

在学习软件工程前,需掌握计算机领域的核心基础知识,这些是理解后续概念的前提。

1. 编程语言:选择“入门语言+工程语言”

编程语言是工具,需兼顾“易上手”和“工程实用性”,推荐组合:

  • 入门首选:Python
    语法简洁,生态丰富,适合快速理解“编程逻辑”(变量、循环、函数、类),同时可用于后续的自动化测试、数据分析等场景。
    • 重点掌握:面向对象编程(OOP)、模块与包管理、常用库(osrequestspandas)。
  • 工程核心:Java / Go / TypeScript
    软件工程中主流的“生产级语言”,需深入掌握一门(根据方向选择):
    • Java:企业级应用(后端、Android)的主流,需理解JVM、Spring生态、并发编程。
    • Go:云原生、微服务的热门语言,优势在高并发、简洁性,需掌握goroutine、channel、Go Modules。
    • TypeScript:前端工程化的核心,在JavaScript基础上增加类型系统,需掌握接口、泛型、TS与React/Vue的结合。

2. 计算机基础三要素

这三门课是软件工程的“底层逻辑”,决定你能走多远:

  • 计算机组成原理:理解“软件如何在硬件上运行”,重点掌握CPU、内存、I/O的工作机制,避免写出“脱离硬件的低效代码”(如频繁创建大对象导致内存溢出)。
    推荐教材:《计算机组成原理(唐朔飞)》、《深入理解计算机系统(CS:APP)》。
  • 操作系统(OS):掌握进程/线程管理、内存管理、文件系统,理解“并发”“死锁”“虚拟内存”等概念——这些是后续学习“分布式系统”“高并发设计”的基础。
    推荐实践:在Linux系统下完成基础操作(文件管理、进程调度),用C语言实现简单的进程通信(如管道、消息队列)。
  • 计算机网络:理解软件系统的“通信规则”,重点掌握TCP/IP协议栈(HTTP/HTTPS、TCP、IP、DNS)、网络分层模型。
    关键实践:用Wireshark抓包分析HTTP请求,手动配置DNS解析,理解“三次握手”“四次挥手”的实际意义。

二、核心知识:掌握软件工程的“方法论”

软件工程区别于“单纯编程”的核心,是系统化的开发流程和管理方法,需重点掌握以下模块。

1. 软件开发生命周期(SDLC):理解“从0到1”的全流程

SDLC是软件工程的框架,所有活动都围绕其展开,常见模型有4种,需理解每种模型的适用场景:

模型类型 核心逻辑 适用场景 优点 缺点
瀑布模型(Waterfall) 线性流程:需求→设计→开发→测试→部署 需求明确、稳定的项目(如工具软件) 流程清晰、文档完整 灵活性差,难应对变更
敏捷开发(Agile) 迭代式开发:2-4周一个迭代,快速交付可用版本 需求多变的项目(如互联网产品) 响应快、用户参与度高 依赖团队协作能力,文档易缺失
原型模型(Prototype) 先做“简化版原型”,验证需求后再开发 需求模糊的创新项目(如新产品探索) 降低需求理解偏差 原型可能与最终产品脱节
螺旋模型(Spiral) 迭代+风险评估:每轮迭代前先评估风险 高风险项目(如航天软件、金融系统) 风险可控 成本高,流程复杂

重点实践:用敏捷开发的“Scrum框架”模拟一个小项目(如个人博客),体验“每日站会”“迭代计划会”“迭代回顾会”的流程,用工具(Jira、Trello)管理任务。

2. 需求分析与设计:避免“做错产品”

很多软件失败的原因是“需求理解偏差”或“设计不合理”,这两步是前期关键:

(1)需求分析:明确“做什么”

  • 核心目标:将“用户模糊需求”转化为“可量化、可验证的需求文档”。
  • 关键方法:
    • 用户访谈/调研:直接与用户沟通,明确“痛点”(如“用户希望登录时间<3秒”)。
    • 用例图(UML):描述“用户与系统的交互流程”,例如“用户下单”的用例图需包含“选择商品→提交订单→支付”等步骤。
    • 需求规格说明书(SRS):书面化需求,包含功能需求(如“支持手机号登录”)、非功能需求(如“并发量≥1000QPS”)、约束条件(如“兼容iOS 13+”)。

(2)软件设计:明确“怎么做”

设计分“架构设计”和“详细设计”,核心是“高内聚、低耦合”(模块内部逻辑紧密,模块间依赖少):

  • 架构设计:整体框架设计,常见架构模式:
    • 单体架构:所有功能在一个应用中(如早期的博客系统),适合小项目。
    • 分层架构:按“职责”分层(如前端→API层→服务层→数据层),便于维护。
    • 微服务架构:将系统拆分为独立服务(如“用户服务”“订单服务”),适合大型系统(如电商平台)。
    • 推荐工具:用“架构图”(DrawIO、Visio)可视化架构,明确模块间的调用关系。
  • 详细设计:具体到“代码级”的设计,如:
    • 类图(UML):描述类的属性、方法及类之间的关系(继承、关联、依赖)。
    • 数据库设计:用ER图设计表结构,避免“冗余字段”“表关联混乱”,需掌握SQL优化(如索引设计)。

3. 编码与版本控制:保证“代码质量”

编码不是“写出来就行”,需兼顾“可读性、可维护性、可扩展性”:

(1)编码规范:统一风格

  • 核心原则:遵循行业通用规范(如Java的《阿里巴巴Java开发手册》、Python的PEP8),避免“个人风格代码”。
  • 重点要求:
    • 命名:类名用“大驼峰”(如UserService),方法名用“小驼峰”(如getUserInfo),变量名避免拼音/缩写(如用userName而非yhm)。
    • 注释:关键逻辑需写注释(如复杂算法的思路),但避免“冗余注释”(如// a = a + 1)。
    • 代码简化:避免重复代码(用函数/工具类封装),减少嵌套层级(如用“提前返回”替代多层if)。

(2)版本控制:多人协作的核心

  • 必学工具:Git(行业标准),需掌握核心操作:
    • 基础:git init(初始化仓库)、git add(暂存)、git commit(提交)、git push(推送到远程)。
    • 协作:git branch(创建分支)、git merge(合并分支)、git rebase(变基,整理提交记录)、git pull(拉取远程代码)。
    • 解决冲突:理解“冲突产生的原因”(多人修改同一文件同一行),用工具(VS Code、GitKraken)可视化解决冲突。
  • 推荐实践:在GitHub/GitLab上创建仓库,模拟“多人协作”(如2人共同开发一个小功能,分别在分支开发后合并到主分支)。

4. 测试:避免“带bug上线”

测试的目标是“尽早发现并修复bug”,而非“上线后被动救火”,需掌握核心测试类型:

测试类型 测试目标 常用工具/方法 负责角色
单元测试(Unit Test) 测试“单个函数/类”的正确性 JUnit(Java)、pytest(Python) 开发工程师(自测)
集成测试(Integration Test) 测试“模块间的交互”是否正常 Postman(API测试)、Selenium(UI测试) 测试工程师
系统测试(System Test) 测试“整个系统”是否满足需求 黑盒测试(不看代码,按需求用例测试) 测试工程师
性能测试(Performance Test) 测试系统的“性能指标”(如并发、响应时间) JMeter、LoadRunner 性能测试工程师
自动化测试(Automated Test) 用代码替代“人工重复测试”(如回归测试) Selenium(UI自动化)、Playwright 开发/测试工程师

关键理念:“测试左移”——将测试提前到“编码阶段”(如写代码前先写单元测试用例),而非“编码完成后再测试”。
推荐实践:为一个函数(如“计算斐波那契数列”)写单元测试,覆盖“正常输入”“边界值(如n=0、n=1)”“异常输入(如n为负数)”。

5. 项目管理与运维:保证“项目落地”

软件工程不仅是“技术”,还需“管理”和“运维”能力:

(1)项目管理:按时、按质、按预算交付

  • 核心维度:
    • 进度管理:用“甘特图”(Microsoft Project、飞书项目)规划任务时间,跟踪进度(如“需求分析2周,开发4周”)。
    • 成本管理:估算人力成本(如“1个中级开发1个月成本2万”)、服务器成本,避免超预算。
    • 风险管理:识别潜在风险(如“核心开发离职”“技术方案不可行”),提前制定应对方案(如“备份核心代码,预留备选方案”)。

(2)运维:保证软件“稳定运行”

  • 核心技能:
    • 部署:掌握“CI/CD”(持续集成/持续部署),用工具(Jenkins、GitHub Actions)实现“代码提交后自动测试、自动部署”。
    • 监控:用工具(Prometheus、Grafana)监控系统指标(CPU、内存、接口响应时间),设置告警(如“CPU使用率>80%时发短信告警”)。
    • 日志:用ELK(Elasticsearch+Logstash+Kibana)收集和分析日志,快速定位bug(如“用户反馈登录失败,通过日志查找报错信息”)。

三、实战能力:从“理论”到“落地”

软件工程是“实践驱动”的学科,仅学理论无法掌握核心能力,需通过项目积累经验。

1. 项目选择:从“小而全”到“大而专”

  • 入门级(1-2人,1-2个月):覆盖全流程,不追求复杂度。
    示例:个人博客系统(功能:用户注册/登录、发布文章、评论、分类标签)。
    技术栈建议:Python+Django(后端)、HTML/CSS/JavaScript(前端)、MySQL(数据库)、Git(版本控制)、Docker(部署)。
    核心目标:体验“需求→设计→编码→测试→部署”全流程,掌握基础工具。

  • 进阶级(2-4人,3-6个月):侧重“工程化”和“协作”。
    示例:电商小程序(功能:商品列表、购物车、下单、支付回调、订单管理)。
    技术栈建议:Java+SpringBoot(后端)、Vue3+UniApp(前端)、Redis(缓存)、MySQL(数据库)、RabbitMQ(消息队列,处理订单异步通知)、Jira(任务管理)、Jenkins(CI/CD)。
    核心目标:解决“高并发”(如用Redis缓存热门商品)、“异步处理”(如订单创建后异步发送短信)、“多人协作冲突”等工程问题。

  • 高级级(4人以上,6个月+):侧重“架构设计”和“技术深度”。
    示例:短视频平台(功能:视频上传、转码、推荐、评论、点赞、直播)。
    技术栈建议:Go(后端,高并发)、React+Next.js(前端)、Elasticsearch(视频搜索)、MongoDB(存储评论等非结构化数据)、Kubernetes(容器编排,管理多台服务器)、Flink(实时计算,统计用户行为)。
    核心目标:设计“微服务架构”(拆分用户服务、视频服务、推荐服务)、解决“数据一致性”(如分布式事务)、“高可用”(如服务集群、灾备)等复杂问题。

2. 项目复盘:比“做项目”更重要的一步

每完成一个项目,需进行“复盘”,避免重复踩坑,复盘重点:

  • 技术层面:哪些技术选型不合理?(如用MySQL存储大量日志导致查询变慢,后续应改用Elasticsearch)。
  • 流程层面:哪些环节浪费了时间?(如需求频繁变更,后续应在需求阶段增加“评审环节”)。
  • 个人层面:哪些知识存在短板?(如不会用Redis,后续需专项学习)。

四、进阶深化:成为“资深工程师”

当掌握基础和实战后,可根据兴趣方向深化,常见方向:

1. 技术专家方向(深耕某一技术领域)

  • 后端架构:深入分布式系统(CAP理论、分布式一致性算法Paxos/Raft)、高并发(线程模型、锁优化)、中间件(Redis、Kafka、Elasticsearch)源码。
    推荐书籍:《分布式系统原理与范型》、《Redis设计与实现》。
  • 前端工程化:深入前端构建工具(Webpack、Vite)、状态管理(Redux、Pinia)、跨端开发(Flutter、React Native)、前端性能优化(首屏加载、懒加载)。
    推荐书籍:《深入浅出Webpack》、《React设计模式与最佳实践》。
  • 测试开发(DevOps):深入自动化测试框架(Selenium、Appium)、CI/CD工具链(Jenkins、GitLab CI)、云原生技术(Docker、Kubernetes)。
    推荐书籍:《DevOps实战》、《Kubernetes in Action》。

2. 技术管理方向(从“做事”到“带人”)

  • 核心能力:团队管理(人员招聘、绩效评估)、项目规划(拆解复杂需求、分配任务)、跨部门协作(与产品、设计、运营沟通)。
    推荐书籍:《人月神话》(经典项目管理著作)、《第一线经理》(技术管理实战)。

五、学习资源推荐

1. 经典书籍

  • 入门:《软件工程:实践者的研究方法》(全面覆盖软件工程核心概念)、《代码整洁之道》(提升代码质量)。
  • 进阶:《设计模式:可复用面向对象软件的基础》(掌握23种设计模式,提升代码扩展性)、《重构:改善既有代码的设计》(学会优化旧代码)。
  • 高级:《领域驱动设计》(复杂系统的设计方法)、《凤凰项目》(DevOps实战小说,通俗易懂)。

2. 在线课程

  • 基础:Coursera《Software Engineering Principles》(斯坦福大学,偏理论)、B站《尚硅谷Java/Go/前端全套教程》(偏实战,适合零基础)。
  • 进阶:极客时间《从0开始学架构》(架构设计实战)、慕课网《Selenium自动化测试实战》(测试开发)。

3. 实战平台

  • 代码托管:GitHub(开源项目学习,可参与开源贡献提升经验)、Gitee(国内平台,访问速度快)。
  • 项目协作:Jira(企业级任务管理)、飞书项目(轻量化,适合小团队)。
  • 云服务:阿里云、腾讯云(学生机性价比高,可用于部署项目,学习运维)。

六、学习建议

  1. 拒绝“碎片化学习”:软件工程是体系化学科,先学“计算机基础+SDLC”,再动手做项目,避免“只会用框架,不懂底层逻辑”。
  2. 重视“文档能力”:写好需求文档、设计文档、API文档——好的文档是团队协作的基础,也是个人思路的梳理过程。
  3. 主动“解决真实问题”:遇到bug不要直接搜“答案”,先尝试用日志、调试工具定位原因,培养“问题排查能力”(这是工程师的核心竞争力)。
  4. 持续“跟踪技术趋势”:关注行业动态(如云原生、AI在软件工程中的应用),但不盲目追逐新技术——先掌握“稳定、成熟的技术”,再探索新技术。

学习指南分析

  1. 合理性:逻辑清晰,按“基础铺垫→核心知识→实战→进阶”的学习路径展开,符合软件工程从理论到实践的认知规律;覆盖技术(编程、计算机基础)、方法(SDLC、测试、项目管理)、实战(分阶段项目)全维度,无明显遗漏,且结合行业主流技术栈与工具,贴合实际需求,合理性强。
  2. 帮助性:对不同阶段学习者(入门、进阶、资深)均有明确指引,项目案例、资源推荐、学习建议可落地,能帮学习者避免盲目学习,快速建立知识体系,同时强化“工程化思维”(非单纯写代码),对职业成长有直接帮助。

后台编辑截图

后台编辑截图

posted @ 2025-10-06 15:06  LLLiii-  阅读(14)  评论(0)    收藏  举报