软件工程第一周作业
软件工程第一次作业——自我介绍、现状与未来规划
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS/homework/15710 |
| 这个作业的目标 | 熟悉博客园与 Markdown 的使用,回顾自己的大学学习经历和专业能力,明确软件工程课程的学习目标与未来发展方向,同时学习 Git/GitHub 的基本使用方法,并通过阅读《构建之法》培养主动思考和提出问题的能力。 |
一、自我介绍
1. 关于我
大家好,我是广东工业大学计算机科学与技术专业的一名学生,目前即将进入大三。
前两年的大学生活里,我学习了程序设计、数据结构、算法设计与分析、计算机组成原理、计算机网络、操作系统、Java 程序设计等课程。虽然这些课程让我对计算机专业有了一个基本认识,但如果让我评价目前的自己,我觉得自己仍然处于“知道不少东西,但还没有真正把它们串起来”的阶段。
尤其是在真正做项目以后,我越来越能感受到:
“学过”一门技术和“能够使用”一门技术,其实是两件不同的事情。
以前学习 Java、数据库或者前端的时候,经常会觉得把课堂上的知识点掌握了就差不多了。但真正开始写项目之后才发现,一个能够运行的软件涉及数据库设计、接口设计、前后端交互、异常处理、权限控制、安全、部署等很多问题。
这也是我现在越来越希望通过项目实践提高自己的原因。
2. 我的专业学习经历
目前我主要学习和使用过 Java、JavaWeb、MySQL、HTML/CSS/JavaScript、Vue3 等技术。
我做过一个 JavaWeb 云文档在线管理平台。后端主要使用 Servlet、JDBC 和 MySQL,前端使用 Vue3,实现了用户登录注册、知识库、文章、评论、点赞、收藏、图片上传等功能。
在这个过程中,我也第一次比较完整地接触到了一个项目从数据库设计、后端接口到前端页面,再到测试和修改 Bug 的整个过程。
另外,我目前还在设计一个微信小程序项目——手工歌词杯垫定制系统,希望把原本需要在线下反复沟通的定制流程转化成一个完整的软件系统,包括布料选择、歌词输入、效果预览、订单、支付、物流以及客服等功能。
相比单纯完成课堂实验,我发现自己更喜欢这种“做一个真正能用的东西”的过程。
3. 我的一个闪光点
如果一定要说一个自己的优势,我觉得是:对于自己真正感兴趣的事情,我愿意花比较长的时间反复研究和修改。
这种特点在做项目的时候尤其明显。
例如在云文档项目中,一开始很多功能只是“能运行”,但随着不断测试,我发现了登录状态、权限控制、图片存储、密码安全、Markdown XSS 等问题。很多问题都不是课堂作业明确要求的,但我还是会继续查资料、修改代码,再重新测试。
这个过程有时候确实很耗时间,但也让我逐渐意识到,程序开发并不是“代码跑起来就结束了”。
我现在还谈不上拥有多么强的技术能力,但相比刚进入大学的时候,我已经开始愿意主动发现问题、查找资料并解决问题。
我希望这种能力可以继续保持下去。
二、现状、经验和计划
1. 我的专业选择与目前的能力
(1)为什么选择计算机专业
最初选择计算机科学与技术专业,很大程度上是因为我对计算机和互联网比较感兴趣,同时也认为计算机行业的发展机会比较多。
但真正进入大学之后,我才发现计算机专业远不只是“学编程”。
从程序设计,到数据结构与算法,再到计算机组成原理、操作系统、计算机网络,每一门课程都从不同角度解释计算机系统。
前两年的学习让我建立了一些基础,但距离一个真正合格的计算机专业毕业生,我认为还有明显差距。
目前最大的问题是:知识比较分散,实践能力不足,对很多知识能够理解,但还没有达到熟练运用的程度。
特别是算法方面,我目前仍然需要通过大量练习建立自己的解题思维;在工程开发方面,虽然已经完成过项目,但距离真正企业级的软件开发仍然有很大的距离。
(2)技能自评
我从技能调查表以及自己的发展方向中选择了以下几项比较重要的能力。
评分标准:0 表示完全不了解,5 表示基本达到面试要求,9 表示世界一流水平。
| 技能 | 当前水平 | 课程结束目标 | 提升方式 |
|---|---|---|---|
| Java 编程 | 4 | 5 | 继续完成项目,并系统复习 Java 基础、集合、多线程、JVM 等知识 |
| 数据结构与算法 | 3 | 5 | 坚持 LeetCode 刷题,总结常见算法模板和题型 |
| 数据库/MySQL | 3 | 5 | 结合项目学习索引、事务、SQL 优化和数据库设计 |
| Web 后端开发 | 3 | 5 | 完善现有项目,并进一步学习 Spring Boot 等主流技术 |
| Git/GitHub | 2 | 5 | 使用 Git 管理之后的课程作业和项目,熟悉分支、合并、回退等操作 |
| 软件工程能力 | 2 | 5 | 通过本课程学习需求分析、设计、测试、协作和项目管理 |
| 独立解决问题能力 | 4 | 5 | 遇到问题先定位原因,再通过文档、搜索、调试等方式解决 |
为了达到这些目标,我计划主要通过以下方式提升:
- 坚持进行算法题训练,不只看答案,而是总结题型和思考过程。
- 完善已有项目,让项目从“能运行”逐渐变成“设计相对合理”。
- 系统复习 Java 后端相关知识,为实习面试做准备。
- 使用 Git 和 GitHub 管理项目代码,形成规范的版本管理习惯。
- 学习 Spring Boot 等实际开发中常见的技术栈。
- 在软件工程课程中认真完成需求分析、设计、编码、测试和团队协作任务。
- 对项目中遇到的问题进行记录和总结,而不是解决之后就忘记。
2. 关于学习、课堂以及学术诚信的思考
(1)为什么要来上课并认真参与
阅读《你为何要来上课并且认真参与》之后,我重新思考了一下自己以前上课的状态。
以前有时候会认为,大学课程的视频和资料网上基本都能找到,如果课堂内容比较基础,自己课后看资料也可以。
但现在我觉得,这种想法忽略了一个问题:
“能够找到知识”和“真正把知识学会”之间还有很长的距离。
大学课堂的价值不仅仅是老师把知识讲一遍,还包括老师帮助我们建立知识体系、指出重点、提供反馈,以及通过作业迫使我们真正实践。
尤其是软件工程这种实践性比较强的课程,如果只是看 PPT 或者看视频,却没有真正参与项目,很难理解软件开发中团队合作、需求变化、版本管理、测试等问题。
所以我希望自己在这门课中不仅仅追求最后的成绩,而是真的参与进去。
(2)我希望的师生关系
在过去的大学课程中,我体验最多的还是比较传统的师生关系:
老师讲课、布置作业,学生听课、考试。
但对于软件工程课程,我更希望是一种类似“教练和学员”的关系。
老师不一定直接告诉我们每一个问题的答案,而是给出目标、要求和反馈,让我们自己实践,在遇到问题之后再进行指导。
如果老师布置的作业比较困难,我会选择:
C:向老师和同学请教,花更多时间,把作业完成。
当然,我认为“完成”并不意味着完全依赖别人给答案。如果遇到问题,我希望自己的顺序是:
先尝试 → 查资料 → 调试 → 和同学讨论 → 仍然解决不了再请教老师或助教。
因为真正进入工作之后,也不会有人一直告诉我们下一行代码应该怎么写。
(3)引用和抄袭的区别
我认为引用、借鉴和抄袭最大的区别在于:是否明确说明成果的来源,以及自己是否真正进行了思考和工作。
软件开发本身就建立在大量已有成果之上。
我们会阅读官方文档、参考开源项目、搜索 Stack Overflow 或其他技术社区,也可能使用别人已经实现的算法。
这些行为本身并不是抄袭。
如果引用了别人的代码、观点或者资料,应当明确说明来源;如果在别人工作的基础上进行了修改,也应该说明参考了什么以及自己进行了哪些工作。
而直接复制别人的代码、报告或博客,然后把它当成自己的成果提交,则属于抄袭。
尤其是在现在 AI 工具越来越普及的情况下,我觉得更应该注意这一点。工具可以帮助我们理解问题、检查代码或者提供思路,但最终提交的内容应该是自己真正理解过的。
3. 我的未来选择
目前我比较明确的方向是:毕业后从事软件开发相关工作,现阶段主要准备 Java 后端方向。
因此,我现在最重要的目标之一就是寻找一份计算机相关的实习。
相比部分同学,我认为自己的优势是已经开始通过完整项目认识软件开发,而不是只停留在课堂代码和实验上。
但我的劣势也很明显。
第一,算法能力还不够扎实。
第二,Java 后端知识体系还不够完整。
第三,项目虽然已经能够实现不少功能,但技术深度和工程规范仍然不足。
第四,我真正参与团队项目开发的经验比较少。
因此,本学期我希望重点完成以下几个目标:
- 认真完成软件工程课程项目。
- 继续完善自己的 Java 后端知识体系。
- 坚持算法训练。
- 学习 Spring Boot 等主流开发技术。
- 整理已有项目,使其能够真正放入简历。
- 尝试寻找 Java 后端相关实习。
- 逐渐建立 Git、GitHub、博客和技术总结习惯。
我希望到这个学期结束的时候,回头看现在的自己,可以明显感受到自己的变化,而不是又经历一个“学了很多课程,但是好像什么都没有留下”的学期。
4. 我对软件工程课程的计划
(1)我对课程的期待
以前做项目的时候,我关注最多的是:
“这个功能怎么写出来?”
但软件工程真正需要解决的问题显然不止这些。
例如:
- 为什么要做这个功能?
- 需求应该如何描述?
- 数据库应该如何设计?
- 模块之间如何划分?
- 多个人如何同时修改代码?
- 如何保证修改一个功能不会影响另一个功能?
- 如何测试?
- 项目需求变化怎么办?
- 一个项目如何长期维护?
这些问题其实都是我以前做项目时遇到过,却没有系统学习过的。
所以我希望通过这门课程,把过去零散的开发经验逐渐整理成比较系统的软件工程方法。
(2)目前代码量
目前我的代码主要来自课程实验、算法练习以及个人项目。
由于过去没有一直进行统一统计,所以这里只能按照目前项目规模进行估算:
| 语言 | 当前累计代码量(估算) |
|---|---|
| Java | 约 5000 行 |
| HTML / CSS | 约 3000 行 |
| C / C++ | 约 2000 行 |
| 总计 | 约 10000 行 |
我认为代码量本身不能直接代表编程能力。
10 万行重复代码不一定比 1 万行认真设计和修改过的代码更有价值。
但对于仍处于学习阶段的学生来说,足够的代码实践仍然非常重要。如果连大量代码都没有真正写过,就很难形成工程经验。
对于进入一流的软件公司,我认为与其规定一个绝对的代码量,不如关注是否经历过数万行级别的有效编码实践,并能够理解代码背后的设计。
对于高校教学科研,则除了代码能力,还需要论文阅读、数学基础、实验设计、科研方法和创新能力,因此评价标准并不能只看代码量。
(3)本学期投入
我计划平均每周投入:
约 8~10 小时
在软件工程课程上,包括课堂、阅读、博客、编程、团队讨论和项目开发。
对于题目给出的选项,我选择:
D:比以前的课要多很多,直到达到目标为止。
我希望课程结束时至少新增 5000~8000 行真正由自己理解、编写、修改和测试过的有效代码。
如果按 16 周计算,大约每周需要完成 300~500 行左右。
当然,我不会为了达到代码量而刻意制造无意义代码,代码量只是用来监督自己的实践投入。
三、我的 WOOP 计划
Wish —— 愿望
我希望通过这个学期的软件工程课程,真正完成一次比较规范的软件项目开发过程。
不仅能够写代码,还能够理解需求分析、系统设计、版本管理、测试、团队合作等软件工程方法。
同时,我希望自己的 Java 后端开发能力能够进一步提升,为之后寻找实习做好准备。
Outcome —— 结果
如果能够实现这个目标,我希望学期结束时自己拥有:
- 一个真正能够展示的软件工程项目;
- 更完整的 Git/GitHub 使用经验;
- 更规范的开发习惯;
- 更好的团队合作能力;
- 更完整的 Java 后端知识体系;
- 更强的算法基础;
- 一份能够用于实习求职的项目经历。
相比一个分数,我觉得这些东西对我来说更有价值。
Obstacles —— 障碍
我认为自己最容易失败的原因不是“学不会”,而是:
计划很多,但是执行不够稳定。
有时候刚开始会给自己制定很多目标,比如刷算法、学 Java、做项目、看八股、完成课程作业。
结果任务越来越多之后,反而不知道先做哪个,最后容易把一些重要但不紧急的任务不断往后拖。
另外一个问题是,在遇到比较困难的代码问题时,很容易在一个问题上耗费大量时间,导致后面的计划被打乱。
因此,我认为自己最需要解决的是长期执行能力和任务优先级管理。
Plan —— If-Then 计划
针对这些问题,我给自己制定以下计划:
如果当天任务很多不知道先做什么,
那么先完成有明确截止日期的软件工程课程任务,再完成算法和个人学习计划。
如果一个 Bug 独自调试超过 1 小时仍然没有明显进展,
那么停止无目的尝试,重新整理报错信息、复现步骤和已经尝试的方法,再查阅资料或向别人提问。
如果当天因为其他事情没有完成计划,
那么第二天重新安排任务,而不是因为一天没有完成就直接放弃整个计划。
如果发现自己只是在看教程而没有真正写代码,
那么停止继续看视频或文章,先用刚学到的知识完成一个实际功能。
四、《构建之法》快速阅读后的五个问题
问题一:软件工程是否会限制程序员的创造力?
相关章节:第 1 章——概论
书中介绍了软件工程中的流程、规范和方法。
这让我产生了一个疑问:如果开发过程中的每一步都有规范,那么程序员个人的创造力会不会受到限制?
我以前自己做项目的时候,很多时候都是想到一个功能就直接开始写代码。这种方式自由度很高,但随着项目变大,也出现了代码结构混乱、修改一个功能影响其他功能的问题。
所以我现在的理解是,软件工程规范可能并不是限制创造力,而是在复杂项目中为创造力提供一个能够长期维护的基础。
但我仍然想知道:
对于规模比较小的个人项目,应该在什么程度上使用软件工程规范?如果所有流程都完整执行,会不会反而降低开发效率?
问题二:个人能力强和团队能力强,哪个更重要?
相关章节:第 5 章——团队和流程
以前学习编程时,我们的大多数作业都是独立完成的,因此很容易形成一种认识:程序员最重要的是个人技术能力。
但是实际软件开发通常需要多人合作。
如果一个程序员技术能力很强,但是不写文档、不遵守代码规范、不愿意和团队沟通,他可能反而会增加团队维护成本。
相反,一个技术能力没有那么突出,但是能够稳定完成任务、及时沟通、代码规范清晰的人,也可能对团队非常重要。
因此我的问题是:
企业评价一个软件工程师时,个人技术能力和团队协作能力分别占多大的比重?一个优秀的个人开发者是否一定能够成为优秀的软件工程师?
问题三:Bug 越少是否代表软件质量越高?
相关章节:第 2 章——个人技术和流程 / 软件测试相关内容
以前写课程项目时,我很容易把“程序能够运行”理解成“程序写好了”。
后来做完整项目之后,我发现很多问题并不会在正常操作时出现。
例如权限问题、异常输入、登录状态失效、文件上传异常等,都可能隐藏在正常流程之外。
因此我开始意识到,Bug 数量可能并不能直接衡量软件质量。
一个没有被充分测试的软件,看起来可能没有 Bug,但实际上只是 Bug 没有被发现。
所以我的问题是:
应该通过哪些指标评价一个软件的质量?Bug 数量、测试覆盖率、用户体验、性能、安全性和可维护性之间应该如何权衡?
问题四:需求不断变化时,前期设计还有多大意义?
相关章节:第 8 章——需求分析
在开发项目时,经常会出现一种情况:
一开始认为需求已经比较清楚,但真正开始写代码以后才发现需要增加或者修改功能。
如果需求一直会变化,那么前期花很多时间进行详细设计,会不会出现大量设计最终被推翻的问题?
但如果完全不进行设计,又很容易导致后期代码越来越混乱。
因此我的疑问是:
软件工程中应该如何平衡“提前设计”和“快速迭代”?哪些东西应该在编码之前确定,哪些东西可以留到开发过程中逐渐调整?
问题五:AI 普及以后,软件工程师最重要的能力会发生什么变化?
相关章节:第 16 章——创新
现在 AI 已经能够帮助程序员生成代码、解释报错、编写测试甚至完成部分功能。
这让我产生了一个和未来职业有关的问题。
如果未来大量基础代码可以由 AI 生成,那么单纯“写代码快”可能不再是程序员最核心的竞争力。
相反,理解需求、判断 AI 生成代码是否正确、设计系统、发现问题以及做技术决策可能变得更加重要。
因此我想问:
在 AI 编程工具越来越成熟的情况下,大学计算机专业学生应该把更多时间投入到代码能力,还是系统设计、计算机基础和问题分析能力?软件工程课程本身是否也需要因为 AI 的出现而改变?
五、关于课程反馈
对于课程中的反馈方式,我选择:
D:经常提问题,平时就经常给老师和助教提反馈。
我认为既然软件工程强调迭代,那么课程本身其实也可以看作一个不断迭代的过程。
如果发现课程安排、作业要求或者项目开发中存在问题,我希望能够及时提出,而不是等到期末课程已经结束以后再反馈。
当然,反馈不应该只是简单地说“作业太多”或者“太难”。
更有价值的反馈应该包括:
我遇到了什么问题 → 为什么产生这个问题 → 我尝试了什么 → 我认为可以如何改进。
这也是我希望自己在这门课程中逐渐培养的一种沟通能力。
六、前车之鉴——阅读前人经历后的感想
1. 《科班,但没学懂计算机》
文章链接:
https://book.douban.com/subject/4006425/discussion/22803961/
看到“科班,但没学懂计算机”这个话题的时候,我其实有比较明显的共鸣。
计算机专业的课程很多。
程序设计、数据结构、算法、组成原理、操作系统、计算机网络、数据库……
每个学期都在学习新的东西。
但学完之后如果问自己:
“我真的能够把这些知识用起来吗?”
答案可能并没有成绩单那么漂亮。
以前我会觉得考试通过了就意味着这门课结束了,但现在越来越发现,很多专业课真正的价值可能是在之后做项目、刷算法或者准备面试的时候才体现出来。
例如学习操作系统的时候觉得很多概念比较抽象,但学习 Java 并发、服务器或者数据库之后,又会重新遇到进程、线程、锁、内存等问题。
所以我现在认为,所谓“科班优势”并不是上过这些课程,而是能够把这些课程留下来的知识真正连接起来。
这也是我接下来希望改善的地方。
2. 偏科生自学摸索的道路——实习的重要性
文章链接:
https://www.cnblogs.com/xiaozhi_5638/p/4485805.html
这篇文章中关于自学和实习的经历让我比较有感触,因为我现在也正处于准备寻找实习的阶段。
以前我容易有一种想法:
等我技术准备得足够好了,再去找实习。
但后来发现这个“足够好”其实没有明确的终点。
算法不够好,可以继续刷;Java 还有很多东西没学;项目还能继续完善;八股也永远复习不完。
如果一直等到全部准备好,很可能永远不会开始投简历。
所以我现在更倾向于一边准备、一边尝试。
实习的价值不仅是一段简历经历,更重要的是能够让我知道学校项目和真实开发到底有什么区别。
只有真正进入一个开发环境,才会发现自己究竟缺什么。
3. 世界一流大学如何教软件工程
文章链接:
https://www.cnblogs.com/xinz/p/7465659.html
相比传统的“上课—考试—结束”,我更期待软件工程是一门以实践为核心的课程。
因为软件工程中很多能力并不能通过背概念获得。
例如 Git 冲突怎么解决、团队成员进度不一致怎么办、需求发生变化怎么办、代码出了问题谁负责、测试应该怎么进行……
这些问题只有真正合作开发之后才会理解。
我以前做个人项目时,可以自己决定所有事情。
今天想修改数据库就修改,想增加功能就增加。
但是团队项目显然不能这样。
因此,我希望这门课能够让我真正体验一次团队软件开发,而不仅仅是最后几个人把代码拼在一起交作业。
如果最后能够让我形成比较规范的软件开发习惯,我认为这门课的意义就已经远远超过最后的考试成绩。
七、GitHub 练习
按照作业要求,我创建了与自己 GitHub ID 同名的仓库,并在 README 中进行了自我介绍。
我的 GitHub:
个人 README 仓库:
https://github.com/2553a/2253a

README 中主要介绍了我的基本情况、目前学习的技术栈、正在进行的项目以及未来的学习方向。
通过这次练习,我也希望以后逐渐把 GitHub 从一个“下载别人代码的网站”变成真正记录自己项目和学习过程的平台。
八、博客园与 Markdown 使用
这次作业也是我第一次比较正式地使用博客记录自己的学习过程。
相比普通文本编辑器,我觉得 Markdown 的优势是语法简单,同时能够保持比较清晰的文章结构。
目前我已经学习了:
- Markdown 标题;
- 表格;
- 引用;
- 有序列表与无序列表;
- 代码块;
- 超链接;
- 图片插入;
- 行内代码。
博客园 Markdown 编辑器截图

以前遇到问题时,我通常是解决之后就结束,很少专门记录过程。
但很多问题过几个月之后再次遇到,又需要重新搜索。
所以我希望从这次作业开始尝试记录一些真正值得记录的问题。
也许刚开始写博客会花费不少时间,但如果能够坚持下来,它应该会成为自己大学学习过程的一份记录。
九、总结
写这篇博客的过程其实也是一次对自己大学前两年的复盘。
如果让我总结现在的状态,我觉得是:
已经学了一些东西,也开始真正做项目,但距离自己希望达到的水平还有很长的距离。
以前我比较容易用“这门课学完了没有”“考试通过了没有”判断自己的学习进度。
现在我更希望通过另外一些东西判断:
- 我能不能独立完成一个功能?
- 遇到 Bug 能不能定位?
- 能不能读懂别人写的代码?
- 能不能把自己的设计解释清楚?
- 能不能和别人合作开发?
- 能不能坚持学习,而不是只在考试前突击?
- 面对一个陌生问题,能不能找到解决方法?
这些问题可能比成绩更接近一个软件工程师真正需要的能力。
大三也是一个新的阶段。
希望这个学期结束的时候,再回来阅读这篇博客,我能够发现:
至少现在写下的这些目标,不只是写在博客里的计划。

浙公网安备 33010602011771号