捷对编程
㈠ 编程必须明确清楚这几点,学习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。
希望可以帮到你,谢谢!
㈡ 结对是什么意思
在不同场合下有不同意思,最基本的是结成一对的意思,其他的比如:
结对助学
要求单位选出几名学习优秀分子采取"一带一"或"一带二"的形式,结对助学.
结对编程
简介结对编程技术是一个非常简单和直观的概念:两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计。同一个算法、同一段代码或同一组测试、与两位程序员各自独立工作相比.结对编程往往只需花费大约一半的时间就能编写出质量更高的代码, 但是,人与人之间的合作不是一件简单的事情——尤其当人们都早已习惯了独自工作的时候、实施结对编程技术将给软件项目的开发工作带来好...
结对资助
结对资助是指捐赠者通过希望工程办公室的安排与受助学生建立直接联系,或形成一对一的资助关系。该种捐款方式可以通过书信直接联系,可以让贫困生在捐赠者的关怀下健康成长,同时可以有效保证希望工程的透明度。结对资助的方式已经成为社会上人们最乐意采取的奉献爱心的方式。结对资助-捐款批次1、一次性捐款结对资助:即捐赠者将受助学生所需学费,一次性捐赠给希望工程工作机...
结对帮扶
概述结对帮扶是一项扶贫政策,即党员干部一对一结对子,帮扶城乡困难家庭的活动。为贯彻落实党的十七大和十七届三中全会精神,加快推进以改善民生为重点的社会建设,让城乡困难群众共享改革开放成果,我国普遍深入开展结对帮扶活动。 具体来说,结对帮扶是以先进带动后进,优势带领劣势的一种优势群体帮助扶持相对弱势群体的形式和手段。可以是一对一,也可以...
双结对
背景“双结对”活动是区委贯彻落实市委“高兴、放心、凝聚、覆盖”主题活动要求,切实开展先进性教育活动的重要载体和抓手。龙柏街道在推进“双结对”活动中,一方面认真做好上级要求的规定动作,街道机关党支部与龙柏三村第一居民区党支部结对,与龙柏三村困难同学、困难党员结对;居民区26个党支部与区委办局20家单位26个党支部结成对子。另一方面积极做好街道自选动作,...
㈢ 敏捷开发、极限编程和结对编程这三者什么关系啊
敏捷开发是十几种开发方法的统称,极限编程就是这十几种开发方法之一。
极限编程包括了十几种实践(就是一些具体做法),结对编程是极限编程的一种实践。
㈣ 程序员,如何少走弯路,成为一名技术专家或者架构师
#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的能力。
@有机会多做知识分享,因为你一旦分享了知识,你就会对这门技术有深刻的印象,同时也能树立在同事中的良好的技术形象,从而赢得更多的专家影响力而不是职位影响力。
上面只是我当前能想到的,知易行难,知道了上面的一些经验,并不代表年轻程序员们就能马上成功,毕竟这需要一个凤凰涅槃和实践的过程,但是肯定能帮助有志于于此的年轻程序员们少走一些弯路,限于笔者水平,如有总结不恰当或者不到位的地方,还望批评指正。
㈤ 编程老手的哪些特点,是值得新手程序员学习的
有经验的程序员会做到下面 29 项事情,这也是每个新手程序员应该知道的事情。
如果你想成为更好的开发者,你应该尤其注意第 15 点和第 29 点。
1.积极大胆地谷歌。你得知道如何有效地组织搜索关键字,查阅别人写的代码,然后合理地用在代码里,从而解决问题。
2.拥抱变化,坚持不懈。老手程序员在接触新技术时,能欣然接受像个初学者一样处处受挫,并总能在完成工作的同时自学成才。
3.承认细节的重要性。例如变量和函数的命名、CSS 属性的命名、该用哈希还是用数组,以及其他看起来微不足道,但可能对项目有深远影响的事情。
4.承认大多数的“重要决定”其实并没有那么重要。一般的开发者经常在技术选型等“重大问题”上陷入唇枪舌战,而程序员老鸟们会避免浪费时间在骂战中。这一点上,他们就像禅宗大师一样(zen-like)。
5.选择合适的工具解决问题。网上有无数的开源库、工具和框架,让人眼花缭乱。而老手们清楚地知道针对怎样的问题,应该用什么样的工具。
6.明白代码“不值钱”(该删就删)。你必须习惯于删掉几百行代码来重写程序的某一部分,毫不留情。
7.在评估技术的时候要全面。例如,我一直在鼓吹Elixir。它语法优美,社区完善,有很大的潜力。但Elixir诞生的时间太短,所以如果要构建复杂的功能,可能会难以找到能帮你提高效率的开源工具。因此,在评估要不要选择使用一项技术时,你得把所有这些因素都考虑在内。
8.学会说“我不知道”。没有比拒绝承认自己不知道更能浪费一个开发者的时间了。
9. 仔细分析错误信息里的线索。传统教育告诉我们:失败是坏事。报错信息这种东西也经常被跟失败联系起来,然而优秀程序员明白,这些错误消息里其实隐藏着能将你指向最终正确解决方案的线索。
10. 了解过早优化和必要的“炫技式”优化的区别。老手们清楚在什么时候需要写一些看上去没那么好懂,但会让程序运行更快的代码。
11.每个人都会犯错,为自己的过失负责。而尤其在团队里,把责任推来推去没有任何意义,因为错误的发生往往不只是一方的因素造成的。
12. 成为你所用的开发工具的重度用户。如果长期在某个开发环境下有相当比例的开发工作,那你应该去掌握使用它的细节。
13. 学会用Vim(至少会一点)。 你至少应该在这个编辑器里学会勉强地移动和翻页。
14. 不要接陌生技术领域的私活。个人做自由职业项目,其中很大一部分挑战就是评估项目时间。不要规划自己未知领域的事情,那会让你处于想当尴尬的境地。
15. 不要数你干活花了几个小时。技术大牛会把时间花在有深度的工作上,并且他们清楚花了多少时间完全不重要。
16. 学会坦然接受批评。当你的代码因为各种原因四分五裂时,你需要培养用理性和逻辑的方式来应对(而不是情绪化处理)。
17. 同有更多经验的人结对编程。没有比这个更高效的编程学习方式了。
18. 一定要先自己做一遍代码审查。当你在GitHub上发起一个pull request之前,先把代码当成别人写的,自己先审查一遍。
19. 认识到做自由职业的难点不是写代码,而是其余的所有事情。销售、推广、客户支持,质量保证以及产品管理,所有这些都会花费大量时间。
20. 发现并解决更大的问题。优秀的程序员不拘泥于眼前的问题,而是清楚如何用更长远的方式彻底的解决这一类问题。
21. 深入了解一些大型开源项目的核心能让你开发时如虎添翼。如果你知道如何给你的项目打猴子补丁(Monkey Patch), 那么你将无所不能。
22. 跳过多数的会议。你的公司雇你是来写代码的,而不是谈代码的。当会议多到失控的时候,不去参加也没有任何问题。而且一旦你开始这样做,别人会更珍惜你的时间。
23.知道什么时候开始回馈。到了某个时候你需要将你的技能和经验传授给年轻的开发人员,就像你的导师当时教授你一样。
24. 能写烂代码。有时候可以当一当“胶带式程序员”。关键是随着时间推移,你需要弄清楚什么时候可以走捷径,什么时候必须走捷径。这其实是最难掌握的技能之一。
25. 礼貌地告诉别人你工作到很晚。如果你是办公室里最后一个,可以发一封简短的汇报邮件。别人一般会注意到邮件上的时间戳的。
26. 像一个领导者(Leader)一样做事,而不是老板(Boss)。老板是让别人为他工作的人,领导者是人们追随的人。做个领导者。
27. 去打打桌上足球。从长期来看,同其他开发者(或不同岗位上的同事)建立联系会比在紧巴巴的期限里交付一个功能更有价值。
28. 在压力下学习。你需要知道如何应对像系统宕机而你要负责将它复原的情况,即使一开始你完全没有头绪。
29. “Move fast and break things”别让完美主义阻止你做事。错误往往是最好的学习机会。所以别把犯错当作失败,而应该把它们当作值得学习的经历,并意识到:正是不断克服和突破这些错误,作为一个程序员,你才能不断成长起来。
㈥ 解释XP中的结对编程有哪些好处弊端在哪里
结对编程技术是一个非常简单和直观的概念,能达到事半功倍的工作效果。但是,人与人之间的合作不是一件简单的事情——尤其当人们都早已习惯了独自工作的时候。实施结对编程技术将给软件项目的开发工作带来好处,只是这些好处必须经过缜密的思考和计划才能真正体现出来。而另一方面,两个有经验的人可能会发现配对编程里没有什么技能的转移,但是让他们在不同的抽象层次解决同一个问题会让他们更快地找到解决方案,而且错误更少。
㈦ 什么是结对编程
结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员(或导航员)。两个程序员经常互换角色。
在结对编程中,观察员同时考虑工作的战略性方向,提出改进的意见,或将来可能出现的问题以便处理。这样使得驾驶者可以集中全部注意力在完成当前任务的“战术”方面。观察员当作安全网和指南。结对编程对开发程序有很多好处。比如增加纪律性,写出更好的代码等。
结对编程是极端编程的组成部分。
㈧ 结对编程中两位程序员分别充当什么角色
执行者和观察者。
如果你是执行者,当以最快的速度完成了某个程序时,往往会忽略一些问题,在这个时候,搭档就是保障。
如果你是观察者,仔细审查对方的代码,考虑可能的错误,以及如何简化和改进设计。在无法读取的时候找出bug,但是不要即时就要求删改,而是等到对方专注编程之后,进行到一个程度再整体调控会有效。例如,如果你看到现在的代码没有考虑空输入,在一张纸上写下,“添加单元测试的零输入。”
观察者和执行者都是灵活互动的,而不是机械一成不变的完成任务即可。观察者并不需要去研究小细节,但是要考虑更高的层次。例如“看起来不错,但是如何处理遇到空指针的情况?”听起来就比“好了,现在输入'如果(S == NULL){返回..}””好很多。
㈨ 结对编程的时候:如何实现在线的远程代码审查和版本控制两者如何才能相互结合在一起
其实使用版本控制工具git,就可以方便地实现了。
git还支持远程访问版本库。
这样代码撰写者与审核者,可以通过版本库来交流了。
git还支持被部署到windows和Linux上。
㈩ 国内为何很少有人做结对编程呢是确实不好还是属于中国特色
结对的代码质量应该高于单干,单干的效率可能高于结对。对于一个没有敏捷基因,看重效率大于质量的团队来说,结对的投入产出比太低,采用传统方式也就理所当然。