软件工程个人作业-提问回顾与个人总结

软件工程个人作业-提问回顾与个人总结

项目 内容
这个作业属于哪个课程 2023 年北航软件工程
这个作业的要求在哪里 个人作业-提问回顾与个人总结
我在这个课程的目标是 学习软件工程
这个作业在哪个具体方面帮助我实现目标 总结学期收获

一、提问回顾

问题1:当结对二人水平有一定差距时结对编程是否不如水平较高者单独编程?

第三章结对编程和二人合作

原文:“在结对编程中,任何一段代码都至少被两双眼睛看过,两个脑袋思考过。代码被不断地复审,这样可以避免牛仔式的编程。同时,结对编程避免了“我的代码”还是“他的代码”的问题,使得代码的责任不属于某个人,而是属于两个人,进而属于整个团队,这样能够帮助建立集体拥有代码的意识,在一定程度上避免了个人英雄主义。”

结对编程的过程也是一个互相督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。由于这种督促的压力,使得程序员更认真地工作。结对编程“迫使”程序员必须频繁地交流,而且要提高自己的技术能力以免被别人小看。

如果结对两人中某一人的水平比另一人差很多,他是否会因为自卑而在自己编程的时候因为压力过大而束手束脚,并且因为代码的责任不只属于他,那他是否会滥竽充数,在作驾驶员时出工不出力,作领航员时随意监督,导致相同工作时间的产出不如另一人单独编程高。

问题回答

在本学期的结对过程中我与队友的水平相当,并没有遇到当时阅读时提出的问题,也收获了一段还不错的合作体验。根据周围同学的感受以及其他合作经历,我觉得这主要还是取决于个人心态的,有的人跟比自己水平高的同学合作时选择摆烂,但也有很多同学会认真的从高水平同学身上学习,共同进步。

问题2:如何选择团队模式与团队开发模式?

第四章团队和流程

在这一章中提到了非常多种的团队模式和团队开发模式。例如团队模式有功能开发模式和官僚模式,面对不同需求的项目不同团队模式的团队开发效率肯定也是不一样的,那我们该怎么样去判断应该才需什么样得团队模式与团队开发模式呢。

问题回答

我们这次软工合作中采用的团队模式比较接近功能团队模式,团队成员擅长的方向各不相同,负责项目不同功能的开发。我觉得如何选取是与这个开发任务的场景与团队成员擅长模式一同决定的。

问题3:如何在团队中选拔出PM,如何培养PM?

第五章团队中的角色与合作

原文:“在一个项目中, PM 的具体任务是什么呢?

带领团队形成团队的目标/远景, 把抽象的目标转化为可执行的, 具体的, 优美的设计。

管理软件的具体功能的生命周期 (需求/设想/设计/实现/测试/修改/发布/升级/迁移/淘汰)。

创建并维护软件的功能说明书 (specification), 让它成为开发/测试的及时准确的指导, 而不是障碍。

代表客户和用户的利益, 主动收集用户反馈, 预期用户新的需求。 协调并决定各种需求的优先级。

分析并带领其他成员形成对缺陷/变更需求的一致意见, 并确保实施。

带领其他成员确保项目保持 功能/时间/资源 的合理平衡, 跟踪项目进展, 确保团队发布让客户满意的软件。

收集团队项目管理和软件工程的各种数据, 客观地分析项目实施过程中的优缺点, 推动项目成员持续改进, 从而提振士气。”

PM负责非常多的任务,也需要很多维度的能力,在临时组成的一个团队中,怎么样才能找出适合做这个职位的人呢,在职业规划中,那些希望先做几年开发进而转管理岗的人又应该如何培养自己来达到PM的能力要求呢

问题回答

这次团队开发合作我们团队选择了lzh同学作为我们的PM,她也在这次团队开发中起到了很好的领导的作用,带领我们完成了项目开发。根据她的工作情况,我深切感受到PM工作的不易与重要性。我认为,要成为一个优秀的PM,要具备多种能力,是一个挑战性与综合性非常强的职业。首先,PM要具备很好的领导能力,能引领团队的方向,与团队成员充分沟通,合理分工,使团队成员各尽其职。PM需要具备多方面的专业知识,尽可能的了解掌握团队成员所使用的技术栈,并了解相互之间如何交互合作。除此之外,还需要良好的人际交往能力,能与用户保持良好的沟通,了解用户需求并反映到开发工作中。这需要在团队中选取一个综合型人才来担任这个职务。

问题4:不同的用户调研方式有着不同的优点与缺点,我们如何选择调研方式组合能较充分且高效率的了解用户的真实需求?

第六章用户调研

1) 焦点小组 (Focus Group)
    找到一群目标用户的代表来讨论用户想要什么, 用户对软件的评价等等。 焦点小组是很常用的调研方法,它也有一些弱点:
    一群人在一起,往往大家会出于讨好其他人的心理来发表意见,避免不一致的意见或冲突。
    讨论者对于他们不熟悉的事物 (例如颠覆式的创新) 不能表达有价值的想法 - 在汽车出现之前, 我们找一帮马车夫来畅想 “未来的交通工具”, 他们未必会贡献很有价值的想法。
    讨论的人群容易受到主持人有意或无意的影响。
    研究者往往从不同意见中挑选最符合自己想法的哪些,然后号称这就是大家的共识。
2) 深入面谈 (in-depth interview)
    通过详细的面谈,广泛而深入地了解用户的背景,心理,需求等。这通常是一对一的采访。这个方法好是好, 就是费人费时。
3) 卡片分类 (Card Sorting)
    列出所希望的软件有什么样的特点, 然后把这些特点归类。在微软亚洲研究院的时候,我们也曾做过“卡片排序” - 几个不同背景的人聚在一起, 想象新软件有什么特点, 能解决自己的什么痛苦, 或者有什么好玩的地方, 把这些特点都写在小卡片上, 一个主持人再把不同的卡片归类, 讨论, 进一步理清各种愿望的关系。 从某种意义上来说, 这些卡片就是量化了的焦点小组的意见,这些卡片经过归类/排序/定义等过程, 可以帮助我们更好地定义一个软件的信息架构,用户的工作流程,软件菜单结构,网站的浏览路径,各种内容的层次关系等。
4) 用户调查问卷 (User Survey)
    给用户事先规定好的问题, 让用户回答。 我们在大街上碰到过不少,有时候你在浏览某个网站的时候,一个弹窗打断了你的思路,它请你回答几个问题。我们用户在回答这类问题的时候,是否心不在焉,乱点一气? 
......

在这一章中介绍了很多不同的调研方法以及它们的优缺点,既然每种方法都有着明显的优缺点,那么只用单一的一种方法能了解到的用户需求肯定是比较片面的,那我们怎样才能高效率的通过组合不同的用户调研方式来了解用户真实需求呢?

问题回答

本次团队开发中,在项目提出阶段,我们选择了问卷调查与采访等方式进行用户调研,在alpha阶段与beta阶段中我们选择了采访与用户测试群反馈等方式来了解用户需求。这些方式都很有效,但最重要的是这些调研得面向目标用户,这要得到的数据与结论才比较可靠,效率也更高。

问题5:当团队中两人负责的功能模块差别很大时,如何评定绩效?

第十章绩效管理

在这一章中提到的有工作量、工作的影响力、工作的不可替代性、效率、犯错率等评估指标。但当两人负责的工作差别很大,并且需要学习成本时,对于大相径庭的两个工作,如何评价出贡献度的多少,更进一步,假如整个团队都是这种情况,那应该如何规范奖惩机制呢。

问题回答

我们这次采用了团队成员评分制的方式来进行绩效评定,通过自评与互评来决定最终绩效成绩,根据开发过程中的体会来决定贡献度,这样也模糊了因为工作完全不同导致不好比较数据的问题。

二、知识点

需求阶段

需求阶段我们在选题讨论中学习到了如何去挖掘现实生活与创新技术结合中存在的需求,如何去提出一个真正被用户需要的选题。在用户需求分析阶段我们又学习了如何通过问卷调研与采访等方式去明确自己的选题是否真的被用户需要,去细化用户需求,让我们的项目成为真正能契合用户需求的项目。

设计阶段

设计阶段我们学习了如何进行软件架构设计,学会了用画图软件化软件架构设计图。作为后端开发者,我还学会了如何设计数据模型,学会了画E-R图并将E-R图转换为django模型。

实现阶段

作为后端开发者,实现阶段我第一次使用了服务器,学习了在服务器上开发与部署,CI/CD配置等。还学习了如何使用用户鉴权等方式提高系统安全性。

测试阶段

测试阶段我学习了使用django的单元测试框架编写单元测试验证软件正确性,使用Jmeter压力测试去测试软件性能。

发布阶段

发布阶段我学习了如何进行项目宣传,吸引更多用户来使用我们的项目。

维护阶段

在维护阶段我学习了如何与用户进行沟通,为用户解决bug,如何采纳用户建议去将更多有用的功能,对我们的项目进行迭代开发。

三、心得体会

软件工程课程真的是特别有挑战性的一门课,从开始每周一次的个人作业,到结对编程,再到团队项目开发,每个阶段都有不同的挑战。但回顾整个过程,也能发现正是这些挑战,让我的得到巨大的成长。

个人作业

在个人作业中,最让我印象深刻的是软件调研的那一次。当时我选择了音乐软件来进行软件调研。我第一次从用户与开发者两个方面一同审视平时天天使用的音乐软件。我们将自己放在开发者的身份去分析用户需求,通过采访与调研去了解用户需求,作为开发者如何将这些让产品解决这些需求。并且,最有意思的一个要求就是让我们去寻找这些软件的bug。当时本以为是不可能完成的任务,因为这些软件都是非常成熟的团队经过大量打磨时候发布的。但没想到通过努力还真的找到了这些软件的一些问题,也非常的又成就感。这让我明白了软件测试的重要性,哪怕是能力非常强的专业团队开发的软件都有问题,我们自己的项目更是如此,更应该在测试上多花功夫。

结对编程

结对编程阶段,是我第一次使用c++进行团队项目合作,也是非常有挑战的体验。这次作业不仅仅是单纯的考虑程序的性能。而时要学习如何将软件解耦,使计算核心与输入输出、图形界面等分离,实现功能模组的互用与互换。这个模块互换阶段也让我更深刻体会到了软件解耦的好处,只需要交换计算核心的dll文件,不需要更改任何的代码,就可以换用其他人写的程序了,这也意味着出了问题也只需要聚焦于计算核心就可以实现bug修复了,使开发效率有明显提升。除此之外,我们也体验了敏捷开发,一个人看一个人写代码,这是非常新鲜的体验,开发中实时了解队友的思路,也降低了沟通成本与错误发生率。

团队项目开发

团队项目开发阶段,这个阶段我们组成了7个人的大团队,从选题开始,经过了需求调研与分析,软件架构设计,实际开发,测试,宣传与发布,维护,迭代开发的整个流程,让我们体验到了如何一个软件项目是如何从思维的碰撞到最终落地成为服务于用户的产品的过程。这个项目不仅仅是一个作业任务,更是我们团队面向用户需求,结合chatgpt等新兴技术开发的作品。最终成果落地非常的有成就感,也非常感谢每个团队成员的努力。在这个过程中我对实际工作的团队协作与面向用户需求的开发的理解更为深刻了。

总而言之,经过这门课的锻炼,我从多方面提升了自己,感到受益匪浅。这是一段非常宝贵的经历,我学到了很多,也与非常好的队友们度过了一段充实且有意义的时光。

posted @ 2023-06-17 23:47  silhouette-  阅读(8)  评论(0编辑  收藏  举报