提问回顾与个人总结
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2021春季软件工程(罗杰 任健) |
这个作业的要求在哪里 | 提问回顾与个人总结 |
我在这个课程的目标是 | 完整的体验一次软件开发,和同学合作做出一个有用户的软件项目;在开发过程中学习工程化方法;在体验中明确自己的想法与目标 |
这个作业在哪个具体方面帮助我实现目标 | 回顾课前的懵懂思考,总结课程中的种种经历,梳理自己在本课程中的得与失 |
个人提问博客 | 软工第二次阅读作业 |
一、问题回顾与解答
1. 单元测试谁来写?
单元测试必须由最熟悉代码的人(程序的作者)来写。
代码的作者最了解代码的目的、特点和实现的局限性。所以,写单元测试没有比作者更适合的人选了。
——2.1.2 好的单元测试的标准
单元测试确实由程序的作者来写是比较好的。
当时我认为程序作者在编写程序和构建单元测试时思路容易高度一致,从而导致不能够发现问题,达到单元测试的真正作用。但是经过真正的实践之后我发现,我当初的思考过于理想化,不够实际。
首先,程序编写时更加注重的是实现细节,如何去完成这个功能,而编写单元测试时更加注重的是能否得出正确结果,二者的重点不一致也就谈不上具体思路相似的问题;其次,只有熟悉这个程序,熟悉这个功能的人来编写单元测试才能够知道单元测试的边界是什么,具体范围应该是什么,只有清楚知晓这些问题的人,才能够进行较好的单元测试编写工作;最后,编写单元测试也是程序作者的再一次思考,为什么这组数据存在问题?为什么这组数据运行时间较长?从而重新审视当时的实现思路,进行程序的优化,以达到更好的性能。
2. 结对编程中角色互换
驾驶员和领航员不断轮换角色,不要连续工作超过一个小时,每工作一小时休息15分钟。领航员要控制时间。
——4.5.4 如何结对编程
频繁的轮换不会影响正常的程序编写的进行。
在结对过程中,需要的是两人的共同商量、思考和设计,所以两个人都应该对程序、对设计有着充分的了解和认知,并且能够编写功能代码。驾驶员主要进行编码和单元测试,而领航员主要进行审阅文档,设计测试用例等相关事项,但这只是两个身份的在同一时间段的不同侧重而已,相辅相成共同完成,而非结对中一人仅负责编码和单元测试,一人仅负责审阅文档。而且对于结对中的某一人而言,长时间进行编码工作是一种极大的体力和脑力消耗,如果不进行及时的身份交换和休息,那么带来的将会是极低的编写效率和漏洞百出的代码,一种灾难。虽然时间段不一定是一个小时,但是即使的更换身份,不仅能进行精力的恢复,更能及时的重审自己的编码思路,保证和设计一致。
3. 推动信息共享与沟通
第一个原则,就是所有信息都保留并公开,讨论要包括所有涉及的角色,决定要公开并告知所有人。当人,对牵涉到的技术机密、安全性等信息要采取必要的保护措施。
——7.2.1 推动信息共享与沟通、
信息保留并公开是很重要的一个环节。
信息,不仅包括最终的整理好的总结文档,更要包括开发过程中的开发文档。信息不止包括面对用户的总结,不止包括项目结束之后的总结文档,更应包括在开发过程中的不断所更新的文档。比如任务分配的issue信息,bug修改的issue信息,落实在人头上,既能够将任务细化分配到位,也能够作为一种问责的依据,依据过程中的分配信息来进行落实bug追责。同时不断更新的所有文档,也是一种思考的记录。保留下这些信息并公开,既能够便于队友之间需要交互的信息的及时理解,也能够有利于开发者回顾思考过程,再一次审视当时的思考是否到位。最终的用户文档和开发者文档进行共享很重要,记录了思考过程、任务具体分配的信息进行保留和公开也很重要。
4. 典型用户
我们宁可从小部分人出发,要非常明确地定义谁是我们的用户。
——10.1.3 怎样定义典型用户
这个问题在当初已经有了部分解答,过于钻字眼,导致对“小”这个词的理解过于局限。如何理解“小”就是回答这个问题的关键。此处的“小”应该是相对于市场上所有的软件用户而言。由于软件的应用定位决定了不太可能是市场全部的用户,因此着眼于真正对这款软件有需求的用户、对此软件功能有潜在需求的用户就是最重要的一点,也即相比于市场上所有的用户而言,真正可能使用这款软件的“小”部分用户是最重要,即典型用户。根据团队项目实践结果来看,最终使用我们软件的用户也符合我们最终所分析的典型用户人群。
5. 赢者通吃
这个游戏规定第一名得到全部的分数,第二名(不管多接近)到倒数第二名都是0分,最后一名还要倒扣分。软件行业就是一个赢者通吃的环境,最后一名还要把自己的身家倒贴进去。
——16.2 创新的时机
老实说,对于这个问题有了一定的理解,但是自我感觉,理解又不是很全面、很透彻。
就以课程的团队项目来说,很巧合的是,我们团队的题目有不止一只队伍在做。就最终结果来看,我们的团队项目题士的注册用户数,用户使用量,日活跃用户数据都远远超过隔壁队伍。从某种意义上来说,我们确实是吃到了这个需求领域的大部分分数,但是相比真正在这个领域中有需求的用户数据来看,仍然有存在很多用户使用其他的软件,包括自救题库、航概练习题库等。赢者能够得到绝大部分分数我能够理解,但是通吃是否过于绝对了?
二、新问题
在结对过程中,我们的是解题过程是两人在一起共同开始读题、解题、思考、设计,然后完成了结对作业。但是,在过程中,我总有一种感觉是其中一方的思路很容易受到思考灵活一方的思路影响,从而限制了另一方思考。因此,是否在两人独立思考设计之后在统一起来是否是一种更优解?但是感觉分别思考再统一是否又存在多余时间消耗的问题?
三、做中学
需求
需求分析可谓是至关重要。在此次团队项目实践中,所使用的方式NABCD分析。
在Need阶段,我们明确定位了我们软件所解决的需求是什么,与之匹配的该软件的功能应该有哪些。在Approach阶段,我们选定了前后端框架,选定了软件发布形式,此帮助了我们提早准备微信小程序的相关审核等工作,保证了软件的按时发布。在Benefit阶段,细化了软件的定位与功能,同时配合问卷调研的方式来调研和明确应实现功能,为后续的阶段设计提供导向。在Competitiors阶段,由于我们的题目不具有创新性,存在同类产品,因此,充分的相关产品调研,让我们明确了我们产品的优势所在,以便能在最终从众多产品中脱颖而出。在Delivery阶段,明确的宣发形式和渠道,指导了我们在宣发时刻的方向,不止于说在最紧迫的时候还不清楚宣发的方式,以导致产品败于宣传这一环节。
充分的需求分析,为后续产品设计、实现、发布等阶段,奠定了重要基础。
设计
我现如今仍记忆深刻,在团队初始线下开会讨论设计时,那几个凌晨两三点的北航夜(?)景。在最初的设计阶段,我们团队确实花费了大量的时间,设计了详细的UI、API和数据库,同时在实际实现中不断的进行更新和优化,已到达最好的设计。在经历初期的详实设计之后,不得不说,在后续的实现中,效率得到了极大的提高。
实现
实现时,我们团队使用的集中线下开发的模式,最直接的收获就是及时的沟通,消息更新的及时性。充分的沟通减少了很多问题的产生。同时在实现的过程中,应该充分调研使用语言的特性和操作的简洁性。在测试后期进行压力测试时,发现了很多操作和功能存在很大的冗余性和优化的可能。从而花费了一定的时间去优化和更新,而这些大部分可以在第一次实现的时候就优化掉。
测试
测试不仅仅只有单元测试,更有场景测试、性能测试和压力测试。充分且全面的测试是一个项目的高效、稳定的保障。单元测试一定要充分并且全面,只有足够全面的测试才能够确保程序运行的正确性和稳定性,同时也是对程序逻辑的又一次审视和检验。这样才不会导致在发布维护阶段,成天提心吊胆,以及面对一堆无止尽的bug issue。
发布
发布阶段,优美的宣传动画,精炼的宣传语,需要能够快速有效的抓住用户眼球,是为发布宣传的第一步。同时定向发布给有软件需求的用户,能够达到快速积累用户的效果,再经过用户之间的相互推广,从而进一步达到软件的宣传效果。
维护
维护阶段要及时的接受用户的反馈,并在能够进行稳定复现后,及时进行问题的记录和修复。同时对于用户的反馈也并非全盘全部接受,一定在充分实现、调研、复现的基础上来决定是否改进。
四、个人总结
个人项目
三次博客作业,第一次阅读作业,让我看到了大牛们的经历,和对于行业的思考。同时也让我好好的思考和总结,我的感受是怎样的,我的想法是怎样,我的规划是怎样的。人在前进的路上怕的漫无目的和随波逐流,及时的反思和思考,也是一件非常重要的事。第二次阅读作业,通过阅读《构建之法》,初步的对软件工程有了了解,通过提问的训练,强迫自己在阅读中思考,让自己真正的读有所获。第三次案例分析作业,调研的还是市面已有的比较成熟的软件,一部分让我对现有的市场有了更加严谨和审视的认识,同时也通过分析和对比,了解到软件该如何测评,以及对于自己开发软件时,应该注意什么。同时,客观上来说,也训练了自己的逻辑思考和写作能力。
结对编程
感谢队友lhx,让我们整体的结对编程体验都很不错。两个人线下面对面,从需求(指导书)分析到设计,从编码到最后的单元测试,都是及时讨论一起解决的。在分析和设计阶段,能够互相帮助理解需求,集思广益进行架构设计;在编码和单元测试阶段,能够及时纠正编码错误,增添对细节点上的测试等。也很幸运有一个优秀的队友,让这次结对体验更加完美。
同时也在结对过程中深刻的体会到了驾驶员与领航员两种身份,以及轮换体验。从实际开发体验上发现了自己最初的认识存在很大的误区,进行了纠正,加深了认识。
团队项目
首先,很感谢遇到了删库跑路对不队的所有队友,目标统一、足够优秀的队友、大家的齐心协力使我们最终开发出比较优秀的产品题士,也算是达到了我最初的一个目标:完整的体验一次软件开发,和同学合作做出一个有用户的软件项目
。完整的体验了项目的需求、设计、实现、测试、发布和维护的全部流程,让我对软件开发有了更进一步的认识和体验。在每个阶段的收获前文已有详细描述,此处不再赘述。在此项目中,我主要负责的是后端部分,新学习的编程语言nodejs,单元测试覆盖率从alpha阶段的80%提升到beta阶段的主要功能测试覆盖率95%,比较完善和规范的各种文档都是我在此阶段的最大收获。充分及时的团队交流,任务落实到每一个人,都是团队能够稳定合作以及前进的基础。“纸上得来终觉浅,绝知此事要躬行”,与实践中学习,将课堂上知识应用于实际实践中,才能更好的理解与掌握。
最后,再一次感谢删库跑路对不队的所有队友能够在繁重的其他学科学业压力下,仍然拿出大量的时间进行讨论开发,以高质量的完成题士这个项目!也感谢课程组在各个阶段的指导和付出,让我们有了更加良好的课程体验!