软工实践再见
软工实践再见
这个作业属于哪个课程 | 2021春软工实践|W班 (福州大学) |
---|---|
这个作业的要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 总结软件工程实践,明白自己学到了什么 |
其他参考文献 | 无 |
目录
第一部分:课程回顾与总结
回顾《构建之法》提问
-
给出以前提问题的博客链接
-
请尝试对自己曾经提出的问题进行解答,并阐明,是如何通过看书,实践,或者讨论弄清楚的。
-
是否原来的问题还不明白?
所有的问题都尝试解答了。
-
是否产生了新的问题?如果有,请提出。
没有。
-
在之前提出问题时,我已经尝试通过书本上的理论解答了这些问题,经过一个学期的实践以后,我将根据我的实践经验进一步谈谈对这些问题的理解。
软件进行扩大化/泛化的时机是什么时候,如何避免扩大化泛化?
- 根据本次团队项目的经验,在需求分析时,我们应该对用户的需求进行全面的分析,列出各种用户需要的功能。因为需求分析时可以暂时不考虑实现的细节,所以有一些功能在真正实现的时候,我们会根据时间、人力和技术的考量,决定不去实现它。
- 我认为需求分析时容易定下太大的目标,要避免扩大化泛化就应该在开发软件的时候结合实际制定哪些功能是必须要做、必须先做的,而不是一开始就想大包大揽地什么都做,而且要在开发过程中结合实际适时调整目标,否则可能会导致连基本功能都无法实现。软件进行扩大化/泛化的时机应该是先做好了基本功能、重要功能,再进行功能扩展,进行软件的扩大化和泛化,这样才是一个可以实现的顺序。如果软件的扩大化/泛化真的很容易,那以前的开发者应该也不难做到才对,事实就是软件在真正开发实现的过程中会遇到很多问题,这些是一开始决定做这个软件时难以预料到的。
代码复审有一个比较重要的目的就是找出代码的各种错误,那么代码复审对找出错误能起到多大的作用?
-
在软工实践之前,我认为代码复审可能没太大作用,还是做测试比较有用,但是现在我的想法发生了变化。在WordCount作业中,我有一个测试点没有通过,是因为助教添加了一条说明,但是我没注意到,所以编写的代码不符合那个条件。但是如果要修改这个bug,通过代码复审的方法很容易就能看出错误在哪里,而通过测试不一定能马上找到这个错误。
-
通过软件工程和软件测试课程的学习,我也懂得了代码复审的一个重要优点,就是能尽早地发现问题。通过学习理论知识,我知道在软件开发过程中,bug越早发现越好,因为越到后面修复bug的代价越大,所以能在评审阶段发现的问题,就不要留到动态测试阶段再发现了。
为了制定切合实际的计划,如何估计开发过程各个阶段所需的时间,从而做到更合理地安排任务和推进进度?
-
在软工实践中,我在各个作业中多次使用PSP表格估计了开发过程各个阶段所需的时间,结果总是估计得不太准,就算有时候估计的和实际的总时间没有差很多,其实单个阶段的估计还是不太准。然而估计开发各个阶段所需的时间是非常重要的,特别是在复杂的项目中。
-
我的看法是,将理论和实践经验结合,可以更合理地安排任务和推进进度。书上的理论“找出估计后面的假设、考虑团队自身的能力、参考前人的经验、使用快速原型法等等”对我们具有一定的指导作用,而我认为我们在个人作业以及团队作业中的时间估计还是更多地基于自己的经验、参考前人的经验。有的同学接触过一些技术,他们就可以较为准确估计出实现一些功能需要多长时间,也可以向掌握这些技术的同学请教他们当时实现这些功能所花的时间,这是很简单又有效的方法。同样的道理,在经历了这么多次软工实践任务以及估计开发时间过后,我们都学会了许多技术,并积累了估计时间的经验,虽然我第一次估计时间不准,但是我相信当以后的项目用到类似的技术时,我估计的时间能准确得多。在团队作业中也能反映这个道理,alpha冲刺时我们进行了计划安排,一开始大家都没觉得有什么问题,但是到最后两天做得非常赶,连续不停地写代码,而beta冲刺中因为我们有了上一次的经验,所以计划安排就合理多了,在截止日期之前没有再出现alpha阶段的猛冲情况。所以我认为,要想准确估计开发时间、制定切合实际的计划,应该注重提升个人的技术,积累开发经验。
为什么大部分成功的创新者都不是先行者?
- 先行者探索一个新的领域需要花费大量的精力和资源,而当他做出可行的产品以后,还没等他掌握先机,其他模仿者和追赶者付出比较小的代价就可以参考模仿先行者,做到和先行者差不多的水平,而且他们可以用节省下来的资源再对产品进行改进,从而超过先行者。
为什么领域外的创新者反而会比领域的专家更有创意?
- 做了软工实践的几个项目,我学到了许多技术,这些技术都是行业中的主流技术。如果我下一次再遇到类似的项目,我就会自然而然地想到用我掌握的技术去实现它,而不会想到说要去创新。而领域外的人没有这些知识储备,他们的一些想法反而可以提供一些新的思路。
请问你在项目的需求/设计/实现/测试/发布阶段(一共5个阶段)中,每个阶段收获最大的知识或能力是什么?
需求阶段
-
知识/能力:学会了获取需求的方法、用NABCD模型科学地分析需求
-
团队项目由我们自主选题,需求也是靠我们自己获取和分析的。
-
获取需求的方法:团队成员从用户的角度思考用户会有什么样的需求;给目标用户发放调查问卷,对调查结果进行统计分析;
-
科学使用NABCD模型:NABCD模型从各个角度分析了需求,可以帮助我们从需求、做法、好处、竞争、推广这几个方面全面地考虑需求,从而使我们对需求的认识更加深刻,更好地分析需求的可行性和竞争力,这也是需求评审的重要依据。
-
设计阶段
- 知识/能力:学会了把需求转换为具体的功能、考虑用户体验,对界面和功能进行排版
- 我在项目中负责前端,主要参与了原型设计的讨论,把需求转换成具体的功能和界面是设计的重要工作,也是前端工作开展的第一步。在设计界面时,我们需要充分地理解需求,才可以做到完整地设计出功能,而且界面不是功能的简单堆砌,还需要考虑到用户的使用体验,设计的界面要具有易用性。
实现阶段
-
知识/能力:学习新技术的能力、debug能力、前后端沟通能力、Web前端编写、微信小程序编写
-
学习新技术的能力:实现阶段中,很重要的一步就是我们需要上网查找资料,找到需要学习的新技术的教程,并进行学习与运用。找到一个好的教程可以使学习事半功倍,有官方文档可以直接看官方文档;在b站上也有很多不错的教学视频,特别是黑马程序员出品的;前面两项都没有符合要求的教程的话,我就会选择看博客。
-
debug能力:写代码总是会出错的,找bug的过程很能锻炼我的逻辑思考能力和耐心。
-
前后端沟通能力:在前后端交互的编写中,大家普遍都出现了不少接口上的问题,这就需要前端和后端进行很多的沟通,一起讨论,一起找出bug。
-
测试阶段
- 知识/能力:找bug能力、描述bug能力
- 项目中我主要在小程序端和web前端进行黑盒测试,找到bug以后对bug进行清晰的描述,发到团队群里告诉大家,大家就可以有针对性地修复bug。
发布阶段
- 知识/能力:分析用户反馈
- 发布应用之后,我们小组让用户体验完小程序之后填写调查问卷,填写一些使用反馈,通过统计分析用户的反馈,我们可以知道我们的应用有哪些优点和不足,做出反省与改进。
结合自己在个人项目/结对编程/团队项目的经历,谈谈自己的理解或心得。
个人项目
- WordCount项目中,我完成了WordCount词频统计程序的开发,学会了单元测试。WordCount项目的基本功能实现不难,对词频统计有一些困惑也可以在网上找到思路,重点还是在于理解需求以及合理划分功能模块。这次作业使我体会到理解需求的重要性,因为我没看见助教补充说明的一条关于空白字符是什么的要求,导致我被扣了20分,这是一个让我印象深刻的经验教训。当时刚刚在构建之法中学到了单元测试,还不是很理解,我在这次作业中编写了单元测试以后,终于懂得了单元测试是什么,也让我体会到了实践对掌握知识的帮助。
结对编程
-
结对编程也体现了软件工程课程“做中学”的特点,我也是在体验了真实的结对编程之后才对书中的结对编程知识有了更清晰的理解。在结对编程中,我体会到了好队友的重要性,合作与沟通在结对中很重要,在可以选择的情况下应该用心地选择一个善于合作、好沟通、技术匹配的队友。
-
在实现环节,我使用HTML+CSS+Javascript+vue.js+axios技术实现了Web前端网页。我体会到了项目经历的重要性,有的理论知识学过之后看起来好像会了,但是真正做的时候会出各种各样的问题。有的项目虽然看起来没有比课程作业复杂多少,但是有真正做过一个完整的项目的同学就是会比没做过项目的同学掌握更加扎实的技术,并且确保学过的知识在需要用的时候真的可以用上。对于完成项目来说,只学会技术的理论是不够的,需要真的做过一遍并且解决过一遍问题才算是掌握了一门技术。
团队项目
-
我所参与的团队项目是Fidle福大校园互助平台,负责编写小程序前端以及后台web前端。在项目中,我学习了不少的新技术,也熟悉了github的使用,懂得了前后端交互的重要性和测试的重要性。
-
本次的团队项目是一个历时4个月的完整的项目,包含了选题、需求分析、原型设计、系统设计、数据库设计、编码实现、测试、发布这几个阶段,让我体验了开发一个软件需要经历的过程,这也使我在今后看到软件工程的理论时能联系到实际,更好地理解书上抽象的概念。同时,这次项目经历丰富了我掌握的技术以及开发经验,对我将来的升学和工作都打下了一定的基础。
-
最后要感谢一起努力了一个学期的队友们,大家积极讨论,热心地互相帮助,认真做好自己的工作,才有了我们团队的成绩,感谢遇见“那你能帮帮我吗”团队的大家。
第二部分:个人技术总结
微信小程序授权登录(前端部分)
概述:微信小程序一般都需要用户微信登录,本篇总结提供了编写授权登录的步骤以及前端的具体写法。