第一周作业-随笔
软件工程第一次作业——自我介绍与课程规划
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS/ |
|---|---|
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS/homework/15692 |
| 这个作业的目标 | 认识自己并为这门课后续的学习预热 |
1. 自我介绍
我叫陈沐兰,目前就读于广东工业大学2024级计算机科学与技术6班。
我的性格比较内向,尤其是在陌生人面前话会比较少,有时候甚至会觉得有些尴尬。不过在熟人面前会放松一些。相比于主动表达自己,我可能更习惯先观察和思考。
我觉得自己有两个比较明显的特点,一个是容易拖延,另一个是做事比较认真。这两个特点听起来似乎有些矛盾,但它们确实同时存在。面对需要动脑思考的事情时,我经常会觉得“开始”是最困难的一步,因此容易拖延;但真正开始做之后,我又会愿意花比较长的时间去完成和解决问题。
平时最大的兴趣爱好是听音乐和刷一些关于小狗、小猫的视频。相比于比较刺激或者需要投入大量精力的娱乐方式,我更喜欢这些能够让我放松下来的事情。
为什么选择计算机专业
当初选择计算机科学与技术专业,一方面是因为在我的分数能够达到的专业中,计算机是我比较感兴趣的方向;另一方面也考虑到了就业前景。
现在几乎所有行业都离不开计算机,计算机技术已经融入生活和工作的很多方面,因此当时我认为计算机是一个发展空间比较大的专业。
上大学之前,我对计算机专业的想象其实比较简单。我想象中的程序员是坐在电脑前快速敲代码,解决各种问题,看起来非常酷。
真正进入大学开始学习之后,我发现现实和想象之间存在比较大的差距。现实更多时候是面对报错、理解代码、调试程序,以及反复思考为什么程序不能正常运行。
有时候甚至会觉得自己和代码“两看相厌”,我不熟悉它,它也不认识我。
直到现在,我对未来仍然有一些迷茫。我学习了数据结构、计算机网络等课程,也接触过C语言和Python,但很多知识对我来说仍然比较零散。我能够完成一些课程作业,也能够写一些程序,但是仍然不知道这些知识在真实的软件开发中是如何被组织和应用起来的。
我目前最大的困惑之一就是:自己现在学习的这些知识,未来到底能够应用在什么地方?
我的优势和特点
我认为自己在学习计算机方面比较明显的优点是有一定的耐心。
遇到不会的问题时,我虽然比较依赖AI,但在不断提问的过程中,也慢慢学会了如何让AI更准确地理解自己的需求。
一开始遇到问题时,我可能只会简单地描述“代码为什么报错”,后来会尝试提供更多信息,例如具体的报错内容、程序的预期结果、实际结果以及自己已经尝试过的方法。
虽然目前这种能力仍然比较有限,但我认为这也是一个逐渐学习如何描述和分析问题的过程。
相比于很快放弃一个问题,我通常愿意花比较长的时间反复尝试。虽然这种方式有时效率并不高,但我认为耐心对于学习计算机来说仍然是一项比较重要的能力。
我理解的师生关系
我希望师生之间是一种双向的关系:老师认真教,学生认真学,双方都对自己的责任负责。
老师应该把知识讲明白,及时指出学生的问题,提出明确的要求和标准,同时增加与学生的互动。作为学生,我也应该按时完成作业,主动思考,遇到问题先尝试自己解决,而不是过度依赖老师。
老师负责引导和要求,学生负责行动和成长,双方都做好自己的部分,才能形成真正有效的师生关系。
我如何看待参考、借鉴、AI和抄袭
我认为,在自己无法实现某个需求时,可以参考别人的代码。
软件开发本身也并不是所有代码都必须从零开始编写。学习别人的代码、阅读开源项目、参考已有的解决方案,都可以帮助我们学习新的思路。
但是参考并不等于直接复制。
如果修改别人的代码之后进行提交,我认为应该明确标示出处。
我认为使用AI也是类似的道理。
AI可以帮助我们分析问题、提供思路和辅助编写代码,但是如果完全不了解代码的作用,只是复制之后提交,那么这样的代码即使能够运行,也不代表自己真正掌握了相关能力。
因此,我希望自己在后续的学习中能够逐渐形成这样的方式:
先明确自己的需求和项目结构,再使用AI辅助解决具体问题,同时理解AI生成的代码在做什么。
2. 现状、经验和计划
我目前的计算机学习情况
经过两年的学习,我已经学习过数据结构、计算机网络等课程,也接触过C语言和Python。
目前我最熟悉的编程语言是C语言。
不过,我对自己的评价并不算高。目前我最多能够做到阅读部分别人的代码,以及完成一些算法和课程相关的程序。
我还没有独立完成过一个完整的软件项目,因此对于一个项目从开始到结束究竟需要哪些技术、如何组织代码、如何设计项目结构,目前仍然没有比较清晰的认识。
目前我的学习状态主要有以下几个特点:
- 学过不少课程,但是知识比较零散。
- 学过数据结构、计算机网络等课程,但掌握得还不够深入。
- 能够编写一些程序,但是完整项目经验不足。
- 比较依赖搜索和AI。
- 目前还没有特别明确的技术方向。
- 对未来有一定的规划想法,但不知道具体应该如何实现。
我认为自己距离一个合格的软件工程师最大的差距,并不只是某一种编程语言掌握得不够,而是缺少将零散知识组织起来解决一个完整问题的能力。
我现在能够学习一个具体的知识点,也能够完成一个具体的功能,但是如果让我从零开始完成一个完整项目,我可能首先就会遇到一个问题:不知道应该从哪里开始。
我的学习方式和经验
遇到问题时,我通常会按照下面的顺序解决:
自己思考 → 搜索资料 → 询问AI → 询问同学 → 询问老师
一般情况下,我会自己研究大约两天左右,如果仍然没有结果,再尝试寻求帮助。
在使用AI的过程中,我也逐渐发现,提问方式会直接影响得到的答案。
如果只是简单地问“为什么报错”,AI很难准确判断问题。但如果提供具体的报错内容、相关代码、预期结果、实际结果以及自己已经尝试过的方法,得到的回答通常会更有针对性。
因此,我认为自己目前最大的进步并不只是学会使用AI,而是开始学习如何更准确地描述问题。
当然,我目前仍然存在比较明显的问题。
首先是容易拖延。尤其是面对需要大量思考的任务时,我经常会觉得开始一件事情非常困难。
其次是缺少比较强的学习内驱力。我很少主动学习课程之外的内容,更多时候是在课程作业或者具体任务的推动下开始学习。
如果按照5分制评价自己的自主学习能力,我目前会给自己2分。原因是我认为自己最大的不足并不是完全无法学习,而是缺少主动开始和长期坚持的动力。
技能调查与自我评价
根据目前自己的实际情况,我选择以下五项能力进行评价。评分范围为0~9分,其中0分表示完全不了解,5分表示能够达到一般面试要求,分数越高表示掌握程度越高。
我的评分并不是为了证明自己目前有多强,而是希望通过这种方式明确自己目前的不足,并给课程结束时的学习设定一个比较具体的目标。
| 能力项 | 当前水平 | 课程结束目标 | 提升手段 |
|---|---|---|---|
| 代码质量与编程能力 | 4 | 7 | 继续使用C和Python完成实际功能;关注变量命名、函数职责和模块划分;完成代码后主动整理重复代码;定期回看以前写过的代码;通过课程项目增加实际代码量。 |
| 验证深度与测试覆盖 | 3 | 7 | 不再只通过输出是否符合预期判断程序正确性;设计正常、边界和异常测试;学习单元测试的基本方法;记录Bug和解决过程;逐渐形成先考虑测试,再实现功能的习惯。 |
| 工程复现性与项目构建能力 | 3 | 7 | 主动编写README;记录运行环境和依赖;学习项目目录组织;完成项目后尝试在新的环境中重新运行;学习基本的依赖管理和项目配置方法。 |
| AI辅助开发与工具使用 | 3 | 6 | 使用AI之前先明确需求和思路;提问时提供完整上下文;AI生成代码后先理解再使用;遇到报错先尝试自己分析;从让AI告诉我怎么做逐渐转变为确定目标后再让AI辅助实现。 |
| 自主学习与解决问题能力 | 2 | 6 | 将大型任务拆分成小目标;遇到问题先自己思考和搜索,再询问AI;设置独立思考时间;通过课程项目形成持续学习的动力;减少因为不知道从哪里开始而产生的拖延。 |
我对软件工程课程的期待
我希望通过这门软件工程课程,重点提高自己的项目能力、测试能力以及合理使用AI进行开发的能力。
目前我最大的困惑之一是:我知道一些具体的知识和技术,但是不知道如何把它们组合起来完成一个完整的项目。
因此,我希望课程结束之后,自己能够具备搭建项目框架的能力。
这里所说的“搭建项目框架”,并不只是指创建几个文件夹或者写出一个目录结构,而是希望自己能够知道:
- 一个项目需要解决什么问题。
- 完成这个项目需要哪些技术。
- 不同功能应该如何划分。
- 项目应该从哪里开始。
- 完成之后应该如何测试。
- 如何逐步完善一个项目。
我希望最终能够完成一个由自己提供大致框架和需求,再通过合理使用AI辅助完成的项目。
我认为,这比单纯让AI直接生成一个完整项目更符合我目前的学习需求。
未来方向
目前我还没有明确的技术方向。
我知道自己学习过C语言、Python、数据结构和计算机网络等内容,但暂时还不能确定自己未来更适合或者更喜欢哪个方向。
我认为自己目前还处于探索阶段。
相比于现在立刻确定一个非常具体的职业方向,我更希望先通过软件工程课程完成一个相对完整的项目,了解真实的软件开发过程,然后再逐渐判断自己更适合什么方向。
我目前最大的困惑仍然是:不知道自己现在学习的知识应该如何真正应用,也不知道未来应该继续深入基础知识,还是尽快开始进行完整的项目实践。
本课程的学习目标
通过本课程,我希望重点提高以下几个方面的能力。
第一,提高项目能力。
希望自己能够理解一个项目从需求到实现的大致过程,并且能够搭建一个基本的项目框架。
第二,提高测试能力。
希望不再只是通过“看输出结果是否正确”判断程序是否正确,而是能够主动设计测试数据,考虑边界情况和异常情况。
第三,提高AI辅助开发能力。
我希望学习如何更加合理地使用AI,而不是完全依赖AI。
理想的情况是,我能够自己提出需求和整体框架,再使用AI辅助完成具体的功能和问题分析。
第四,完成一个相对完整的项目。
目前我还没有独立完成过完整项目,因此课程结束时,我希望能够完成一个由自己设计大致框架、自己理解项目结构,并通过AI辅助完成的项目。
3. 阅读《构建之法》后的问题
问题一:什么时候应该把一个“程序”当成“软件”来进行工程化开发?(第1章 概论——软件工程的概念)
《构建之法》中强调,程序不仅仅是代码本身,而软件的开发还需要考虑需求、设计、测试、维护等软件工程活动。
但我有一个疑问:对于个人完成的小型项目或者课程作业来说,什么时候才有必要引入完整的软件工程方法?
例如,一个只有几百行代码的小工具,如果只是自己使用,可能写完、测试能够正常运行就足够了。如果还要专门进行详细的需求分析、编写大量文档、设计复杂的项目结构,反而可能增加开发成本。
但是,当项目规模逐渐扩大,或者以后需要多人协作、长期维护时,没有一定的工程规范又很容易让项目变得混乱。
所以我想知道,判断一个项目是否需要进行工程化开发的标准到底是什么?是代码量、项目人数、用户数量,还是项目后续的维护周期?
对于学生来说,如何避免“为了软件工程而软件工程”,又如何避免因为图省事而养成不好的开发习惯?
问题二:个人软件流程中的数据记录会不会反而成为一种负担?(第2章 个人技术和流程——个人软件流程 PSP)
书中介绍了个人软件流程,强调开发者可以通过记录自己的时间、代码规模和缺陷等数据,了解自己的工作方式,并根据数据不断改进。
我认为这种方法确实能够帮助开发者发现问题。例如,通过记录时间可以发现自己在哪些环节花费时间过多,通过记录Bug可以发现自己经常在哪类问题上出错。
但是我也有一个疑问:如果记录的数据越来越多,会不会反而让开发者把注意力放在“记录数据”上,而不是解决真正的问题?
对于专业的软件工程师来说,这些数据可能具有较高的价值,但对于目前还处于学习阶段的学生来说,每次写一个简单的程序都详细记录时间、错误数量和代码规模,可能会增加额外负担。
因此,我想知道个人软件流程中的数据记录应该做到什么程度才比较合适?哪些数据是真正能够帮助个人改进的,哪些数据可能只是增加工作量?
问题三:单元测试应该追求多高的覆盖程度?(第2章 个人技术和流程——单元测试)
书中强调了测试的重要性。相比写完程序后只进行一次整体测试,单元测试可以更早地发现问题,也能够在修改代码后帮助检查原来的功能是否受到影响。
但是,我认为测试也存在成本。
如果一个项目比较简单,为每一个函数都设计大量测试用例,甚至测试代码的数量超过功能代码,是否一定值得?
另外,即使测试覆盖率很高,也不代表程序一定没有问题,因为测试用例本身可能没有覆盖到真正容易出错的情况。
我以前写程序时通常是完成一个功能后直接运行,通过几个输入检查结果是否正确。这种方式虽然简单,但确实可能遗漏边界条件和异常情况。
因此我的问题是:对于不同规模的项目,单元测试应该如何取舍?学生在完成课程项目时,是应该尽可能提高测试覆盖率,还是优先测试核心功能、边界条件和容易出现错误的部分?
问题四:代码规范应该在什么时候开始形成?(第2章 个人技术和流程——代码规范)
对于刚开始学习编程的学生来说,最重要的通常是先让程序运行起来。
但是随着代码量逐渐增加,就会发现变量命名混乱、函数功能过多、代码重复等问题。
这让我产生一个疑问:代码规范到底应该从学习第一门编程语言时就严格要求,还是应该在具备一定编程能力之后再逐渐形成?
如果一开始就要求学生严格遵守各种规范,会不会增加学习负担,让初学者把过多注意力放在格式上?
但如果完全不关注代码规范,又可能形成不好的编程习惯,以后再修改会更加困难。
我认为这两种情况都存在问题,因此我想知道,对于初学者来说,代码规范应该如何逐步建立?
问题五:AI越来越强之后,软件工程师最应该培养什么能力?(第3章 软件工程师的成长)
随着AI能够帮助开发者编写代码、分析Bug和生成测试用例,一部分过去需要大量时间完成的工作已经可以得到辅助。
这让我产生一个疑问:在AI辅助开发越来越普遍的情况下,软件工程师最应该重点培养的能力是什么?
是更深入的编程能力,还是需求分析、系统设计和项目管理能力?
我认为AI可以帮助生成代码,但如果开发者自己不知道需要解决什么问题,也无法判断AI生成的结果是否正确,那么仍然无法真正完成一个项目。
结合自己的情况,我目前比较依赖AI,因此这个问题对我来说尤其重要。我希望通过这门课程找到一个比较合理的答案:未来应该如何让AI成为提高效率的工具,而不是代替自己思考的工具?
4. 前车之鉴
E篇博客阅读感想
阅读E篇博客后,我感受比较深的一点是:很多人在学习计算机知识的过程中,容易产生一种“我已经学会了”的错觉。
平时上课听懂老师讲解、看懂书上的代码,甚至能够完成作业,并不一定意味着真正掌握了知识。真正遇到一个新的问题时,如果不能独立分析和解决,就说明之前掌握的知识可能只是停留在表面。
这让我想到自己之前学习数据结构和计算机网络时也有类似的问题。学习的时候感觉自己能够理解概念,但是过一段时间之后再回头看,很多内容又变得陌生。
尤其是在真正需要自己写代码或者解释一个知识点时,才发现自己只是“看过”和“听过”,并没有真正理解。
这篇博客让我认识到,学习不能只停留在输入阶段,更重要的是进行输出和实践。
以后学习新的知识时,我希望自己能够更多地通过写代码、完成项目、记录博客和总结知识点来检验学习效果。
如果不能把一个知识点用自己的话解释清楚,或者不能实际运用,那么就不能简单地认为自己已经掌握了它。
对我来说,这也是以后写博客的一个重要意义。博客不仅仅是记录学习内容,更是整理思路和检验自己是否真正理解知识的一种方式。
I篇博客阅读感想
阅读I篇博客后,我对“基础能力和长期积累”有了更深的认识。
很多学生在学习过程中容易过于关注短期目标,例如快速完成一个项目、学习一个热门技术或者获得一段实习经历。
这些事情当然重要,但如果基础知识不够扎实,学习新的技术时就很容易只停留在使用层面。
对于计算机专业的学生来说,数据结构、算法、计算机网络、操作系统等基础课程可能不会立刻让人做出一个完整的项目,但这些知识决定了以后继续学习和解决复杂问题的能力。
结合自己的情况,我也发现自己存在一定的问题。有时候我会更愿意去学习能够快速看到成果的内容,例如完成一个小项目或者学习新的工具,而对于一些需要长期积累的基础知识容易缺乏耐心。
但是,短期内看不到明显效果的学习并不代表没有价值。基础知识就像项目中的底层结构,平时可能感觉不到它的重要性,但当遇到复杂问题或者学习更深入的内容时,就会发现之前的积累能够大大降低学习难度。
因此,我认为自己以后需要在“学习新技术”和“巩固基础知识”之间找到平衡。
一方面继续通过项目提高自己的实践能力,另一方面也不能忽视数据结构、计算机网络等基础课程。
只有理论基础和实践能力同时提高,才能真正形成比较完整的计算机能力。
通过阅读这两篇博客,我最大的感受是:学习计算机并不是简单地完成课程和作业,而是一个不断发现自己问题、不断实践和积累的过程。
相比于短时间内掌握很多新技术,更重要的是建立持续学习、独立思考和解决问题的能力。
5. 代码量目标
目前我估计自己已经编写的有效代码量大约为600行。
课程结束之后,我希望能够新增约2000行有效代码。
代码量本身并不能完全代表编程能力,但对我来说,这个目标更多是希望通过实际完成更多功能和项目,积累真实的编程和项目经验。
我希望这些代码不仅仅是简单的课程练习,而能够尽量包含一个完整项目中的不同部分,例如功能实现、代码修改、Bug修复和测试。
通过这个过程,我希望自己能够逐渐从“只能完成一个具体功能”,转变为“能够参与并理解一个完整项目”。
这是我的仓库链接https://github.com/mangnolia913/magnoliia913

浙公网安备 33010602011771号