这个作业属于哪个课程 | 软件工程实践2022年春-F班 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 课程回顾与总结、个人技术总结 |
其他参考文献 | 《构建之法》 |
目录
第一部分 课程回顾与总结
一、回顾问题并解答
1.原提问博客链接
2.旧题新答
①问题1
问:在团队项目中,个人应该如何选择或者接受团队的工作分配?
旧答: 我认为个人在团队项目中应以集体利益为主,应尽量选择自己擅长的领域的工作,即便是团队分配的任务也要思考自己是否能及时和较好地完成,如果不能达到要求的话,要及时提出问题,更换工作或是减轻工作量,而不是为了自己挑战心理和好奇心理去接受自己不能完成的工作,这样最后导致的结果可能就是项目不能及时完成和团队对自己的信任下降。如果只是想要提升自己的技术,我认为应该是在自己的个人项目中去提升,而不是在团队项目中,这样虽然可能会得到技术的提升,但最后可能会拖慢团队项目的进程甚至完不成。
新答: (补充旧答)我的回答还是应以集体利益为主,个人利益放在集体利益之后,尽量选择自己擅长的,但我要补充一点就是如果在项目的开发时间较为充裕的话,是可以向团队申请要求一些更加难的工作(但最好不要超出自己力所能及的范围之外)来提高自己技术。
②问题2
问:学生与职业程序员的区别?
旧答: 我认为学生和职业程序员的区别主要有很三个。
1. 代码技术水平不同。任何一个职业程序员的代码水平毫无疑问都比大部分学生的代码水平高,除此之外,职业程序员的代码水平还广,他们所学习的代码技术必然是比学生多的,他们所接触的技术不仅多而且新,学生所接触的技术往往少而且是旧的,有些甚至已经被淘汰。
2.经验不同。学生在学习期间所开发的项目是很少的,而且所能接触到的项目大部分都是代码量较少并且主要是以学习为主的项目,而职业程序员所开发的项目不仅数量多而且项目规模也大,而且主要是以商业用途为主。
3.开发时侧重点不同。职业程序员在开发程序时往往构建项目方案和测试花费时长比学生多得多,他们更注重程序最后是否能完美地运行,能否完成用户的所有要求,因为他们最后要面对是客户,而学生没有这部分烦恼,往往项目一到手毫无计划,想到哪里就写到哪里,对于最后的测试也只是随意的测试几个数据罢了。
新答: (旧答的补充)我要补充两点
4. 心态的不同,学生在开发的时候往往是作为一项作业上交,有时候可以加一些自己喜欢的要素或是各种新学到的技术,是抱着一种学习的态度,而职业程序员在开发的时候是有规定的,不能乱加东西,一定要根据客户的要求,是抱着一种完成任务的态度。
5. 任务的紧迫程度不同,学生在开发的时候截止时间往往非常的长,学生可以边学边做,而职业程序员就不同了,他们往往项目一到手就要开工,因为他们的截止时间非常赶,时间就是金钱,所以我们经常听到程序员加班熬夜的。(而在本次软件工程中我深刻体会到了DDL的恐怖)
③问题3
问:对于一名工程师而言,究竟应该是更”专“一点好,还是更”广“一点好呢?
旧答: 我认为“专”和“广”都要,只“专”或只“广”都是不行的,因为对于一个软件工程师来讲,每个人的工作都是不同的,有底层的,有前端的,有后端的,对于每种方面的工作来说,技术水平要求的侧重点都是不同,例如底层开发,因为所接触的基本都是c语言之类的语言,技术的更新迭代较慢,我认为要“专”一点,对于自己工作所使用的技术要更加深入研究和掌握。而对于前端的开发,技术的更新是很快的,各种框架、库、自动化工具层出不穷,我认为要“广”一点,多去学习新技术,对于各种技术都要有一定的认识。随时都有可能要使用新技术,所以我认为对于一名工程师而言,“专”和“广”要相对而言。
新答: (补充回答)在旧答的基础上,我的新理解是要先做到“专”,再做到“广”,而这个“广”并不是要真的广,而是要先在自己擅长的领域做到“专”,然后以此为基础向外拓展,学习新技术,做到深“专”浅“广”。
④问题4
问:工作时是否应该带着个人、感情驱动的因素?
旧答: 我认为从理性工作的角度来说,一个成熟的团队成员必须从事实和数据出发,按照流程,理性地工作,不需要灵感和激情,只需要坚持工作,最终会有所成就,但是从个人角度上来说,如果对于工作毫无感情,那么工作的动力就会下降,最终导致工作效率降低,没有灵感和激情,在工作中就会遇到很多问题,而往往灵感和激情会是我们解决问题的关键,机器地工作最后只会使我们麻木,所以我认为感情在工作中并不是多余的,反而还有其存在的必要。
新答: (旧答补充)个人、感情驱动的因素就算你想屏蔽,其实也无法屏蔽,而我们能做的就是开导自己的情感,尽可能让自己的感情是对工作有利的,而不是影响自己的工作。
⑤问题5
问:软件的行为和用户的期望值不一样,就一定是 Bug 吗?
旧答: 我认为不一定是bug。要从不同的角度来看待这个问题,从用户的角度来说,用户最终使用的软件和用户的期望不同,没有自己认为的功能或不是自己想要的功能,用户自然就会认为这是开发者的问题,是开发者没有达到自己的要求,所以会认为这就是bug。但是我们从软件本身的角度来看,软件的运行和用户的期望的不同,可能是开发时和用户的沟通有误,也有可能是运行环境的问题,软件本身来说并没有什么问题,所以从软件本身的角度来说,这并不是bug,而是和用户的沟通有误导致开发的软件与用户期望不匹配。
新答: (旧答补充)有时候就算软件本身完成了用户所有的要求,但在使用体验上,用户感觉不好,他们也会认为这是软件的问题,是bug,但对于程序员而言这并不是bug。
3.新问题
①怎样延长一个软件应用的寿命?
②在面对截止期限快到的问题时,是缩减功能的开发和减少开发时间,还是向客户说明,延长开发时间?
二、“做中学” (五个阶段的收获)
请问你在项目的需求/设计/测试/发布阶段(一共5个阶段)中,每个阶段收获最大的知识或能力是什么
-
需求阶段
需求分析是一个项目的开始阶段,是软件工程中的一个关键过程。
我在需求分析阶段获得的最大的知识就是明白了需求分析的重要性,以及如何使用NABCD模型来进行需求分析,还学会部分原型工具的使用,例如Axure和墨刀(主要是用Axure)。 -
设计阶段
设计阶段我主要分为两个部分。
1. 界面设计,在界面设计上,我学会了使用Axure和墨刀这样的原型设计工具。
2. 系统体系结构设计,在这个方面,我学会如何将一个项目进行大致的划分,以及具体划分的每个部分该怎样去实现。 -
实现阶段
我在设计模式阶段的主要任务是后端的编写,主要是JAVAEE的技术,例如mybatis和springboot等。我在这个阶段中学到的最大的知识就是开发的时候一定要尽可能的遵守软件面向对象的设计原则,比如开闭原则之类的,这对后期的维护和开发都有很多好处。 -
测试阶段
测试阶段,主要学会了测试的具体的流程,先是在单元测试阶段和集成测试学会了如何使用Junit,其次在压力测试阶段学会了如何使用Jmeter来进行接口的压力测试以及使用postman接口测试工具,最后就是系统测试。
在整个测试阶段,给我带来的最大的知识就是测试的重要性不亚于实现,或者说测试和实现开发所花费的时间比例甚至是1:1,测试不仅能测出代码中的bug,更能审核整个项目所实现的功能是否与设计阶段的相同。 -
发布阶段
发布阶段主要学习了如何在gitcode上打包发布release版本,以及将项目部署到云服务器上。在本次发布阶段,关于云服务器的操作学了很多,如何远程操控数据库,如何远程部署java项目之类的。
三、个人心得
- 个人项目
在个人项目作业中,我是用C++语言来完成的。在性能优化和单元测试方面,在我整个实践中是花时间最长的模块,性能优化让我学习到很多知识,例如如何优化IO输出输入。在优化过程中还借助了操作系统的知识,对空间换时间有了进一步的理解(虽然只在输出时用到)。
在json数据的解析和使用上,我学会了jsoncpp和rapidjson,也明白了不能因为偷懒图方便,就用老版本的第三方库,jsoncpp老版本的使用非常简便,但是存在内存泄漏的问题(电脑差点挂了),后面直接换成了rapidjson。 - 结对编程
在结对编程中,我是用纯前端完成的。在这个过程中,我感受最深的就是git的使用,因为之前是都是单人的项目,不需要和他人一起共同管理一个项目,而这次的作业中,我体会到了git的方便,以前共同开发的时候都是通过压缩包等形式将自己的修改分享给同伴,而现在可以直接使用几条git指令就可以了。还有就是和队友的合作,让我知道了合作的时候一定要先将所有的问题讨论并解决,不能等到都做完了最后发现问题只能不了了之。 - 团队项目
团队项目中,我的职责是组长和负责后端开发。
组长这个职位,让我在这个团队项目中学会了(应该)如何统筹规划整个项目的安排以及如何进行分工,我也体会到了做组长的不容易,对于每个组员的意见和建议,我都较好的听取了,但感觉还是做不到完美。也非常感谢我的小组成员们在这次团队项目的付出。
我负责的后端开发,主要使用springboot和mybatis进行的,之前从未有所接触(JAVAEE课上有,但那时候还没学到),都是靠百度和b站的教学视频自学的,可能在某些使用的过程中有些不规范。
四、对七大课程目标的掌握程度,并作出相应解释
目标 | 评分 | 解释 |
---|---|---|
目标1: 理解软件工程师的职业道德规范和实践要求,了解国情社情民情,理解软件产品对社会、健康文化等影响,树立积极向上的软件开发理念。 | 95 | 在整个软件工程实践的课程中,我一直都在努力树立积极向上的软件开发理念,绝对没有做病毒、黑客等行为。 |
目标2: 掌握需求分析的全过程,能辨别客户表述的多样化要求,熟练使用需求表达工具,能够规范、准确地表达客户的需求,构建需求分析模型。 | 85 | 对于需求的分析可能没能做到完美,有时会没察觉到一些较为关键但比较隐蔽的需求 |
目标3: 掌握软件开发的全过程,遵循体系结构设计方法和基本设计原则,通过正式的技术评审,完成从体系结构设计模型、数据设计模型和构件级设计模型,形成面向高效可靠的服务组件设计方案或软件系统设计方案。 | 88 | 因为我是作为小组的组长,整个软件开发的过程都要通过我的检查,所以在这方面我感觉我掌握的还行 |
目标4: 能够执行从组件到软件系统的技术评测,具备设计模型的评判能力,具有创新设计意识,能够优选设计方案。 | 85 | 技术测评能力是有的,但创新设计意识不够,大多数的时候都是和团队成员一起思考的设计 |
目标5: 遵循软件开发各阶段文档标准,采用规范的表达,掌握需求规格说明书、系统设计说明书、系统测试报告等文档撰写方法,具备与业界同行交流能力。 | 85 | 我们的各种文档在书写的过程中都有去参考网上的材料,撰写的时候都有经过深思熟虑 |
目标6: 具有良好的团队意识和合作技能,能够与其他成员开展有效的沟通和协作;能够组织、协调或指挥团队开展工作。 | 88 | 在这方面,我身为组长,经常有和其他组员进行交流,并根据他们的工作的进度和能力进行下一部分计划安排 |
目标7: 能够辨别具体软件项目管理中涉及的构成要素,掌握软件规模和工作量的估算方法,能够选择合适的工具规划软件进度并对项目管理过程进行配置,具备初步的管理复杂软件工程项目的能力。 | 80 | 我们主要是通过会议来确定工作量以及使用git来进行项目管理,但由于项目经验不足,在管理的过程中经常会出现一些问题。 |
第二部分 个人技术总结
一、学习路线总结
学习路线图(粉红色为完成,绿色为未完成部分)
在本次软件工程实践中,因为对时间的把握不够精确,浪费了很多的时间,所以原先计划学习的vue框架和Linux都没怎么学,但好在团队项目中,负责的是后端接口,学习了Springboot和mybatis,也算是一个弥补吧。
二、团队开发中是否担任了开发角色,你在开发中解决了哪些技术问题
团队开发中主要担任后端开发角色,在开发中解决技术问题有
- 接口数据格式自定义返回
- Md5数据加密
- 项目部署服务器
- 远程操控数据库(Navicat)
三、获得了哪些技术进展
- Springboot的使用
- MyBatis对数据库的增删查改,注解开发
- 单元测试Junit等工具的使用
四、个人技术博客
擅长的技术:Springboot+Mybatis
博客链接:Springboot+Mybatis接口快速上手