海贼王里面的罗宾的CP是谁 国内为何很少有人做结对编程呢是确实不好还是属于中国特色_2

2019-11-09 12:51:07

这种要求是对一个人的心智、道德修养的更高要求。结对编程中,编码不再是私人的工作,而是一种公开的“表演”。程序员的代码、工作方式、技术水平都变得公开和透明,这也许是有些同学不喜欢这一方式的原因。——摘自构建之法——现代软件工程耐心看哦,本文后面给出了结对编程的案例故事,可能会让你有共鸣,有深思。比如——阅读别人的代码有多难?我们经常抱怨阅读别人的代码很难,我们自己在写代码的时候,是否考虑到如何让代码更易于阅读和维护呢?别人的代码:来源:Doyouhatereadingotherpeoples’code?在有哪些可以提高程序员技术档次的书或博客?里有对这本书的详细介绍。构建之法——现代软件工程中用较多篇幅谈到了结对编程:最早的结对编程(PairProgramming)结对编程随着敏捷开发思想的兴起而广为人知,然而这种实践早已有之。在1987年,Intuit公司(当时只是一个刚刚创业的个人财务管理软件公司)向顾客宣布在4月份提供新版本的软件(4月15日是美国报税的截止日期)。但到了3月份的时候,公司仅有的两个技术人员发现项目还是大大落后于预期,于是这两人在3月的最后一个周末开展了疯狂的,不得已的结对编程活动:结对编程有人要问,既然代码复审能发现这么多问题,有这么好的效果,如果我们每时每刻都处在代码复审的状态,那不是很好么?事实上,极限编程(ExtremeProgramming-XP)正是这一思想的体现——为什么不把一些卓有成效的开发方法用到极致(Extreme)?结对编程就是一个例子。在结对编程模式下,一对程序员肩并肩地、平等地、互补地进行开发工作。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起写文档等。结对编程不是程序开发者独到的发明,在现实生活中,也存在着类似的搭档关系(Partnership):越野赛车(驾驶,领航员)驾驶飞机(驾驶,副驾驶)战斗机的编组(长机,僚机)提示:这些任务都有共同点:在高速度中完成任务,任务有较高的技术要求,任务失败的代价很高。结对编程中的角色结对编程中有两个角色:(a)驾驶员(Driver)是控制键盘输入的人。(b)领航员(Navigator)起到领航、提醒的作用。这两个角色是可以互换的。和现实生活中的例子类似,一个人负责具体的执行(驾驶,用键盘编辑程序等),另一人负责导航、检查、掩护等。同学们杂曰——1)编程从来就是一个人的活动。学校里这么教的,我们一直以来也是这么做的。两个人本来可以去做两个模块,现在一个模块两个人写是不是一种浪费(这可是两份工资哦)?2)我习惯一个人写程序,不喜欢被人盯着工作,这样我不自在,无法工作。3)身旁的这个家伙老是问问题,他/她不会看书么?我都无法专心工作了。4)会不会出现,“我只领航,不用敲键盘,多爽……”的情况?5)有些公司规定所有的任务都要结对编程,结果大家都走形式,滥竽充数的人也在结对编程的过程中得过且过……为什么要结对编程?每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误。在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高很多,这样会省下很多以后修改、测试的时间。具体地说,结对编程有如下的好处:(1)在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。(2)对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。(3)在心理上,当有另一个人在你身边和你紧密配合,做同样一件事情的时候,你不好意思开小差,也不好意思糊弄。(4)在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。总之,如果运用得当,结对编程能得到更高的投入产出比(ReturnofInvestment)。不间断地复审结对编程让两个人所写的代码不断地处于“复审”的过程,正如前所述,复审是不断地审核,提高设计和编码质量的过程,结对编程让复审随时随地发生,这样才能及时地发现问题和解决问题,避免把问题拖到后面的阶段。开发中的复审主要包括:设计复审、代码复审、测试计划复审、文档复审。这些复审可以在伙伴之间进行,也可以在团队内部进行。结对编程和传统开发过程的复审有什么区别呢?(1)传统意义上的伙伴复审,即程序员之间的互相复审,有以下的问题:a.复审人缺乏对程序的深入了解,降低了复审的效果;b.不能持久、定时地进行复审;c.对需求和设计的不了解导致无法实现全面有效的复审。(2)团队复审是指多于两人的团队就某一程序实体进行的复审,团队复审的缺点在于:a.什么时候开会做复审?不可能一个团队天天开会。要找到一个所有人都能出席的时间,并不容易;b.牵涉的人员众多,理解程度不一,复审的速度和效果不能得到有效的平衡——太快则有人不懂,太慢则浪费许多人的时间;c.正是由于成本问题,无法对所有的设计和代码进行深入的复审;d.由于人员众多,有面子问题。在结对编程中,任何一段代码都至少被两双眼睛看过,两个脑袋思考过。代码被不断地复审,这样可以避免牛仔式的编程。同时,结对编程避免了“我的代码”还是“他的代码”的问题,使得代码的责任不属于某个人,而是属于两个人,进而属于整个团队,这样能够帮助建立集体拥有代码的意识,在一定程度上避免了个人英雄主义。结对编程的过程也是一个互相督促的过程,每个人的一举一动都在别人的视线之内,所有的想法都要受到对方的评价。由于这种督促的压力,使得程序员更认真地工作。结对编程“迫使”程序员必须频繁地交流,而且要提高自己的技术能力以免被别人小看。但是要注意,每个人每天的高效率工作时段不超过3~4个小时。结对编程中驾驶员和领航员的互换可以让程序员轮流工作,从而避免出现过度思考而导致观察力和判断力下降。什么样的人适合结对编程?ExtremeProgramming对实施的程序员提出了更高的要求。这种要求不是技术水平,也不是学历水平或工作经验。这种要求是对一个人的心智、道德修养的更高要求。结对编程中,编码不再是私人的工作,而是一种公开的“表演”。程序员的代码、工作方式、技术水平都变得公开和透明,这也许是有些同学不喜欢这一方式的原因。以上是书中关于结对编程的部分内容,下面是与结对编程配套的练习,很有意思,切莫错过——现代软件工程第四章【结对编程】练习与讨论4.7.1结对项目的案例和论文在现代软件工程教学的过程中,同学们已经总结了不少切身体会。例如:总结1[i]:那是project到了比较关键的创造阶段,整整一天,我们俩椅子靠椅子的坐在电脑前,一边讨论一般coding,那次才真正的体会到结对真的能够带来效率。一整天的coding是容易走神的事,还好有pair在旁边指导,总是不断在我敲某某变量之前提前告诉我成员变量的名字,数据修改时帮忙检查是否有漏掉的,变量和函数定义的时候一起为其取名字,感觉有点眼花了,就换了个角色,我也开始对他“指指点点”了,一个人coding,一个人review,确实能减少一些不必要的错误,减少一些漏洞,算法实现后一起做些简单的测试,看到bug了再一起分析,我能明显的感觉到与以前的个人编程不一样,我们能比较快的找到bug初始点,并能提出比较的修改方法。特别是当看到功能进一步实现时,心里确实挺happy,更重要的这份感受有同伴与你一起分享。总结2[ii]:于是我们进行了项目中最关键的一次PairProgramming,我们利用编译课上机时间,在机房里Pair完成了整个项目的类的设计与程序结构的设计。我们一起分析出类,然后找属性,写方法头,开始是WG用键盘,后来我用。一个明显的好处是,写完一条自己不确定的语句,马上可以跟Pair一起缕一缕思路。一下午下来,感觉甚为清爽,因为终于清楚这个项目的做法了。学术界、工业界对结对编程已经有不少研究,请阅读至少两篇相关论文或论文[iii]。4.7.2性格对合作的影响人和人不一样,在和别人合作的时候,要注意各人表达观点的方式和思考的方式不尽相同。请看网上关于MBTI的文章[iv],测试并分享各自的MBTI类型,讨论不同性格类型对合作有多大的影响,在合作的各个阶段应该如何应对[v]。4.7.3是否需要有代码规范对于是否需要有代码规范[vi],请考虑下列论点并反驳/支持:这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率,浪费时间的东西。我是个艺术家,手艺人,我有自己的规范和原则。规范不能强求一律,应该允许很多例外。我擅长制定编码规范,你们听我的就好了。4.7.4代码复审的讨论小飞:哇,这么多酷的C++功能都不能用,那我们还学什么C++,为了迎接考试,我都把OperatorOverload、Polymorphism背得滚瓜烂熟了,为什么不让我用?阿超:我们写程序是为了解决问题,不是“为赋新词强说愁”,这些高级的语言特性,不是不让用,而是要用得慎重,不要动不动就写三五个类,一个套一个,要把注意力集中在能否用简洁的方法解决问题上来。小飞:这么多规范,我不知道怎么写第一行程序了。阿超:自我复审也很重要——把代码摆在面前,当作是别的菜鸟写的。把你通常问别人的,以及别人会问你的问题都自己问一遍。这样就能发现不少问题。小飞:如果开发者很厉害,那么复审者就没有什么作用,也许这些复审都是走过场?阿超:同理可以推论,如果开发者很厉害,那么测试人员也没什么作用,也是走过场,干脆把他们送回家得了。我们敢这样做么?小飞:这些规范啊,建议啊,都是细枝末节的东西,我们要做世界级的软件,搞这些东西是不是太小家子气了?阿超:首先世界级的软件也会因为小小的纰漏而导致世界级的问题。例如我们常常听到的安全漏洞和紧急补丁。其次,软件的开发是一个社会性的活动,有它的规律。其中一个规律就是“破窗效应”(brokenwindowstheory)[vii],如果团队成员看到同伴们连一些细小的规范都不遵守,那自己还要严格执行单元测试么?另一个成员看到这个模块连单元测试都没有,那他自己也随意修改算了。这样下去,整个软件的量可想而知。4.7.5阅读别人的代码有多难?我们经常抱怨阅读别人的代码很难,我们自己在写代码的时候,是否考虑到如何让代码更易于阅读和维护呢?别人的代码:来源:Doyouhatereadingotherpeoples’code?微软资深软件工程师:阅读代码真的很难4.7.6结对编程中不好的习惯-你经历过么?喜欢发号施令的人总是对敲键盘的人说:“到末行,加个反括号,然后…”。他不去关注解决方法和下一步该怎么做,而过度关注一些编程细节。拼写纠错者坐在你旁边,纠正你输入的每个错误字符。当然,他没有时间来真正的进行导航。深藏不露者仅仅自己敲着代码而不告诉别人他在做什么。领航员不得不靠自己去弄懂代码。关于该用什么方法,该选择哪种设计,领航员和实施者之间完全没有交流。跳跃很大的人喜欢在代码中进行大范围的跳跃,这样领航员不知道进行到哪里了。4.7.7对合作伙伴的评价(这个作业在学期结束的时候做)经过一个学期的各种项目,你(一个学生)和至少6-7个同学深入地合作过。你一定会对大家的合作精神有切身体会。我们来做一个统计:每个学生在期末填写一个一维的表格(没有并列),像下面这样:学生甲学生乙。。。你自己(标明自己的名字)学生丙学生丁。。。最后老师会统计出来,整个学生集合中,谁的合作精神比较好,谁比较不好(在同伴的眼里)。计分方法是:“你自己”得0分;在“你自己”之上的同学得一分;在“你自己”之上两格的同学得两分,以此类推。。。在“你自己”之下的同学依次得-1,-2,-3,...分。[i]参见:结对编程之初体验[ii]参见:现代软件工程系列结对编程两周写好3D陆战棋[iii]参见:PairProgrammingCaseStudy以及Casestudy:usingpairprogrammingindevelopmentofacomplexmodule.以及http://www.cs.utexas.edu/users/mckinley/305j/pair-hcs-2006.pdf其它论文:Williams,Laurie,RobertKessler,WardCunningham,andRonJeffries.2000.“StrengtheningtheCaseforPairProgramming.”IEEESoftware17,no.4.[iv]请看:Myers-BriggsTypeIndicator[v]另外请参见《对性格内向者的10个误解》:http://blog.jobbole.com/12488/[vi]参见:编码风格不是编码规范谷歌是如何做代码审查的StuffEveryoneShouldDo(part2):CodingStandards[vii]参见:Brokenwindowstheory==========更多关于构建之法的内容主题介绍,请参看这些回答:1有哪些可以提高程序员技术档次的书或博客?2在移动互联网小型项目/产品调研设计开发发布这个过程中有没有风险管理?3从事偏向软件的嵌入式开发的学习步骤是什么?要看哪些书?做哪些事?-4单元测试应该谁来做?怎样才算是一个好的单元测试?5国内为何很少有人做结对编程呢?是确实不好还是属于中国特色?

上一篇:小欢喜的全部集 个人感觉陈奕迅唱功比周杰伦强很多如果周杰伦的歌都让陈奕迅来唱会不会更好听
下一篇:没有了
  • sy_logo