pair work结对编程(张艺 杨伊)

一.结对编程人员:

   张艺(学号后三位:185) 杨伊(学号后三位:151)

二.这是我们工作的样子:(图片)

三.结对编程优缺点:

    优点:

    1.结对编程时间紧密,在一定程度上可以督促双方学习,提高效率。

   2.Coder在coding过程中会遇到一些细小的问题,而reviewer可以及时指出错误,并给予解决方案进行讨论。

   3.遇到问题时,两个人一起讨论,并补充对方没有想到的地方,是完善程序最好的方式。

   缺点:

   在编程过程中,很长时间是coder在coding的过程中想思路,大概这也是每个程序员的特点,而这个时候reviewer就会长时间遇到空档期。

四.组员各自的优缺点:

      1.张艺:编程能力强,思路清晰,实践能力强。但是特别容易被动漫带跑。

   2.杨伊:学习态度不错,有耐心,较专心。动手能力弱。

五.说明怎样利用好的设计方法:

    1.Information Hiding:信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。软件业对这个原则的认同也是最近十年的事情。
        以下列举了一些信息隐藏原则的应用。
        (1) 多层设计中的层与层之间加入接口层;
        (2) 所有类与类之间都通过接口类访问; 
        (3) 类的所有数据成员都是private,所有访问都是通过访问函数实现的;

     信息隐藏机制在本次编程作业中是十分有必要的,乘客乘坐电梯只需知道电梯外按钮代表的含义即可,而电梯的运行机制是没有必要让乘客知道的。而程序中体现这一点的是使用private关键字实现类的封装。

       2.Interface Design:
口的有七个特性,分别是:稳定性,易用性,规范性,可移植性,鲁棒性,安全性和兼容性.而稳定性和易用性是设计接口时最基本的特性,接口必须相对稳定,否
则将导致接口的使用者和提供者为了适应新接口而不断修改接口的实现,可能重复进行无用功,严重时影响整个软件开发进度。

       3.Loose Coupling:耦合性是指组件(函数)之间相互依赖的程度,而松耦合是指功能函数之间,尽量依赖程度不要太高。否则,修改完一个底层函数后,会对多个上层函数,进行大量的测试。

六.Design by Contract:契约式设计要求软件设计者为软件组件定义正式的,精确的并且可验证的接口,这样,为传统的抽象数据类型又增加了先验条件、后验条件和不变式。这种方法的名字里用到的“契约”,或者说“契约”是一种比喻,因为它和商业契约的情况有点类似。契约式设计的核心思想是对软件系统中的元素之间相互合作以及“责任”与“义务”的比喻。这种比喻从商业活动中“客户”与“供应商”达成“契约”而得来。

七.Unit Test:

以下是我们针对Scheduler类编写的单元测试(部分截图),从截图的右边可以看到所有方法均通过了测试:

以下是单元测试的代码覆盖率:

可见单元测试对整个程序的覆盖率是较低的,但由于我们是针对Scheduler类做的测试,因此我们点开Scheduler.dll,看看单元测试对该类的覆盖情况:

可见覆盖率达到了80%以上。

八.UML图:(VS生成)

九.算法关键以及独到之处:(源代码)

该算法的实现有一个前提,即乘客较为机智,在进入电梯时不会进入无法到达自己目标的电梯。
实现算法前需要为每一个电梯设置一个任务列表,为调度器设置一个总任务列表。API中将请求分为DirectionReq和DestinationReq两种,下文分别以方向请求和目的地请求简称。
算法实现如下:
调度器:
1.为符合条件(请求时间与当前时间一致)的方向请求生成请求,并将其加入调度器的任务列表。
2.每个tick调度器进行调度,分为以下两步完成:
 (1).为方向请求安排电梯。选择可达请求源楼层且距离源楼层最近且方向顺路或停机且没有被乘客拒绝过的电梯,将该请求入该电梯的任务列表。在调度器的任务列表中将该请求标记为已分配。
 (2).根据电梯的运行方向对每个电梯的任务列表进行排序,若上行则从小到大,下行则从大到小。删除目标层为本层的请求。检查电梯的任务表,如为空说明电梯目前已无任务,设置电梯为停机状态。否则,设置电梯的历史方向,并将任务表中第一个任务的目标楼层作为下一次电梯停靠位置。

乘客的选择策略:
1.乘客因两种可能原因导致无法进入电梯:
 (1).超重或超过人数。若如此,通知调度器重新激活任务列表中的该任务,使其可被重新安排。
 (2).电梯无法到达乘客指定楼层。若如此,将该电梯加入乘客的拒绝列表重新激活任务列表中的该任务,使其可被重新安排。
2.乘客若进入电梯,则该电梯一定可将乘客送达;将调度器中的该请求删除之。
3.乘客离开电梯与原API相同,不做改变。

算法独到之处在于考虑到了顺路策略,以及在安排电梯时尽量调度离乘客近的电梯。如果该电梯不能将乘客运载到乘客想要到的目的地,则对于该请求,这个电梯是被拒绝的,以后也不会为该乘客安排这个电梯。
然后再调度其他的电梯,这也是和现实生活接近的。
在算法优化阶段,我们考虑增加乘客的智慧,使其能根据当前来的电梯更改自己的目的地,将临时目的地设置为电梯所能运载到的最远楼层。然后再转乘其他电梯,这样可以提高电梯的利用率。
遗憾的是,由于时间紧迫,这个优化算法并没有通过所有的测试样例。

十.感想:这是我的第一次结对编程,总体感觉是很坑爹且痛苦。虽然是结对编程,但是代码基本是我一个人写的=0=感觉上我还是不太适应结对编程这种模式,我们前期阅读代码时是分开进行的,我总感觉我和一个人一起阅读代码时会看不下去(然而尽管是一个人阅读的,我的阅读过程还是很痛苦)。当我们结束了代码阅读开始进行讨论时,我发现队友对于代码的熟悉度还不够,但是时间不能耽误,于是我们进入了算法设计环节。原本是想由队友设计一个大体的算法,我进行补充并进行编码,但是队友很难把算法从自然语言抽象到程序步骤。于是我设计了一个基础的算法并进行编码,在这个过程中我们尝试进行二人工作交换,但是很快我发现了一个数据结构使用上的错误,指导队友又太慢了,所有只好换我上阵。当算法实现完成后,进入调试阶段,队友更是没办法插进手了(因为她虽然理解大体的算法思路但是不能完全理解思路在代码里的实现)。虽然我也尝试安排调试和一些小工作给队友,但是结果都是在队友完成前我就等不及先完成了。

结论:结对编程两个人的编程水平不能相差过大。对于编程能力较弱的同学,另一个人可能会给她造成压迫感,导致自己羞于编程。另一方面会产生对队友的依赖,导致对自己的不自信。而对于编程能力较强的同学,忍耐队友跟不上自己思路的过程也很痛苦,而又由于时间有限,不能浪费时间让另一同学慢慢熟悉,最终也只能本着“能者多劳”的原则变成个人主义。虽然最终一个人也能完成两个人的工作,但是非但过程痛苦,并且无论代码还是算法的质量都比不上两人合作的结果。

最后需要说的是,并非两人水平相差较大就不能结对编程。只是这需要较弱的那个人足够勤奋,更早的开展、熟悉工作,并且项目的时间要求也不紧迫,较强的人可以慢慢指导帮助较弱的人。在这种模式下,才能同时实现对两人的提高。

时间: 2024-12-26 12:57:41

pair work结对编程(张艺 杨伊)的相关文章

pair work 附加题解法(张艺 杨伊)

1.改进电梯调度的interface 设计, 让它更好地反映现实, 更能让学生练习算法, 更好地实现信息隐藏和信息共享,目前的设计有什么缺点, 你会如何改进它? 目前的缺点: (1)电梯由于载客重量不同,无法确保每辆电梯在运行过程中的速度一致. (2)电梯每层都停下开关门,极大的浪费了乘客的时间,使乘客从初始楼层到目标层的total time无故增加. 解决方案: 直接设置电梯的初始楼层和目标层,在电梯运行过程中顺路带上同方向且能达到的乘客,电梯能够拒绝不能到达的的楼层指令,乘客可以通过转乘电梯

结对编程总结,收获和教训:by张惠雨&梁佳佳

这是第一次正真意义上的和朋友一起完成一个小项目,虽然国庆七天少了几天玩的时间,但是收获还是蛮多的,感谢队友每天能和我一起去码代码,让这几天过得比较有意义. 这次的结对编程项目实在以前的个人项目的基础上实现的,其中出题模块完全时个人项目的引用,敲了几天代码,感觉自己在图形界面这一方面也有了一定的基础,可以实现一些简单的小功能,但仍不可否认,编码过程中是遇到好多问题的:最开始写的界面是注册窗口,本以为只是几个简单的文本框,却没想到却花了最多的时间,仅仅就验证码的申请这一块就耗费了两天的时间,而在注册

结对编程 地铁最短路径 张波-朱新远

结对编程 地铁最短路径 一.任务: 实现一个帮助进行地铁出行路线规划的命令行程序. PSP 2.1 Personal Software Process Stages Time Planning 计划     · Estimate   · 估计这个任务需要多少时间  7d Development 开发     · Analysis   · 需求分析 (包括学习新技术)  2d   · Design Spec   · 生成设计文档 1d    · Design Review   · 设计复审 (和同

结对编程总结 1175 1176

一.Pair Programing的优点和缺点: 1.  优点:首先,在独立编程的过程中,每人在各自独立设计.实现软件的过程中不免要犯这样那样的错误.而在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位(水平较低的那个有时也能发现一些关键性错误,毕竟每个人分析问题的角度是不一样的).这样,程序中的错误就会少得多,程序的初始质量也会高很多,为以后省下修改.测试的时间.借用官方的总结如下: (1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作

第十周(11.18-11.24)----结对编程----感悟

当开始接触到结对编程这个名词的时候,我很疑惑这是一个什么样的编程形式.当逐步深入读了邹欣老师<构建之法>第二版75页4.5节之后,我不禁想起了一个这样的画面.在准备考研复试阶段,我请了一位编程能力比我强人来指导我学习编程.当时做的是ACM水题,基础的原因,只能从水体开始练习.开始时我坐在电脑前,他坐在我旁边,他看着我进行编程.当遇到一个语法上的错误时,他记得清的就改正我,记不清的就叫我翻书,找到后又回来改代码.遇到算法上的问题的时候,他在纸上给我画一些草图帮我屡屡思路.我还记得那是一道大数相加

结对编程分组

通过不同团队的同学随机组队,结对编程分组如下: 姓名 结对 马瑶华 1 赵铭 1 徐越 2 潘成鼎 2 刘夕霆 3 刘猛 3 李剑锋 4 金哉仁 4 张启东 5 谢金洛 5 徐丞 6 赖彦谕 6 胡亚坤 7 冯志睿 7 金东禾 8 闫昊 8 卢惠民 9 史烨轩 9 刘乾 10 仉伯龙 10 李云涛 11 王若愚 11 李入云 12 何小松 12 杨墨犁 13 金知奂 13 焉域政 14 王嘉豪 14 杜正远 15 潘礼鹏 15 薄霖 16 董元财 16 黄雨萌 17 王春阳 17 刘彦熙 18

结对编程

结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作.一个人输入代码,而另一个人审查他输入的每一行代码.输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员).两个程序员经常互换角色. 在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理.这样使得驾驶者可以集中全部注意力在完成当前任务的"战术"方面.观察员当作安全网和指南.结对编程对开发程序有很多好处.比如增加纪律性,写出更好的代码等.

结对编程的体会

今天晚上,我与队友赵纯艺进行了一次结对编程,共同完成"微信抢票菜单调整"这个任务.因为在之前的开发中,我主要负责前后端借口,只是和数据库打交道,对与微信有关的接口不是很熟悉,所以在获取当前菜单和设置当前菜单时遇到了一点问题. 刚开始的时候,因为我们对彼此的工作都不是很了解,所以我花了比较长的时间向她说明我这部分的机制是如何运作的,理解了我的困惑后,她表示虽然记不太清楚,但是记得<开发指南>里有相关函数.通过查询文档,我们找到了对应的函数get_wechat_menu()和u

结对编程之黄金点游戏

   一.关于游戏 黄金点游戏是一个数字小游戏,其游戏规则是: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值.提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分.玩了几天以后,大家发现了一些很有意思的现象,比如黄金点在逐渐地往下移动. 现在请大家根据这个游戏规则,编一个可以多人一起玩的小游戏程序,要求如下: 1.本作业属于结对编程项目,必