软件工程第一周作业
| 这个作业属于哪个课程 | 计科24级78班-软件工程 |
|---|---|
| 这个作业要求在哪里 | 第一周作业 |
| 这个作业的目标 | 学会发表博客,建立GitHub个人代码仓库; 在随笔里审视自身的基本状态,思考和制定未来的学习计划,阅读相关文章并写出感悟 |
一、自我介绍
第一次见到张老师布置的这份体量不小、形式也很特别的第一周作业,我内心其实挺犯怵的。我本身畏难情绪比较重,虽然很早就一直知道,记录自我是一件很有价值的事,也尝试过写日记。哪怕不断告诉自己可以降低要求,可总是坚持不了几天,自律能力并不算强。不过软件工程这门课的作业要求,对我来说恰好是一个契机。过去两年的大学生活里,就算自律状态不好,我也一定会完成课程作业,因此我相信,在课程要求的约束下,我可以坚持完成博客记录。
磨蹭许久才动笔写下这些文字,我也意识到,将脑中纷乱的思绪梳理成通顺的文字并不是一件容易的事。我平时思绪繁杂,容易胡思乱想,适当把内心想法输出成文,对我而言也是一种情绪上的舒缓。
我中小学时期接触过书法与国画,大二又学过一段时间篆刻,只是学艺不精,也没有一直坚持。在学习这些技艺的过程中,我体会到善于观察、沉下心思考十分关键。临摹古帖、篆刻运刀的时候,内心杂念会变少,我可以全身心投入:观察字帖笔画的起收转折,体会刻刀落下的力度,斟酌作品里各处留白,感受线条或圆润或凌厉的质感。
这些爱好和课程学习也有共通点,二者都高度需要专注。只是我已经很久没有静下心重拾这些技艺,自身的专注能力也有所退步。
二、现状、经验和计划
(1)专业选择、技能差距评估
我是怎么选择了这个专业的?
答:我当初选择计算机专业,主要用的是排除法。我明确大学希望就读工科方向,但传统工科的岗位往往伴随体力消耗,工作环境时常需要户外作业,条件比较艰苦,因此我优先考虑新工科方向。
电子信息这一类虽然也属于新工科,但实验、硬件调试多,对动手实操能力要求很高,我对这方面没有太大把握。对比下来,计算机更偏向逻辑思维,更契合我自身的情况,于是最终选择了计算机专业。
离成为一个合格的 IT专业毕业生,在专业知识、技能、能力上还差距哪些?
| 技能 | ①目前的水平(0~9) | ②想在课程结束后达到的水平(0~9) | ③提高手段 |
|---|---|---|---|
| 程序理解(阅读、分析、Debug) | 4 | 7 | 1.在洛谷、GitHub 挑选中小型开源项目,逐模块读源码,梳理调用关系 2.刻意练习 debug:遇到 bug 不依赖搜索引擎,独立复现、定位根因 3.刷代码阅读类习题,练习在不运行代码情况下预判输出结果 4.使用调试工具跟踪程序执行流程,观察变量、栈帧变化,理解运行逻辑 5.复盘错题代码,记录出错现象、触发条件、底层原因,沉淀问题库 6.阅读优秀算法题题解代码,对比多份实现,分析不同写法的思路差异 |
| 编程语言实现能力 | 4 | 7 | 1.完整过一遍官方基础语法,整理语法坑点笔记,记录容易出错的语法细节。 2.洛谷刷题,训练语法熟练程度。 3. 完成小型完整项目,而不是只写零散片段,完整经历输入输出、文件处理、类与对象、异常处理全流程。 4.对比同一功能,阅读多种语言实现,理解语言特性差异,熟悉该语言标准库常用 API。 5.阅读该语言高质量开源项目源码,学习工业界的惯用写法与库使用方式。 |
| 架构 / 模块化 / 接口设计 | 2 | 5 | 1.做项目前强制画模块框图,定义模块对外接口,再动手写实现代码 2. 学习经典开源项目的模块划分,分析它如何拆分职责、定义接口 3.练习重构旧代码,把高耦合代码拆分成独立模块,优化接口 4.参加小组项目,和同伴讨论模块划分,接收他人对设计方案的反馈 5.针对同一个需求,构思 2 套不同设计方案,对比两者优劣取舍 |
| 模块实现、逐步细化 | 4 | 7 | 1.复杂需求不要直接编码,拆解成多个小模块、小函数,逐个完成调试 2. 洛谷刷题训练:大问题拆分为子问题,分步编码,每完成一小块就测试 3.写伪代码梳理逻辑,伪代码逻辑通顺后再翻译成编程语言 4.增量开发:先实现最小可用版本,再迭代增加新功能,避免一次性写完整套代码 5.多做课程大作业,刻意练习大型功能拆解实现 |
| 单元测试、代码覆盖率 | 3 | 5 | 1.编写边界用例:空输入、极值、异常输入,覆盖正常 + 异常场景 2.使用覆盖率工具,查看哪些代码分支没有被测试覆盖,补充对应用例 3.使用覆盖率工具,查看哪些代码分支没有被测试覆盖,补充对应用例 4.养成习惯:先写测试用例,再实现功能(TDD 思维练习) 5.阅读开源项目的测试代码,学习工业界如何组织测试集 |
| 代码复审、代码规范 | 4 | 6 | 1.严格遵循对应编程语言官方代码规范,写代码开启静态检查工具 2.写完代码做自我复审:变量命名、函数长度、重复代码、异常处理逐项自查 3.将自己代码交给同学互评,收集代码问题反馈 4.观摩开源项目 PR 的 Code‑Review 讨论,学习别人指出问题的角度 5.定期回看自己过去写的旧代码,找出不足做迭代优化 |
| 个人源码管理 | 1 | 6 | 1. 所有课程作业、个人项目全部使用 Git 做版本管理,熟悉常用指令 2.在 GitHub 建立个人仓库,做好 README 文档,清晰说明项目功能、部署方式 3.练习分支开发工作流:新建功能分支开发,完成后合并主分支 4.学习写规范 commit 信息,清晰描述每一次提交改动内容 5.尝试 Fork 开源仓库,练习提交简单 PR,熟悉协作流程 |
(2)阅读博客心得
a) 关于上课听讲的博客阅读心得
填写阅读 你为何要来上课并且认真参与 和 这个学生的思考 后的感悟
我阅读Scalers《大学生上课为什么一定要认真听讲》与 CookieLau 的博客文章的时候正好在上习概课,内心颇有一番感触。
我十分认同文中 “认真听讲本身就是一种能力” 的观点。回想小学和初一初二,课程难度不高,我只要课堂上维持住专注力,课下完成作业就能学得比较轻松,考试的结果也很不错。当时有同学问我是不是课后刷了很多题,我其实并没有,只是上课听进去了,写作业、考试的时候,老师课堂上讲过的内容就会自然在脑海里浮现,课本、辅导书上的知识点也能顺利调用出来。
到了初三,知识难度提升,同时短视频这类碎片化信息开始占据我的生活,我也经常熬夜,能够明显感觉到自己上课专注力大幅下滑,做很多事情都变得吃力。直到现在,二十岁的我,专注力水平某种程度上还比不上十二岁的时候。
但对于原文另外两个观点 ——“课程讲得不好不能成为不听讲的理由”、“课程有用无用不是一个大学生的格局能够判定的”,结合我自己的现实体验,我更偏向 CookieLau 的辩证看法。就拿当下这节习概课来说,老师讲课偏向闲聊式的输出,我会选择在课上阅读这两篇参考文章。
如果课堂本身质量有限,我不会强迫自己硬听。但这并不代表我在浪费时间,利用这段课堂时间自主阅读学习,同样也是在锻炼我的专注能力。我承认自己现在的眼界、格局还有局限,格局的提升是一个长期过程。或许等到未来,没有繁重的学业与工作压力,我会愿意静下心好好去听这类课程。但以我现阶段的处境,我会更务实,优先利用课堂时间完成作业相关材料的阅读,把时间花在当下更要紧的事情上。
b) 大学师生关系
我在大学体验到的师生关系:偏向被动式的师生关系。教学体验很大程度取决于老师的授课经验。经验丰富的老师可以把控课堂节奏,带动学生互动;而缺少授课经验的新老师,不擅长调动课堂氛围,很容易出现课堂冷场,之后便只能自顾自讲课。明明这类老师的课件内容质量往往很不错,但我还是很难集中注意力,常常忍不住玩手机,一节课就这样匆匆过去,头脑里留不下什么有效信息,最后只能依靠期末突击速成来应付考试。我自身一直处于被动接收的状态,课堂参与度完全取决于老师的互动能力,把自己的学习状态交由他人决定,这其实是一种并不健康的学习模式。
我希望这门课的师生关系:健身教练与健身学员的关系。第一次接触这个比喻,我觉得十分贴切巧妙。作为学员(学生),自身要有强烈的求知欲,发自内心想要学到实在的知识,主动投入时间听课、完成作业;同时也需要教练(老师)给予指导与修正。即便自己耗费心力完成的成果,专业负责的老师也可以轻松发现其中存在的诸多问题,帮我查漏补缺。
如果老师布置的作业对你来说有些困难,我的选择:C
C:遇到难度较高的作业,我会主动向老师和同学请教,投入更多时间思考、攻克问题,尽力把全部作业完成。
c)参考资料、借鉴开发 和抄袭剽窃的区别
阅读赵畅老师的这篇博文之前,我并没有分清合理借鉴与抄袭剽窃的边界。我之前没有意识到,当老师把自己写的参考代码公开给学生用于学习,结果学生直接提交高度雷同的代码当作自己的作业,这件事会让老师感到失望。读完两篇文章,我才真正理解二者的区别。
| 合理借鉴,在他人工作基础上继续开发 | 抄袭、剽窃 | |
|---|---|---|
| 来源标注 | 明确标注资料、代码、思路的出处,附上链接或注释说明 | 不标注原作者与来源,刻意隐藏原始出处 |
| 内容处理 | 在原有基础上加入自己的理解,进行修改、拓展与创新,产出新价值 | 直接复制,或仅简单修改变量名、调换语句顺序,无实质改动 |
| 本质 | 尊重前人劳动,站在已有成果之上开展自己的工作 | 将他人智力劳动伪装成自己的成果,窃取别人的劳动 |
后续我会向老师确认本课程对于资料引用的具体规范,同时查阅学校的相关文件,了解学校对于抄袭剽窃行为的处理规定,在后续博客、代码作业中恪守学术诚信。
(3)未来发展选择、优劣势与本学期规划
我未来的发展选择:优先备考计算机专业研究生,研究生毕业后的发展方向暂未确定。
相比其他同学,我的优势:目标明确,坚定选择考研,不会被就业、考公等其他路线干扰;起步时间充裕,当前大三阶段就已经建立考研备考意识。本学期校内多门课程能够和408考研科目形成联动:计算机系统结构巩固计算机组成原理,Linux技术对接操作系统,信息安全概论可以辅助计算机网络的学习,软件工程课程能够推动我完成项目实战。自身英语基础较好,可以减少考研英语的备考压力。
相比其他同学,我的劣势:代码功底薄弱,动手实践能力不足,缺少完整项目经历,如果维持现状,考研复试会处于很大劣势。课内虽然学过一遍408相关课程,但掌握程度很浅;数学基础普通。容易产生多线焦虑,经常会觉得自身很多内容都没有掌握,容易陷入内耗,迟迟难以启动学习任务。
本学期针对性规划:
-
认真跟进软件工程课程,借助课程任务打磨项目实战能力,积累项目经历。
-
适度启动数学复习,逐步熟悉考研数学相关知识点。
-
坚持背诵英语单词,遇到英文文档、教程优先尝试自主阅读,减少对翻译工具的依赖。
-
严格落实软件工程课程的各项要求,利用课程强输出、强反馈的特点,缓解自身学习迷茫与焦虑。
-
重要课程课堂尽量维持专注,课后作业避免拖延,不要堆积到截止日期才仓促完成。
-
主动调节心态,减少无效内耗,出现焦虑时尽快落实行动,克服“想得多做得少”的问题。
(4)本门课程学习计划、WOOP分析
- 目前代码量:
-
Java:500行
-
Python:500行
-
C/C++:1500行
-
一流互联网公司、科研岗位分别需要的代码量认知:查阅资料了解到,入职一流软件、互联网、人工智能公司,需要累计15000‑20000行代码;从事高校教学科研工作,则需要7000‑15000行代码。
-
每周投入本课程总时长(含上课):7小时
时间投入选择:C ,选择理由:希望相比以往课程投入更多精力,循序渐进提升项目能力,不过暂时不超负荷加码,选择比以前的课稍多一些的时间投入。
- 课程结束计划完成新增代码量:3000行;每周计划完成代码量:200行
WOOP分析
-
Wish(愿望):
本学期紧跟软件工程课程节奏,顺利完成个人独立项目、双人合作项目、团队协作项目三类实战任务。
坚持每周稳定输出代码,累计完成3000行有效代码积累。通过课程的实战训练,将大学两年所学的计算机组成、操作系统、计算机网络等理论知识落地实践,摆脱只会背书、不会实操的困境,稳步提升自己的项目开发能力与团队协作能力。 -
Outcome(期待结果):
如果顺利完成本学期目标,我将彻底摆脱零基础、零项目经验的现状,具备独立开发小型项目、参与团队完整项目开发的能力。能够熟练复盘自己的项目,清晰讲解项目架构、功能逻辑与开发细节,拥有拆解问题、排查Bug、优化代码的实战思维。同时克服拖延、焦虑的学习状态,养成持续输出、稳步精进的学习习惯,大幅提升个人计算机综合素养,为后续考研复试、未来就业打下扎实的项目基础。 -
Obstacles(潜在障碍):
内部障碍:自身代码基础薄弱,实战经验几乎为零,面对项目开发、代码调试极易无从下手;性格容易焦虑内耗,带有完美主义心态,总追求一次性做好,导致不敢动手、习惯性拖延;容易自我否定,对比他人容易产生自卑心理,学习心态不稳定。
外部障碍:本学期课程任务较多,多门专业课并行学习,容易出现时间冲突、精力分散的情况;项目开发中会频繁遇到陌生技术、未知Bug,缺少快速解决问题的经验。
最可能让目标失败的一项因素:完美主义+拖延心态。害怕做不好、害怕出错,迟迟不敢启动任务;一旦遇到难题、进度滞后,就容易心态崩盘、丧失斗志,最终摆烂放弃,导致全程跟不上课程节奏。
对应的克服思路:摒弃“完美开局”的错误心态,遵循软件工程迭代思维,坚持“先完成、再优化”。不追求一次性做出完美项目,允许初稿粗糙、代码不完美,优先保证按时完成任务,在持续实践中迭代优化,用行动克服内耗与拖延。 -
Plan(If‑Then预案):
- 如果遇到从未接触过、难度较大的学习或开发任务,下意识想摆烂停止学习、摸鱼玩手机,那么我立刻将手机放置在视线外,简单休整后,强制自己坚持深耕研究至少25分钟,先完成最小一步突破,绝不直接放弃。
- 如果被代码问题、项目Bug卡住思路,长时间没有进展,那么我先深呼吸平复情绪,接纳“新手遇到难题是常态”,短暂放松调整状态;重新投入25分钟攻坚,依旧无法解决就完整梳理、记录问题,主动向老师和同学请教,杜绝死磕内耗或直接摆烂。
- 如果完成当日学习任务后,习惯性熬夜刷手机、拖延睡觉,那么我将思考我现在到底在看什么内容,我真的想看吗,实在有想看的内容就写在备忘录里明天再一个个去看,睡前将手机放到远离床铺的位置,保证充足睡眠,避免影响第二天听课和学习状态。
- 如果上课不小心走神、知识点没听懂导致跟不上进度,那么我不纠结遗漏内容、不摆烂放弃听课,认真跟进后续课堂内容,当天利用课余时间补齐遗漏知识点,绝不把问题堆积到第二天。
三、提有质量的问题,给认真的反馈
问题1:
引用章节:第 1 章 概论,1.1 软件 = 程序 + 软件工程
引用原文片段:软件 = 程序 + 软件工程;软件企业 = 软件 + 商业模式。程序是数据结构 + 算法,而软件工程包含架构、配置管理、测试、维护、用户体验等一系列工程活动。
我的问题/反对观点:这个公式诞生时 AI 代码生成工具尚未普及。现在大模型可以直接生成完整程序代码,那 “程序” 这一部分工作被 AI 大量替代之后,软件工程的核心价值是不是会全部转移到需求、运维、商业模式上?那学习数据结构与算法的意义是否被削弱?
相关参考/个人经验:现在写项目,很多业务代码可以交给 AI 生成,但是 AI 产出的代码,无法直接拿来上线,还是需要人工的修正和审核。
我的困惑:既然程序可以由 AI 快速产出,当代计算机专业学生应该如何分配 “写程序” 和 “软件工程” 两部分的学习精力?这个经典公式在 AI 时代是否需要修正?
问题2:
引用章节:第 4 章 两人合作,4.3 代码设计规范
引用原文片段:函数最好有单一的出口,为了达到这一目的,可以使用 goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括 goto。
我的问题/反对观点:多数 C、C++ 课程教材都明确告诫开发者尽量不要使用 goto,认为 goto 会破坏程序的结构化,造成 spaghetti code(面条代码)。但是本书提出特定场景下 goto 可以提升可读性,二者看起来是互相矛盾的。
相关参考/个人经验:我学习 C 语言的时候老师禁止我们写 goto;但是看一些开源 C 语言底层项目,在内核资源释放、错误清理的场景确实大量使用 goto,用来统一处理退出逻辑。
我的困惑:goto 的使用边界到底在哪里?学生写作业的时候,是否应该允许使用 goto?怎么区分 “提升可读性的 goto” 和 “滥用 goto 破坏结构”?
问题3:
引用章节:第 2 章 个人技术和流程,2.3 个人开发流程(PSP)
引用原文片段:PSP 强调个人对自己的开发流程负责,记录自己在各个阶段(需求、设计、编码、测试)花费的时间,用这些数据来估算和规划未来的任务,并持续改进自己的流程。
我的问题/反对观点:书中把 PSP 的数据记录当成改进流程的基础,但前提是记录必须真实。学生课程作业里,很少有人真的每写一段代码就掐表记时间,多数是写完项目后倒推填一张 "看上去合理" 的表格。数据一旦是编的,PSP 的所有估算和规划价值就全部失效,那这套流程对学生还有意义吗?
我的困惑:对个人学习场景,PSP 的核心价值是 "自我认知" 还是 "可复用的估算模型"?如果只靠自觉记录,如何保证不沦落为形式主义?
问题4:
引用章节:第 4 章 两人合作,4.4 代码复审
引用原文片段:代码复审是保证代码质量最有效的方法之一……"自己的代码自己测试" 经常会有盲区,别人的视角能发现作者看不到的问题。
我的问题/反对观点:复审的收益建立在 "复审者水平够、愿意认真看" 的前提下。课程小组里成员水平参差不齐,代码复审很容易变成对格式、变量命名、缩进的挑刺,抓不住真正的逻辑缺陷
相关参考/个人经验:有小组复审时大家走个过场,几分钟看完直接点 "通过",既没发现 Bug,还占用了进度时间;也有为了完成任务互相给对方代码补空注释的。
我的困惑:在时间紧张、成员水平不均的学生小组里,代码复审的优先级该怎么排?有没有比 "全员互审" 更轻量、更有效的替代方案?
问题5:
引用章节:第 5 章 团队和流程,5.2 软件团队的模式
引用原文片段:书中介绍了多种软件团队模式,如主治医师模式、交响乐团模式、爵士乐模式等,它们各有优劣,适用于不同规模的团队和项目。
我的问题/反对观点:书中这些团队模式大多是从真实职业团队抽象出来的,前提是有专职的 PM、测试、UX、架构师。但课程团队是临时组队、人少、没有专职岗位、大家身兼数职,任何一种标准模式都套不上,硬套反而增加管理成本。
我的困惑:课程小团队最接近书中哪种模式?如果都不适用,是不是应该允许一种 "怎么快怎么来" 的非标准模式?
课程反馈做法选择: C:有问题就问,至少一学期提三个问题, 认真按时填写反馈。
四、前车之鉴
阅读感想一
文章链接:A.https://book.douban.com/subject/4006425/discussion/22803733/
(把每天把要做的事情分成ABCD四类:A-紧迫且重要;B-重要不紧迫;C-紧迫不重要;D-不重要不紧迫。你是否有类似的习惯?)
感想:我很早就了解过四象限 ABCD 时间管理方法,但是一直没有真正落地执行。
平时我大多只被动处理 A 类(紧迫且重要)和 C 类(紧迫不重要)的任务。那些重要但不紧迫的 B 类事情常常被我忽略。等到 B 类任务被不断拖延,最后演变成 A 类紧急任务,我才慌忙赶工处理;处理完毕之后就放松休息,又继续等待下一件事被逼到截止。
总是等到事情火烧眉毛才动手,不仅生活节奏完全不可控,赶出来的成果质量也很难保证,做完之后内心还会充满挫败感。
今后我要主动把 B 类重要但不紧迫的任务规划进日常日程,提前推进,尽量避免重要事项被拖延到紧急状态,摆脱被动赶工的恶性循环。
阅读感想二
文章链接:B:https://book.douban.com/subject/4006425/discussion/22803961/
(你是否也觉得自己是科班,但没学懂计算机?)
感想:这篇文章的标题就深深戳中了我。我作为计算机科班学生,纸面考试题目可以作答,但一旦面对面试、项目简历这类实际场景,就会头脑一片空白。
大一大二我并没有荒废玩乐,能够做到按时上课、从不缺课。我先后学过 C 语言、高等数学、线性代数、概率论、计算机导论、离散数学、数值计算、数字逻辑与 EDA 设计、算法设计、数据结构、操作系统、计算机组成原理、计算机网络、人工智能等大量专业课。可现状是,很多知识考完试之后就快速遗忘。这些知识点就像散落的海洋球,没有容器把它们收纳、串联起来,只能考试前费力临时抓取,考试结束就全部丢掉,没能构建起完整的知识体系。
有时候非计算机专业的朋友和我聊 AI 相关话题,会默认我作为科班学生理应非常懂相关技术,但只有我自己清楚,我的实际知识储备并没有比非科班同学高出多少。文中一句话让我深有共鸣:“于是乎,一门需要动手实践、将会极大地提高我们编程素养和思维能力的课程,就被我们这样迷迷糊糊上完了。” 我很多课程也正是这样稀里糊涂就学完了,课听懂了、试考完了,但缺少实践内化,知识没有真正属于自己。
软件工程对我而言会是大学里很特别的一门课,我希望借助这门课多动手实践,改变这种 “看似学过,实则没学懂” 的状态。
GitHub地址:https://github.com/Woodrinke/Woodrinke


浙公网安备 33010602011771号