结对编程
① 结对编程中两位程序员分别充当什么角色
执行者和观察者。
如果你是执行者,当以最快的速度完成了某个程序时,往往会忽略一些问题,在这个时候,搭档就是保障。
如果你是观察者,仔细审查对方的代码,考虑可能的错误,以及如何简化和改进设计。在无法读取的时候找出bug,但是不要即时就要求删改,而是等到对方专注编程之后,进行到一个程度再整体调控会有效。例如,如果你看到现在的代码没有考虑空输入,在一张纸上写下,“添加单元测试的零输入。”
观察者和执行者都是灵活互动的,而不是机械一成不变的完成任务即可。观察者并不需要去研究小细节,但是要考虑更高的层次。例如“看起来不错,但是如何处理遇到空指针的情况?”听起来就比“好了,现在输入'如果(S == NULL){返回..}””好很多。
② 程序员,如何少走弯路,成为一名技术专家或者架构师
#1 专业技能
@首先当然基础知识要扎实,一些经典的专业书籍一定要看。比如,设计模式,算法,数据结构,所在领域的编程语言的专业书籍等.关于不同的能力阶段,需要读取什么类型的书籍,请参考ThoughtWorks(中国)程序员读书雷达,每年都有更新。
@作为架构师,review别人的代码并给出合理的建议是基本功,比如变量或者方法命名的规则;所以代码大全,重构,改善既有代码的设计,Clean code 等等肯定需要看。
@ 对于某一个技术领域或者业务领域,一定要有一门技术是精通的,因为这样你才能体会到以后遇到自己不懂的技术的时候,如何能够快速成为这一方面的行家。
@ 平常有时间一定要多多进行代码的训练,也就是Martin Flower常说的Kata练习,这个比喻来自于跆拳道,跆拳道选手一般每天都会找一些基本的招式,进行反复的练习,从而训练肌肉的条件发射,那么对于我们程序员来说,一定也要进行持续的编程训练,比如上面提到的那位同事,给的建议是,虽然把大部分时间花在了沟通和协调上面,没有机会写代码,但是自己一定要利用业余时间,自己找一些例子来联系,比如,参与开源项目,或者到网上去搜索一些大师的经典Kata联系的例子;或者看工作里面是否有一些小工具,是否能够提升自己的沟通效率,当然已经天天写代码的童鞋们除外。请参考我转发的另外一篇文章和另外一篇介绍能在线练习Kata code的文章.
@ 最好能够在精通一门语言的基础之上,学习其他的语言,从而站在一个更高的角度,对于程序语言有一个更高层次的抽象认识,比如,学了java之后,可以学学Ruby,Groovy,C#等等,其实语言之间都是相互借鉴的,比如Lamba表达式,连java也慢慢的向函数式编程方向靠拢。
@ 如果有时间,一定要自己维护一个博客,既然选择了架构师,就决定了自己以后不仅仅是一个技术专家,同时也要成为一个布道师,为企业组织或者社会上的其他IT同行们贡献自己的一些微薄之力。
@ 多参加一些社会上举办的软件专业会议或者活动,了解当前比较流行的技术和框架。
@ 这条不提倡,我以前有一个同事,几乎每年都要更新简历1~2次,目的不是真正的换工作,而是通过面试得到当前市场上大部分公司正在使用什么技术和框架。对于这条,请慎用!!!!
@如果有结对编程的机会一定要好好珍惜,特别是和高手大拿一起结对的时候。
@如果大家上面都已经做的非常的好了,这个时候可以看看架构设计方面的书籍,比如企业应用架构模式,架构之美等等。
@ 去51Job上搜索架构师这个职位标签,看看不同行业的企业对于架构师的技术要求和标准,然后结合自己当前所处的行业和你自己的技术特点,比如擅长前段或者后端,有选择性的学习一些自己感兴趣的技术或者方法。
@ 关于常用的网站,没有定论,笔者主要是根据搜索的结果去发现适合自己的网站,所以需要读者掌握一定的搜索的技巧,笔者一般喜欢用英文搜索,这样的话资料比较全也比较新;如果下载电子书的话或者查看博客的话 一般会首选CSDN;如果是解决工作中的问题的话,在StackOverFlow上面被解答的概率是最大的,此外平常自己也需要去积累一些自己感兴趣的技术的人气比较旺的网站列表,比如一般和Window相关的就是MSDN;如果对Java入门比较感兴趣,可以看看这个网站。对于一些开源的框架,一般都会有想对应的社区,google一搜索,很快就能找到。另外一个德国人写的博客的非常的精致,如果对Eclipse插件开发特别感兴趣的朋友们可以去参考它。
@大家如果时间和精炼允许,最好能在Github开源和分享自己平常写的代码。这样一方面可以熟悉git用法,另外一方面也可以把自己平常练手的代码免费保存,何乐而不为呢?
@如果大家平常遇到什么问题,可以到StackOverFlow上面去寻找答案;当然,如果你能自己注册一个StackOverFlow账号那是最好不过的,这样不但可以提问,还可以帮助别人,同时上面还有很多工作签证的工作机会。
#2 软技能(现代社会,一个合格科学家不仅仅是某一个行业的技术专家同时也是一名专业的社会活动家)
@遇到问题,一定要多想,遇到一个问题,如果解决了,就要反思为什么能够解决,如果以后遇到类似的问题,
如何更快速的解决。
@英语的重要性,不言而喻,因为现在很多新技术的框架的中文文档非常的少,即使翻译成中文,也是二手的了(国内自己的开发的一些开源框架除外)
@ 有时间的话,看一些沟通方面的书籍,如果有参与沟通的机会的时候,一定要想如何把沟通做的更好更舒畅。
@ 如果有机会的话,可以参加PMP的考试,关于如何备考PMP,请大家参阅另外一篇文章:如何备考PMP,但是如果不想参加的话,也没有关系,至少要涉猎到项目管理方面的书籍,否则以后如果成为架构师之后,客户或者管理者给你说一些项目管理上一些专业术语时,到时候就会一头雾水。
@架构师其实从某种意义上就是一种角色,而不是一种职位。一定要时时刻刻保持空杯心态。
@一定要有一颗保持饥渴学习和耐得住寂寞的赤子之心。
@当前的技术节凑是非常快的,特别是结婚以后又有小孩了。一定要好好的利用自己碎片时间,对于一些技术,当时读不懂不要紧,但是一定要记住和了解其关键词,这个主要是为了拓宽自己的视野。比如,当前你想自己开发一个系统,结果已经有一个开源框架实现了,而且还很稳定,这个时候,自己就没有必要重复发明轮子了。
@与不同的技术、编程语言、设计模式和结构等(甚至是它并没有在日常中给予你直接的帮助)打交道。你永远都不知道这些知识是否会在未来派上用场,但是对你绝对是有益无害。
@在工作中,能够帮助到别人解决技术难题,一定要尽量全力以赴,因为这不但可以赢得同事的好感和口碑,同时也能增长你解决问题的经验和提高你的技术思维能力
@ 一定要掌控好自己的时间,对工作没有帮助的会议,能不参加尽量不要参加,当然,企业安全,公司规章制度如果是强制性的,该参加还得参加,但是如果没有工作效率和扯皮的会议,尽量避免参加。
@程序员要耐得住寂寞,要在自己的领域深挖,不能看啥火,就学啥,一定要有自己的想法和判定,如果决定不了,可以向资深的同事或者朋友沟通。
@尽量参与到项目中的编码,因为架构师不能与项目脱离。
@ 如果有机会可以锻炼一下自己在大众环境下的演讲和PTT的能力。
@有机会多做知识分享,因为你一旦分享了知识,你就会对这门技术有深刻的印象,同时也能树立在同事中的良好的技术形象,从而赢得更多的专家影响力而不是职位影响力。
上面只是我当前能想到的,知易行难,知道了上面的一些经验,并不代表年轻程序员们就能马上成功,毕竟这需要一个凤凰涅槃和实践的过程,但是肯定能帮助有志于于此的年轻程序员们少走一些弯路,限于笔者水平,如有总结不恰当或者不到位的地方,还望批评指正。
③ 什么是结对编程
结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。
结对编程是极端编程的组成部分。
④ 学习少儿编程,对孩子升学有帮助吗
有用。
学习编程对孩子的帮助很大,可以归纳为以下10点:
(1)强化孩子的逻辑思维能力。
编写程序最重要的是如何把大问题不断分割成小问题。
编程中孩子要思考如何把代码合理地安排在整个程序中,让程序流畅地处理输入、演算、输出,这个过程对孩子分析事物的逻辑性有极大的帮助。
(2)培养孩子的专注力和细心度。
在编写程序的过程中,排错是无法敷衍了事的,这个过程能有效改正孩子马虎行事的毛病,避免当个“差不多”先生。
(3)提高孩子的耐心。
编写游戏和玩游戏的很大区别在于编写游戏可以很好的锻炼孩子延迟满足感的能力,提高耐心,从编写游戏,到玩游戏,是需要经历一个比较长的过程。同时学会编写游戏的小朋友,会在游戏过程中融入更多的思考,游戏视角会有明显变化。
(4)增加孩子的抽象思考能力。
学习程序就是为了跟计算机沟通。这意味着孩子在学习的过程中需要一种化具体为抽象的能力,让程序能够按照孩子想象的方式运行,这是集思广益的过程。让孩子发挥无限想象并动手实践,让不懂得思考的电脑也能了解与表达抽象的事物。
(5)提升孩子整理信息、融会贯通的能力。
程序是一堆电脑指令的组合,程序中的基本指令就像是汉字,写成可重复利用的方法或对象就像是成语。最终要完成项目,就必须融会贯通、学以致用,确保程序在执行中不会出现不可预期的错误。
(6)提升孩子国际性的沟通能力和竞争力。
编程语言已然成为一种重要的沟通工具,不但可以跟电脑沟通,还可以跟所有运用电脑的人沟通,这将会是他们面对国际和未来竞争的核心能力。
(7)让孩子学会团队合作和共同学习。
在适当的教学课程设计下,学写程序就像玩游戏闯关一样,同学彼此讨论破关攻略。结对编程,你不会,我教你;我卡关,你帮忙;我设计,你闯关。同时,在互动中增进情谊,学习如何利用团队的力量解决问题。比起老师在讲台上单方面的讲课,同学之间的探讨更容易提高学习效率。
(8)训练孩子的空间思考能力。
在编程中控制游戏人物的过程是训练空间思考能力的一个很棒的方式。仿佛孩子自己在高低起伏中身陷迷宫,在闯关角色中置身于编程世界,在游戏中学习,明白方向感和立体的空间架构。
(9)增进孩子解决问题的能力。
面对一道道关卡的挑战,孩子会不断思考如何利用学到的知识、程序达到闯关的目的。一旦养成这样的习惯,在碰到生活中或其他课业问题时,自然也会试着自己解决。父母只要给予适当的工具和提示,让孩子自己动手、动脑去完成。
(10)Learn to code,code to learn。
学习编程,训练编程的思考方式,父母再也不用逼着孩子学习数学,因为当他要完成按钮、人物、得分、方向的同时必然需要用到许多数学的技巧,让孩子在编程的同时自主学习。另外,还可以提高孩子的英文能力,编程让接触英文成为自然而然的事情。其他的科目(如音乐、艺术、文学等)一样可以运用在编程的过程中,也就是我们所说的code to learn。
⑤ 解释XP中的结对编程有哪些好处弊端在哪里
结对编程技术是一个非常简单和直观的概念,能达到事半功倍的工作效果。但是,人与人之间的合作不是一件简单的事情——尤其当人们都早已习惯了独自工作的时候。实施结对编程技术将给软件项目的开发工作带来好处,只是这些好处必须经过缜密的思考和计划才能真正体现出来。而另一方面,两个有经验的人可能会发现配对编程里没有什么技能的转移,但是让他们在不同的抽象层次解决同一个问题会让他们更快地找到解决方案,而且错误更少。
⑥ 结对编程的时候:如何实现在线的远程代码审查和版本控制两者如何才能相互结合在一起
其实使用版本控制工具git,就可以方便地实现了。
git还支持远程访问版本库。
这样代码撰写者与审核者,可以通过版本库来交流了。
git还支持被部署到windows和Linux上。
⑦ 国内为何很少有人做结对编程呢是确实不好还是属于中国特色
结对的代码质量应该高于单干,单干的效率可能高于结对。对于一个没有敏捷基因,看重效率大于质量的团队来说,结对的投入产出比太低,采用传统方式也就理所当然。
⑧ 敏捷开发、极限编程和结对编程这三者什么关系啊
敏捷开发是十几种开发方法的统称,极限编程就是这十几种开发方法之一。
极限编程包括了十几种实践(就是一些具体做法),结对编程是极限编程的一种实践。
⑨ 编程必须明确清楚这几点,学习C语言和C++
一、宏观:
将C++视为C、面向对象C++、模版C++、STL C++组成的语言联邦。
任何人不得添加任何东西到STL命名空间
不要轻易忽略编译器的警告
一定程度的使用测试驱动的开发方法
软件实体(类、模块、函数)应该是可扩展的,但是不可修改的
多采用敏捷的设计方法(个体和交互胜过过程和工具、可以工作的软件胜过面面俱到的文档、客户合作胜过合同谈判、响应变化胜过遵循计划)
经常性的交付可以工作的软件,交付的时间间隔越短越好
在整个项目开发期间,业务人员和开发人员必须天天都在一起工作
围绕被激励起来的个人来构建项目
在团队内部,多进行面对面的交流
提倡可持续的开发速度
使要构造的系统最简单(不要设计不需要的功能,不要过分设计)
最好的架构、需求和设计出自于自组织团队
每隔一段时间,团队会在如何才能更有效的工作方面进行反省,然后相应的对自己的行为进行调整
结对编程是一种比较好的选择
不能容忍重复的代码
持续的对代码进行重构
要做计划游戏
高层模块不应该依赖于底层模块。二者都应该依赖于抽象
尽可能的保证:抽象不应该依赖于细节,细节应该依赖于抽象(任何变量都不应该持有一个指向具体类的指针或引用;任何类都不应该从具体类派生;任何方法都不应该覆写它的任何基类中已经实现了的方法)
每个编程单元尽可能的向使用者提供使用承诺:例如资源回收保证、数据一致性保证、无异常保证
尽可能的在程序中处理所有可能的异常,而且尽可能的精细。(try...catch)
应该让程序体面的退出:在出现非计划内问题时自动产生mp文件。(利用SetUnhandledExceptionFilter调用MiniDumpWriteDump)
要先设计好类,建好各个类的文件,才能写代码。
用pragma once代替h文件头
二、类:
让接口容易被正确使用,不易被误用
设计class犹如设计type
将成员变量声明为private
尽量不要让类支持隐式类型转换
friend成员函数是类接口的一种表现方式,但能避免使用就尽量避免
避免使用handles指向对象内部成分
慎重使用inline(小函数的确该用inline,但是考虑到inline函数无法调试,所以应谨慎)
确定public继承表现出is-a关系(即Liskov替换原则,永远可以用派生类取代基类)
避免覆盖继承而来的名称(基类函数重载,派生不重载,则其他覆盖;派生重载基类函数,则基类函数覆盖;变量也可以覆盖)
区别接口继承和实现继承(纯接口(virtual=0),接口+朴素实现(virtual=0+实现),接口+强制实现(non-virtual),以上为public继承,private继承全部是为了继承实现,而不继承接口)
根据上一条,只要出现virtual,就尽可能让它=0(成虚基类)
根据上上条,派生类不应该覆写non-virtual函数
绝不重新定义继承而来的缺省参数值
private继承意味着继承实现,是composition,实现的是has-a逻辑。protected继承尽量少用。两种继承在设计层面完全没有意义,只是实现层面的代码重用。
凡是独立的对象都必须有非0大小(空对象会安插一个char)
一个类只负责一件事
一个类只提供一种内聚的接口(不应该让用户依赖于他们不使用的方法)
类内部的类型定义尽量放在public,否则不能作为返回值
类中的大属性都应该用智能指针(或返回STL时应使用move语意)
凡是类内私有变量加m前缀,凡事类似私有仿函数,加or后缀
静态成员初始化函数用静态类替代,可以顺便用个functor
四大函数(构造函数、拷贝构造、赋值、析构)
若有多态继承体系,基类析构函数尽量声明为virtual
如果类内new了对象,并且该类负责delete,则必须要定义拷贝构造函数和赋值操作符。
若不想使用编译器自动生成的函数,就该默认拒绝(将其声明在private或protected)
别让异常逃离析构函数,C++不喜欢析构函数吐出异常
绝不在构造函数或析构函数中调用virtual函数(当然其他函数调用virtual可以实现template method等有趣的模式)
拷贝函数应该确保拷贝了对象内所有成员和基类部分
不要以某个拷贝函数去实现另外一个拷贝函数(一个是函数,一个是 assignment函数),应该把共同部分放在第三个独立函数
三、函数:
尽量将函数参数声明为const
另operator =返回一个*this的引用,并且在operator =中处理自我赋值
函数参数的构造顺序不确定,所以不要在函数参数中执行new操作,或将多个函数参数都用函数来表示(否则若一个发生异常,其他有可能不会执行)。
尽量用传递const 引用代替传值
non-member,none-friend函数有封装性好,跨类型操作等能力,因此在需要的时候没有必要局限于把函数全部放到类里的传统规则。
若所有参数都需要类型转换,请为此采用non-memeber函数(典型的是双目操作符重载)
凡是需要对指针参数做提领操作,都需要检查是否为BULL
发布版程序维持程序的勉强工作比crash更好;debug版让程序尽量crash。
希望可以帮到你,谢谢!