目录
一、回顾
1.对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪些不足,为什么?
在本学期的软件工程实践课程中,我认为大部分达到了我的期待。在过程中学习到了许多对我而言是全新的知识和技术,虽然当中有很多是在很短的时间内速成的,学习的也不是很扎实,但比起开学初的自己还是收获了不少。
在几次的结对作业中,通过阅读代码,提高了代码阅读能力,学习了许多工具的使用。收获了关于软件工程的知识,在阅读代码的过程中,对于书上课堂上的一些理论知识有了更深刻的印象和更透彻的理解,参与了团队项目,作为上大学以来历时最久团队项目,从中收获了很多团队交流沟通的经验和方法。
但在收获之外,仍有一些不足之处。
因为个人原因导致后期对于团队项目的计划和时间安排不够合理,出现匆忙赶工的现象,导致做出来的成果并不能令人很满意,存在很多瑕疵。由于学习的知识和技术时间较短,并没有系统地进行学习,因此许多知识和技术只是似懂非懂,理解不够透彻,掌握不够熟练,运用起来仍常常出错。有时的总结出的经验教训到下一次并没有及时改正,仍会出现同样的问题。对于团队沟通也只是有了一些经验,在团队项目中也还是有出现沟通不畅、双方理解不同导致的问题。
希望能够充分利用这些收获、总结这些不足,在将来继续学习与改善。
2.哪一次作业让你印象最深刻?为什么?
早期的结对作业让我印象比较深刻,在作业过程中知道了一些工具的使用,比如使用SonarQube对代码进行分析,使用git对项目进行管理,使用墨刀进行设计等。还有就是当时要求画的用例图,体系结构图,类之间的调用图,因为之前对于画图分析这种概念比较模糊,分析一段代码就干瞪眼看,容易看晕,通过画图分析比自己干瞪眼看代码效率更高,更容易理解代码。
二、耕耘
请说明你付出了多少时间,写了多少代码,多少注释,多少文档,多少次签入,最好用折线图或其他合适的图形/表格的方式展现
作业 | 结对作业 | 团队项目 |
注释+代码 | 450 | 550 |
时间 | 10h | 42h |
三、收获
1. 所做工作的具体成就,软件的用户有多少,公开的源代码有什么影响力
实现了贪心算法对于2048的自动游玩。通过分享给周围家人朋友,粗略估计有20几个人游玩。虽然开源代码关注的人不多,但是如果代码有什么不好的地方还是欢迎大家的批评指正。
2.你在哪些技能上有提高?请列举出来。
学习了python这门新语言
熟练了makdown的编辑,虽然在学习面向对象程序设计时也使用了,但只是会最基本的操作,而且时间久远忘了不少。使用了Markdown后写出来的文本更加规范,不会出现混乱的排版和空行。
提升了搜索信息、查询问题的能力。在个人编程、结对编程与团队项目中都出现了很多不懂的问题,需要经常上网查找,因此逐渐掌握了一些搜索的技巧。
3.使用了哪些软件/工具
墨刀,SonarQube,Xmind,idea,vscode,markdown编辑器,Process on等等。
四、结构化的理解
当我们平时理解一些新事物时,我们的理解大多是离散的,即兴的,能否在一个良好定义的体系中把自己的理解整理一下?
1.知识(Knowledge):就是记忆、认识,能回忆重要名词、事实、方法、规准、原理原则等;
例如:软件工程的名词,原理,能回忆编程语言的某种知识
要求:写出你印象最深的几个知识点
还是当时要求画的用例图,体系结构图,类之间的调用图,因为当时花了比较多的时间去学习
1.用例图(use case diagram):是用户与系统交互的最简表示形式,展现了用户和与他相关的用例之间的关系。通过用例图,人们可以获知系统不同种类的用户和用例。用例图也经常和其他图表配合使用。
2.类图(Class diagram):是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。它既用于应用程序的系统分类的一般概念建模,也用于详细建模,将模型转换成编程代码。类图也可用于数据建模
3.类之间的调用图:可以体现体现类与类之间的关系
2.理解(Comprehension):是要能对重要名词、概念之意义有所掌握,能转译、解释;
例如:名词、原理的解释, 能理解单元测试、效能分析工具是怎么帮助工作
要求:写出你如何掌握了几个名词、概念。
如果在作业中遇到新的名词概念,我一般是在网上的一些平台进行搜索,比如CSDN,博客园,哔哩哔哩等。对搜索的结果进行筛选学习,直到彻底理解。
3.应用(Application):是要能将所学到的知识概念、方法、步骤、原则通则等等应用到不同的情境中;
把原则应用到各种情境场景中,能开发各种类型的应用程序,和不同类型的人合作
要求:写出你怎么在不同场景中应用技能的
以我新学习的python为例,python可以应用的场景有很多
1. 数据分析:Python 的 pandas 和 numpy 库使得数据处理和分析变得非常方便。可以使用它们来处理大量的数据,进行统计分析,或者进行数据可视化。
2. 网络爬虫:Python 的 requests 和 BeautifulSoup 库可以用来抓取和解析网页内容。
3.机器学习:Python 的 scikit-learn 和 TensorFlow 库可以用来进行机器学习和深度学习。
4.Web 开发:Python 的 Django 和 Flask 库可以用来开发 Web 应用。
还有游戏开发、图形用户界面开发、科学计算、嵌入式系统等等。
4.分析(Analysis):是要将知识的某些讯息,所包含的成分、元素、关系、组织原理等等分解出来,重新加以组合,并厘清之间的关系;
能将用户需求分解为不同优先级,厘清功能之间的依赖关系
要求:对一个局部领域,写出你的分析
比如设计2048这个游戏,要实现的基本用户需求为
1. 游戏状态:游戏状态可以用一个4x4的矩阵来表示,其中每个元素代表一个方块的值。初始状态下,矩阵中的大部分元素都是0,表示空格,只有一两个元素是2或4。
2. 用户操作:用户可以进行上、下、左、右四个方向的滑动操作。滑动操作会导致方块向滑动方向移动,并且相同数字的方块会合并。
3. 游戏规则:每次用户操作后,所有的方块都会向操作方向靠拢,空位会被新的2或4填充。如果用户无法进行任何操作(即所有方向的滑动操作都无法改变游戏状态),则游戏结束。
4. 得分计算:每次合并方块,得分就会增加合并后的方块值。例如,两个值为2的方块合并后,得分会增加4。
此外还有提供退步功能;提供排行榜功能;提供计时功能等等一些扩展功能。
5.综合(Synthesis):是能将知识讯息的某些要素重新安排或合并为有组织的整体,或呈现其间的关系; 例如,用WBS 等方法把项目的目标细化,分配到人,能用燃尽图展现项目进度
要求:写出你在这方面的具体收获
1. 明确的目标和责任:通过WBS,可以将大的项目目标细化为更小、更具体的任务,并将这些任务具体分配给团队各个成员。这样可以确保每个人都明确自己的责任,知道他们需要完成什么。
2. 更好的进度跟踪:燃尽图可以清楚地显示项目的进度,可以看到团队已完成的任务和剩余的任务。这可以帮助了解项目是否按计划进行,如果有延误,或者发生意外,可以及时调整计划。
3. 提高团队的协作效率:当团队每个成员都清楚自己的任务和项目的整体进度时,团队的协作效率会提高。每个成员都可以看到他们的工作如何影响整个项目,这可以提高他们的动力和参与度。
6.评价(Evaluation):是要依照某规律和准则对讯息做评价或比较。例如,能够评价别的项目的软件工程的质量,能分析一些关于软件工程的说法是否有道理,能分析市面上流行软件的优劣并探究深层原因,能对自己项目进行回顾分析,并提出改进。
要求:选一个你感受较深的领域,说一下你的感受
我感受最深的是能够评价别的项目的软件工程的质量
评价其他项目的软件工程质量时,我会关注以下几个关键点:
1. 代码质量:代码是否易于理解和维护?是否遵循了一致的编码风格和最佳实践?是否有足够的注释和文档?
2. 测试:是否有充足的单元测试和集成测试?测试覆盖率如何?测试是否能有效地捕获错误和回归?
3. 架构和设计:软件的架构是否合理?是否易于扩展和修改?是否遵循了SOLID等设计原则?
4. 性能:软件的运行效率如何?是否有性能瓶颈或资源浪费?
5. 安全性:是否考虑了安全性?是否有防止常见安全威胁的措施?
6. 项目管理:是否使用了有效的项目管理工具和方法,如敏捷开发、燃尽图等?团队的协作效率如何?
然后通过评价其他项目的软件工程可以带来很多收获:
1. 学习新的技术和方法:通过评价其他项目,可以了解到新的编程语言、框架、工具和方法,可以增强自己的技能和知识。
2. 理解不同的设计和架构:每个项目都有其独特的设计和架构。通过评价其他项目,可以了解到不同的设计模式和架构风格,有助于在自己的项目中做出更好的设计决策。
3. 提高代码质量:通过评价其他项目的代码,可以了解到什么是好的代码,什么是不好的代码。有助于提高自己的编码技巧,写出更高质量的代码。
4. 提高项目管理能力:通过评价其他项目的管理方法,如敏捷开发、燃尽图等,可以了解到如何更有效地管理项目。这可以提高自己的项目管理能力。
五、属于我们的人月神话
写下属于自己的人月神话——结对或团队项目实践中的经验总结+实例/例证结合的分析
在结对编程中,体会到了要提前安排好时间、做好计划,否则会出现前期过于散漫,后期过于紧张的现象,导致做出的成果不尽人意。在结对编程刚开始时,没有意识到计划的重要性,都只是随意地找一些资料学习,直到时间过半时才意识到要来不及了,在导致最后在的时候匆忙赶工。
要系统学习知识,只了解零零散散的碎片知识会导致在实际操作的时候不停地出错,然后回头重新学习,反而更加浪费时间。
在团队项目中感受到了团队沟通的重要性。在alpha冲刺时前后端一开始是各做各的,没有及时沟通,最后合并对接的时候才发现各自的逻辑不同,需要大幅进行修改,增加了时间和精力的开销,降低了效率。
六、对团队的分析
分析一下自己所处的团队和团队协作经验。《构建之法》上说团队的发展有几个阶段,你的团队都经历过么,最后到达了“创造”阶段了么?(参考《构建之法》第17章 人、绩效和职业道德)
1. 形成阶段:这是团队建立的初期,成员们正在了解彼此,还在寻找自己在团队中的位置。
2. 磨合阶段:在这个阶段,团队成员开始对任务、角色和团队规则产生不同的看法,可能会出现冲突。
3. 规范阶段:在这个阶段,团队成员开始达成共识,明确各自的角色和任务,团队规则也开始稳定下来。
4. 执行阶段:在这个阶段,团队已经形成了稳定的工作模式,成员们可以有效地完成任务。
团结经历基本上与描述的差不多
七、证明学会了软件工程
回顾《构建之法》第一章概论P17中三个目标,检验自己是否做到这三点
在《构建之法》第一章概论P17中,提到了软件构建的三个目标:满足需求、控制复杂性和满足构建的经济性。
1. 满足需求:
我们对于用户需求进行深入的需求分析和需求管理,确保理解用户的真实需求。使用敏捷开发方法,以便快速响应需求变化。与用户保持紧密的沟通,以便及时获取反馈并调整方向。
2. 控制复杂性:
我们使用模块化和面向对象的设计,将大的问题分解为小的、可管理的部分。使用自动化工具,如静态代码分析工具,来帮助识别和减少复杂性。
3. 满足构建的经济性:
我们使用敏捷开发和持续集成/持续部署(CI/CD)流程,以便快速发现和修复问题,减少浪费。使用自动化测试,以减少手动测试的时间和成本。
八、建议
对下一届实践的建议,对于开学初的你,对于大一的你,对于开学初的我,你有什么想建议和告知的呢?对于后来人的期许。
对于即将开始大学生活的学弟学妹,以及对于开学初的我的建议:
1. 建立与保持良好的学习习惯:大学的学习方式可能与高中有所不同,需要更多的自主学习。同时也要保持高中的学习习惯,而不是到了大学就放开了,开始爽玩。
2. 学会自我管理:大学生活相比于高中,会有更多的自由和自主权。学会自我管理,包括时间管理、财务管理等,是非常重要的,不要月初山珍海味,月底荒野求生。
3. 保持开放和好奇心:大学是一个全新的环境,有很多新的知识和经验等待你去探索。保持开放和好奇心,不要害怕尝试新的事物。
4. 注意身体健康:保持良好的生活习惯,如定期运动、保证充足的睡眠等,是非常重要的。熬夜只有一次和无数次,如果熬夜再想调整正常作息就很难了。
5. 别忘了享受大学生活:大学不仅仅是学习,也是人生的一部分。别忘了享受大学生活,做一些你喜欢的事情。