结对编程,非诚勿扰
一回首,一顿足,我以为结队编程才刚刚开始,其实已经要deadline了。刚刚开始的时候以为死活弄不出来的东西,在文哥和我力的作用下,已经有了相当给力的效果:实现3D棋盘模型上的(规则)落子,提子,全场景的自由旋转,见下左图(右图为添加辅助功能和UI美化之后的图):
回顾整个过程,有一点最深切的体会,那就是:结队编程,是两个人的事,非诚勿扰。
虽然我和文哥在不同的Team中,但我知道他身在曹营心在汉,在这个本质点上我们是一样的,这成了我们合作的基础。加上他平时和蔼可亲,脾气特别好,也是一个有决心的人,打一开始,我就坚信我们能克服pair编程中的各种分歧和困难,事实证明我的选择是多么的正确。
第一个分歧就产生在应该选择什么棋类为目标,由于我们在number game的游戏中一个是1一个是4,悲剧的没有能优先选择,轮到我们时就只剩下围棋和军棋了。我个人感觉围棋规则过于复杂,实现较为困难,当时文哥在选择时没有考虑到规则难度预取,结果一切成了定局后。我两研究一会儿规则,均觉得没有能力实现。还好这个时候我们没有互相指责,反而定下了背水一战的方针,能做多少是多少,尽力而为。万事开头难,走了第一步,我们就坚定的走下去了。
接下来是点流水账:
里程碑1:实现3D围棋的基本功能(按规则下子,提子,旋转)
截止日:2010.11.21
时间 | 人物 | 工作 |
11.16—11.17 | 文哥和我 | 疯狂找WPF学习资料,围棋游戏,研究学习 |
11.18 | 我 | 使用Sphere3D类型进行3维球体建模 |
11.18 | 文哥 | 使用贴图的方法,构建棋盘平台 |
11.19 | 我 | 使用“virtual trackball”方法实现3D场景中任意模型的自由旋转,但无法成功运用到camera的旋转中, |
11.19 | 文哥 | 根据teacher的要求,将棋盘做成真正的3D棋盘,实现6个面的自由落子,规范了棋盘坐标 |
11.20 | 文哥和我 | 1. 成功实现整个场景中的基于鼠标移动的自由旋转; 2. 探讨出棋子显示的实现机制,成功实现黑白棋的交替进行; 3. 确定了规则实现机制采用维护每个棋子的4个方向的气场的方法; |
11.21 | 文哥和我 | 上午:实现找棋子领域的方法;实现禁着点报警和提子的方法 下午: 彻底推翻之前实现方法,采用维护每个棋子的4/3个邻居的索引的方法,在将落子时和落子后全盘索引判断。实现禁着点报警和提子的方法。 |
里程碑2:实现其他辅助功能,优化UI
截止日:2010.11.24
时间 | 人物 | 工作 |
11.23 | 文哥和我 | 添加导入棋盘和保存棋盘、退出的功能,实现缩放和替换背景的功能。 |
11.24 | 文哥和我 | 优化代码,提供效率;优化UI,调整光线,旋转参数,增强用户体验。 |
这么些工作,看起来不多,其实每一项都要花相当多的精力去解决,我本来是想在工作开始前就能有这么较为详实的安排,但苦于我们都是菜鸟级别,一点经验也没有,谈何计划,所以就采用的走一步是一步的方法。希望以后经验丰富了,能在项目开始前有比较好的规划。
话又转回来,说到我和文哥的第二个分歧,讨论规则的具体实现时,文哥开始时倾向用一个气就表示当前棋子的特性,我觉得不够,如果真要用到气的概念,那么必须要用到领域方向个的气,并且有一套相对比较容易,但思路上有些复杂的算法。文哥后来还是支持了我,并将这部分算法交给我实现,充分体现了对我的信任。(因为时间不多了,第一个里程碑离deadline只有1天了)。
第三个分歧在deadline那天,早上的时候 ,辛苦万分的把规则实现了,和文哥辛苦的定义各种接口和底层的数据结构。中午吃饭的时候,给凯哥讲述我们的方法时,他无意提到不要用气去索引,直接判断全局查找。我们当时没留意,觉得他这样的复杂度比较大。下午的时候当我和文哥突然发现我们的方法,在前期判断禁着点时有先天的优势,但下子后维护气场的代价太多,我突然回忆起凯哥说的,就建议用他们的方法,文哥还坚持想来着,我再一次建议换一个思路。最后文哥同意转移了思路,并一起思考下去,然后文哥就文思如泉涌,代码如飞,不久就把规则实现了,赞一个。
因为我们都脾气不错,所以才能在有不一样的想法时,相互倾听,换位思考,在山穷水复的时候走出一条柳暗花明的路来。试想如果第一个分歧时,我们各自埋怨,那么这个pair project就可以不用开始了 ,第二个分歧时,如果坚持各自意见,就只有停留在原处,第三个分歧时,如果一方不仔细思考对方的建议,那么或许我们就走到一个死胡同了。
所以,结队编程或者说团队协作,参加了就要要真心诚意负责,非诚勿扰,在同一个远景下,有了分歧也要克服学会合理妥协。那种随便搞搞,互不搭调的,结队后一定争吵不断,怎么可能实现目标?
这是我们认真工作的工作照,有图有真相(合作愉快):
欢迎拍砖!