软件工程第一次作业

| 这个作业属于哪个课程 | <https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS/homework/15710> |
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class78-Grade2024-CS/homework/15710 |
| 这个作业的目标 | 写好第一篇博客,完成一次自我盘点和学期规划 |

一、介绍自己

我叫王尉人,计算机科学与技术专业大三学生,目前在补基础,准备考研。这是我第一次写博客。

以前刷到过别人说写博客好,我觉得跟写笔记差不多,没当回事。现在慢慢觉得不一样。写下来的时候你得把脑子里模糊的想法变成一句能读通的话,想不清楚就写不出来。这个过程能发现很多平时忽略的细节。

我的优势有两个。

一是上手新东西快。大二下学期工作室接了个项目,前端缺人,而我对小程序开发是零基础,连 WXML 和 HTML 的区别都说不清。我用4天把6 个页面加接口对接做出来交付了。我觉得我做对的就三件事:分得清哪些必须搞懂、哪些可以先跳过;先把东西跑起来再改,而不是先看完整文档;卡住了知道按官方文档、问ai这个顺序找答案。

二是能长期坚持一件事。我从大二开始坚持背单词,到现在考研单词基本熟练了。

关于底线,我很认同要有底线要求。作业是检验学习的手段,作业是抄的,检验出来的就是假的。我给自己定三条:代码自己敲,引用必注明,数据不造假。用 AI 可以,但我会逐行读懂并在文末说明用在哪,不会整段复制冒充自己的产出。

二、现状、经历和计划

(1)技能调查表

我填报志愿是因为家里人建议,说计算机好就业,当时没想那么多就报了。

从技能调查表里我挑了这 5 项作为本学期重点:

技能 目前水平(0-9) 课程后希望达到(0-9)
数据结构与算法 4 6
单元测试与调试 2 6
Git 与版本管理 3 7
英语资料阅读 4 7
任务时间估计 2 6

为了达到这些目标,我计划:

  1. 每周做 2 道算法题,写完写题解,把思路写清楚;
  2. 每个项目给核心模块补单元测试,从"加 print 看输出"改成写测试用例;
  3. 学完 branch、rebase、冲突处理并各实操一次,团队项目走 PR 加 review 的流程;
  4. 每周读 1 篇英文技术文档,把背下来的单词放进真实语境;
  5. 每次开工前先写下预估时间,做完记实际时间,期末画一张偏差图。

(2)课程相关思考

(a) 为什么要认真参与这门课

我之前体验到的大学课堂,基本是上课记笔记、考试背笔记、考完全忘记。软件工程是实践学科,光听没用。

我不想毕业的时候只有一张成绩单却拿不出一个能跑的项目。更重要的是,这门课有一样我靠自己拿不到的东西:被逼着完成一个一个人做不完的项目,并且让别人检查我的代码。我这两年做过的项目全是单人的,从来没被真懂的人逐行看过代码,也从来没为了接口对不上跟人吵过架。这些短板我自己补不上。

(b) 师生关系与作业困难应对

我体验过的师生关系大多是老师上课来、下课走,一学期下来老师可能都不知道我叫什么。我希望这门课更像教练和学员:老师指明方向、点拨难点,我们自己动手踩坑、总结。

如果作业有难度,我选 C:向老师和同学请教,花更多时间,把作业全部完成。

作业难说明它在我的舒适区之外,正是能进步的地方。不过我得提醒自己,C 的重点在请教,不在花更多时间。我以前的习惯是卡住了自己死磕,死磕不出来就抄一个或者放弃。这学期改成卡住 30 分钟还没思路就去问。

(c) 引用参考与抄袭剽窃的区别

引用参考是标注来源,在别人的成果上做修改和拓展,目的是产生新的价值。抄袭剽窃是隐瞒来源,把别人的东西当自己的,本质是欺骗。

我查了南科大、犹他大学和昆士兰大学几所学校的明文规定,其中有一条判断标准对我很有用:如果被问到,你能解释清楚这个方案为什么这么设计吗,能说清每一个变量和函数的作用吗。解释不清楚,那不管标没标出处,它都不真的是你的。这条比任何规则都好用,我打算每次交作业前拿它过一遍。

(3)未来方向与当下准备

我的选择是考研。

优势:英语起步早,背单词这些年不是白背的,能省下时间给数学和专业课;有在真实项目里顶上去的经验,复试时"零基础一周交付小程序前端"比"各科成绩优秀"有说服力;上手新东西快,读论文加复现这个流程我适应得比较快。

劣势:完全没有科研训练,没读完过一篇完整的论文,也没复现过任何模型;数学基础不扎实,考研数学是我的硬仗;代码量一般,现阶段简历拿不出手。

本学期的规划:

  1. 数学每天固定 1.5 小时,本学期把高数和线代过完第一轮;
  2. 每月精读 1 篇本领域的论文,读完写一页笔记发到博客;
  3. 每周读 2 篇英文技术文档或论文摘要,把背的词用起来;
  4. 本学期内联系一位老师,争取进组旁听组会,哪怕只是打杂。

(4)本课程学习计划

参考了美国本科和国内软件工程本科的几种教法之后,我对这门课的期待是:作业是真实的,有真实用户、有需求变更、过了 deadline 还得继续维护;反馈要具体,我希望听到"这个接口在第 3 个用例下会返回 null",而不是"这个设计不好"。

我打算每周提前看一遍要讲的内容,课上参与讨论,作业提前启动不拖沓。

代码量与时间投入:

目前代码量约 5200 行:C / C++ 约 1500 行,Java 约 2200 行,Python 约 1200 行,SQL 和 Web 相关约 300 行。

进一流的软件或互联网公司需要多少代码量,我没查到有权威出处的数字,网上流传的"10 万行才能出师"基本都是个人经验的转述。我自己的判断是,关键不在总量,在有没有 2 到 3 个带测试、有真实用户的完整项目。一个人循环写了 2 万行学生管理系统,含金量远低于认真写 8000 行、有 CI、有真实用户的项目。高校教学科研对代码量要求不高,更看重能不能读懂和改进别人的代码。

时间投入我选 C:比以前的课稍多一些,每周大约 12 小时(上课 2 小时,课下 10 小时)。

我不属于"前两年浪费了很多时间"那一类,我的问题是时间被分散了,不是被浪费了。所以我需要的是更集中,把碎片时间换成整块时间,而不是单纯堆时长。

课程结束时累计代码量目标 10000 行,也就是本学期新增约 4800 行,按 16 周算每周约 300 行。期末我会对着 Git 提交记录核对。

WOOP:

Wish:期末交付一个部署在线、有 30 个以上同学在用、带单元测试和文档的项目,Git 记录能证明我负责的部分是我自己写的,任务时间估计的误差收敛到 ±30% 以内。

Outcome:期末打开项目主页翻提交记录,有一半的 commit 不是我写的,但我能说出每一个是为了解决什么问题。复试的时候老师问做过什么项目,我直接打开链接,而不是背一段提前准备好的话。

Obstacles:最可能导致我失败的是分心。我爱好太多,坐下来准备写代码,先"查个资料",然后浏览器开到 B 站,一小时后就跟我没关系了。还有写代码卡住就切出去刷手机,回来上下文全丢,得重新读一遍代码。另外我擅长开始不擅长结束,看到新框架就想试,做三天 200 行的 demo 就没有然后了。

Plan:

  1. 如果我打算"先查个资料"而手已经点向 B 站,就合上电脑去接杯水,回来第一件事是在编辑器里写下今天要解决的具体问题;
  2. 如果写代码卡住超过 30 分钟还没思路,就停止死磕,去群里提问,问题里写清楚我试过什么、结果是什么、我预期是什么;
  3. 如果发现只有不到 60 分钟的碎片时间,就不开始写代码,只做读文档、写注释、写博客这类低重启成本的事;
  4. 如果连续两天没有任何 Git 提交,第三天就在群里公开汇报进度和卡点。

三、提出有质量的问题与课程反馈

我通读了《构建之法》第三版的前 8 章和 16、17 章,中间 9 到 15 章是跳读的。有 5 个问题想提出来。

问题一:PSP 要求精确记录时间,但没有历史基线的学生记录出来的数据全是噪声,这还有意义吗?

对应章节:第 2 章 2.3 个人开发流程(第 34 到 46 页)

书中介绍 PSP 要求记录每个阶段的实际耗时,用历史数据校准估计。我的困惑是,第一次做 PSP 的人记下的第一批数据意味着什么。我预估编码 3 小时,实际 5 小时,这个数字告诉我"我低估了"。但真实原因可能是我卡在一个根本不知道自己不知道的接口上,也可能是中途刷了一小时手机,还可能是需求本身不清楚。这三种原因对应的改进措施完全不同,补知识、控分心、先问清楚需求,但 PSP 表格把它们压缩成了同一个数字 5。我查了资料,PSP 是 Watts Humphrey 在卡内基梅隆的软件工程研究所提出的,设计目标就是让工程师用历史数据校准估计,但我没找到公开的量化验证。我想知道,在学生阶段样本量这么小的情况下,PSP 的主要价值是数据还是仪式。

问题二:如果"技能的反面"是模式识别,那我"一周上手小程序"到底算不算学会了?

对应章节:第 3 章 3.4 技能的反面(第 63 到 68 页)

书中区分了解决问题和模式识别,说当你还需要"解决"的时候,说明你还没形成模式。按这个标准回头看我引以为豪的那次救火,我突然不确定了。我当时确实是快的,但我做的是照着已有页面改、抄官方文档示例、搜报错信息。我积累了模式吗,还是只做了高效率的解决问题。如果下周让我从零写 Flutter,我还能这么快吗。我查到 Chase 和 Simon 在 1973 年做的棋位记忆实验,象棋大师对真实棋局的记忆远好于新手,但棋子随机摆放时优势就消失,这似乎说明模式是领域特定的。我有点担心自己的"快速上手"只是"我见过类似的东西"。

问题三:我反对强制结对编程,两个人水平差距大时它不是 1+1>2,而是 1+0.5<1。

对应章节:第 4 章 4.5 结对编程(第 72 到 77 页)

书中列举了结对的好处,但隐含前提是两人水平相当,没有讨论差距大时会怎样。我的理由有三条。一是角色会塌缩,水平高的人会自然拿过键盘,因为解释的时间比自己写完还长,水平低的人退化成念变量名的人。二是领航员这个角色需要能力,一个还没写过单元测试的人能领航什么。三是节奏不匹配的代价由强的那方承担,速度降到六成,弱的那方收获可能还不到四成。我在工作室经历过一次类似的配合,一个下午下来我的产出只有平时的六成,对方说学到了一点。我觉得讲解加分加强制 review 比结对更有效率。我想问老师,这门课的结对是怎么配对的,水平差距大的时候我该怎么调整。

问题四:我反对把创新"招数化",把创新拆成可操作步骤,本身是不是就在杀死创新。

对应章节:第 16 章 16.1 创新的迷思、16.3 创新的招数(第 354 到 384 页)

我同意 16.1 破除"创新靠灵感"的迷思,但不认为 16.3 的招数化是解药。一个真正可复制的创新方法论,如果它有效,必然会被所有人学会,而一旦所有人都会用,它产生的就不再是创新,而是标准化产品。另外招数是可执行的、可检查的、能写进周报的,而真正有价值的创新在发生的那一刻往往看起来像浪费时间、像走弯路。一套鼓励按招数出牌的评价体系,会淘汰掉真正在创新的人,留下最会填表的人。我承认我的反对有个漏洞,我没有替代方案,总不能让人去深耕五年等时机。所以我的真实困惑是,在等灵感和拆成招数之间有没有第三条路。

问题五:我用 AI 生成了一段代码,读懂了改了测了,这算"我的工作"吗?

对应章节:第 17 章 17.8 "软件工程师的职业道德"。(我看的第三版这一节没有讨论 AI,第四版新增了 4.6 节"与 AI 结对编程",但我手上没有那一节的内容)

我手上这本书的版本成书在大模型普及之前,它讨论的是抄同事代码、伪造测试结果这类事。具体场景是:我用 AI 生成一个工具函数,逐行读了,改掉两处不符合项目规范的地方,补了三个单元测试,然后提交。按"能不能解释每一行"这个标准,它算我的。但让我不安的是,我的理解可能是幻觉,我读懂不等于我能独立写出来。AI 把最难的那一步,从问题空间到解法空间的映射,替我做了。我发现自己在遇到稍难的问题时"自己想"的耐心下降了,因为知道问 AI 更快。我想知道,在能解释、能负责、能测试之外,是不是还需要一条关于能力保有的要求。

课程反馈

对于课程反馈,我选 C:有问题就问,至少一学期提三个问题,认真按时填写反馈。

为什么不选 D。D 描述的是一种状态,不是一句承诺。我害怕提问,宁可自己卡三小时也不愿在群里问一句。现在就选 D,等于又给自己写了一句漂亮话。所以我把 C 当成通往 D 的训练,这学期做到按时提交、反馈写具体问题、提问前先自己查过。

四、前车之鉴:读前辈经验的感想

1.《科班,但没学懂计算机》

https://book.douban.com/subject/4006425/discussion/22803961/

作者说自己科班出身却没学懂计算机,我看到这句特别有共鸣。课都上过,分数不低,但关掉搜索引擎让我从零搭一个能用的东西,我会卡在很多自以为会的地方。我有知识点,但没有能力;有课程,但没有体系。

不过我对"没学懂"这个说法有点保留。什么叫学懂,能手写红黑树算吗,能读通 Linux 内核某个子系统算吗。如果标准是这些,那大多数从业者都不算学懂,用一个大多数人都达不到的标准来要求自己,结果不是激励,是让人在开始之前就放弃。我更愿意换成:学懂不等于什么都会,等于我知道自己不知道什么,也知道去哪把它搞懂。

2.《把每天胡思乱想的东西记下来:思维快照》

https://book.douban.com/subject/4006425/discussion/22802960/

这篇讲把每天冒出来的想法随手记下来,然后经常翻回去看,对比过去的自己和现在的自己。我发现自己一直在做前半段,从没做过后半段。我的备忘录里有各种零散想法和随手记的 bug 解法,但从来没翻回去过,记录于是变成一个只写不读的黑洞。

我背单词能坚持下来,很大程度上是因为 App 每天给我看"已连续多少天",它在持续地给我看变化。而我的技术学习一直缺这个反馈环,所以总觉得自己原地踏步。这学期我打算把每次作业的博客当成思维快照,期末逐条对照开学时给自己打的分数。

3.《速成的培训班和打基础的大学教育有区别么》

https://www.cnblogs.com/geniusalex/p/4928713.html

这个问题我这两年反复问过自己。在工作室做项目的时候,我几乎没用过任何一门基础课的知识,用的是框架、搜索引擎、官方文档。那段时间我是真心觉得基础课没用。

想法变掉有两个原因。一是决定考研之后,我发现研究这件事的工作全发生在基础层,读的论文假设你懂线性代数,复现的模型假设你懂数值计算。二是那次小程序救火,我一周交付了,但我交付的东西能跑,不是它对。我不知道页面在数据量大了之后会不会卡,不知道状态管理在有并发时会不会出问题。没有基础的代价在这里:它不会让你做不出来,它会在你做出来之后让你不知道这东西靠不靠谱。

不过我不认为上过基础课就等于打上了基础。这些课我上过,试也考了,但基础没打上,因为我把它们当成了要通过的考试,而不是要掌握的工具。

五、工具与环境

博客园后台已把默认编辑器改为 Markdown。

3036de2061a9da6537021605efe30754

GitHub 仓库地址是 https://github.com/akcow/akcow ,仓库名与 ID 一致,根目录的 README 写了我的自我介绍。

92cf54d86b6c88fc5914073945cced9c

posted @ 2026-09-06 17:31  akcow  阅读(12)  评论(0)    收藏  举报