Ⅰ 为什么越来越多的人不想做程序员了
作为一个在帝都混日子的程序员,经常能看到不少同事转行。
最开始是一位年纪比较大了(快40岁,在这个行业算老了)的,回家开个小店去了。后面聊了聊,非常庆幸自己做出了辞职的决定,现在日子过得是滋润得很。
再之后,有回老家小县城干别的去了的。要准备好回县城,恐怕就很难找到IT行业的工作,除非是自己干。但小县城能干起来的活不多,加上那里这方面的人才也难找,也就基本认为是已经换行了。
最近,甚至身边有刚在17年毕业后加入来的成员,都不想干了,想要考公务员。现在究竟是一些什么原因,导致这样了了?
7.要创业了
不能光是说一些不好的,不想干了的人中,肯定有不少是想要自己出来单干的。创业也基本分为两种,一种是自己出来接单,成立公司开始为别的企业做项目。另一种是自己做产品。这两种其实都比较好起步,特别是第一种,有活就会盈利。而且成本基本只有人力和应酬,机器大部分也都是用户负责的。第二种则是比较赌的,要么很成功,要么很快烧钱结束。不管怎样,这都是不少程序员不再愿意为别人码代码的原因。
Ⅱ 为什么自己能做好的活会讨厌别人插手
【1】感情不插手
关于领导感情的事不要插手,在工作中不管在任何时候,都不要插手领导的事,即使是再小的事也不要插手,因为领导是有自己的处理方式的,所以只要是关乎到领导的事,你都不要多管闲事,特别是关于领导感情的事,你就更不要多管闲事了。
即使领导和公司的哪一个人,有一些小秘密这个时候,你就不要跟任何人说,也不要和领导讲,一定不要多管闲事,因为每个人都讨厌别人插手自己感情的事,所以只要关乎到别人隐私的事,就不要多管闲事。
如果你总是多管领导的显示时间长了很容易会让领导讨厌你,所以不该管的事一定不要管。只要是关于领导隐私的事情,你就不要向任何人透露。
【2】私事不插手
如果你在工作中发现了领导的私事,这个时候你也不要插手,因为每个人都有自己的私事,即使是关于同事的私事,你也不要插手,私事都是别人隐私的事情,所以领导的私事一般是不想被其他的员工知道的,当你发现领导的私事之后不要和其他同事说的太多。
因为每一个人都是有隐私的,而且每个人的颜色都是不想被别人知道的,所以永远不要做一个多管闲事的人,也不要做一个爱管闲事的人,只要是关于别人的私事,一定不要插手,也不要在背后议论别人的私事,这是对人最起码的尊重,职场本来就是一个是非多的地方,如果你把别人的私事给泄露出去了,很容易被更多的人知道,所以不该说的话一定不要说。
【3】升职不插手
关于升职的事也不要插手,如果领导想给某一个下属升职加薪,这个时候你就不要插手领导的事了。因为领导想对某一个人升职加薪是领导的事情,作为一个下属一定不要干预领导的事情。
很多人总是喜欢干预领导做决定,所以才不被领导喜欢,领导竟然想对某一个人升职加薪,说明领导一定有自己的考虑和打算,对于这种已经决定的事情,你就不要多嘴了,也不要多管闲事。
Ⅲ 违反规定插手干预工程建设领域行为处分规定
第一条为进一步促进行政机关公务员廉洁从政,规范工程建设秩序,惩处违反规定插手干预工程建设领域行为,确保工程建设项目安全、廉洁、高效运行,根据《中华人民共和国行政监察法》、《中华人民共和国公务员法》和《行政机关公务员处分条例》等有关法律、行政法规,制定本规定。第二条本规定适用于副科级以上行政机关公务员。第三条本规定所称违反规定插手干预工程建设领域行为,是指行政机关公务员违反法律、法规、规章或者行政机关的决定、命令,利用职权或者职务上的影响,向相关部门、单位或者有关人员以指定、授意、暗示等方式提出要求,影响工程建设正常开展或者干扰正常监管、执法活动的行为。第四条违反规定插手干预工程建设项目决策,有下列情形之一,索贿受贿、为自己或者他人谋取私利的,给予记过或者记大过处分;情节较重的,给予降级或者撤职处分;情节严重的,给予开除处分:
(一)要求有关部门允许未经审批、核准或者备案的工程建设项目进行建设的;
(二)要求建设单位对未经审批、核准或者备案的工程建设项目进行建设的;
(三)要求有关部门审批或者核准违反产业政策、发展规划、市场准入标准以及未通过节能评估和审查、环境影响评价审批等不符合有关规定的工程建设项目的;
(四)要求有关部门或者单位违反技术标准和有关规定,规划、设计项目方案的;
(五)违反规定以会议或者集体讨论决定方式安排工程建设有关事项的;
(六)有其他违反规定插手干预工程建设项目决策行为的。第五条违反规定插手干预工程建设项目招标投标活动,有下列情形之一,索贿受贿、为自己或者他人谋取私利的,给予记过或者记大过处分;情节较重的,给予降级或者撤职处分;情节严重的,给予开除处分:
(一)要求有关部门对依法应当招标的工程建设项目不招标,或者依法应当公开招标的工程建设项目实行邀请招标的;
(二)要求有关部门或者单位将依法必须进行招标的工程建设项目化整为零,或者假借保密工程、抢险救灾等特殊工程的名义规避招标的;
(三)为招标人指定招标代理机构并办理招标事宜的;
(四)影响工程建设项目投标人资格的确定或者评标、中标结果的;
(五)有其他违反规定插手干预工程建设项目招标投标活动行为的。第六条违反规定插手干预土地使用权、矿业权审批和出让,有下列情形之一,索贿受贿、为自己或者他人谋取私利的,给予记过或者记大过处分;情节较重的,给予降级或者撤职处分;情节严重的,给予开除处分:
(一)要求有关部门对应当实行招标拍卖挂牌出让的土地使用权采用划拨、协议方式供地的;
(二)要求有关部门或者单位采用合作开发、招商引资、历史遗留问题等名义或者使用先行立项、先行选址定点确定用地者等手段规避招标拍卖挂牌出让的;
(三)影响土地使用权招标拍卖挂牌出让活动中竞买人的确定或者招标拍卖挂牌出让结果的;
(四)土地使用权出让金确定后,要求有关部门违反规定批准减免、缓缴土地使用权出让金的;
(五)要求有关部门为不符合供地政策的工程建设项目批准土地,或者为不具备发放国有土地使用证书条件的工程建设项目发放国有土地使用证书的;
(六)要求有关部门违反规定审批或者出让探矿权、采矿权的;
(七)有其他违反规定插手干预土地使用权、矿业权审批和出让行为的。第七条违反规定插手干预城乡规划管理活动,有下列情形之一,索贿受贿、为自己或者他人谋取私利的,给予记过或者记大过处分;情节较重的,给予降级或者撤职处分;情节严重的,给予开除处分:
(一)要求有关部门违反规定改变城乡规划的;
(二)要求有关部门违反规定批准调整土地用途、容积率等规划设计条件的;
(三)有其他违反规定插手干预城乡规划管理活动行为的。第八条违反规定插手干预房地产开发与经营活动,有下列情形之一,索贿受贿、为自己或者他人谋取私利的,给予记过或者记大过处分;情节较重的,给予降级或者撤职处分;情节严重的,给予开除处分:
(一)要求有关部门同意不具备房地产开发资质或者资质等级不相符的企业从事房地产开发与经营活动的;
(二)要求有关部门为不符合商品房预售条件的开发项目发放商品房预售许可证的;
(三)对未经验收或者验收不合格的房地产开发项目,要求有关部门允许其交付使用的;
(四)有其他违反规定插手干预房地产开发用地、立项、规划、建设和销售等行为的。
Ⅳ 在职场上,哪些人让人很厌烦
我说说职场碰到让我感觉非常讨厌的人。
第一种,嘴碎的人。其实嘴碎,有的真的是无意的,而有些则是有目的的。我曾碰到过一个女同事。起初她待我这个新同事比较热情,所以关系处的也还可以。但是相处一段时间后,我就主动和她疏远了。原因就是这个女的嘴太碎。一开始我还觉得她只是不经意的,后来听多了再看她平时的行为,马上就明白她是在牺牲和出卖别人换取上司对她的信任。
第二种,自负的人。自信和自负一字之差,在表现上也有类似,但是实质却是完全不同。例如,我们单位有个工程师。他负责的项目从来不喜欢别人插手。因此不少人背后说他自负,领导说他没有团队精神。但是,如果仅仅从结果来看,别人一个月解决不了的问题他一个小时解决,外方迁延多年未解决的BUG他二个小时OK。从这点上说,我觉得那些背后批评他自负的人,才是真的自负。现实中我也碰到好几个这样的人,总结一下就是:1)不干事的人对做事的人评头论足;2)门外汉对专家说三道四;3)自己的工作不上心,眼睛总是盯着别人。其实,说白了就是“看人挑担不吃力”。例如,我所在办公室就有一个办事员,不太懂技术。可另外二个工程师讨论技术问题的时候(人家二个人私下讨论,不是开会),她一会儿说甲不对,一会儿又“指正”乙错了。本来,插话打扰别人就已经是非常不礼貌了,还一点情商没有的去指出别人所谓的“错误”,更让别人看不起她的是,所谓的“指正”完全是胡说八道,根本连一点常识也没有。所以,这种人其实很可悲,既被人笑话,还得罪人。有个同事,老是背后评论某个同事工作清闲,非常羡慕。结果,单位内部换岗,他正好被安排和那个同事互换岗位。第一个礼拜,他开心得像朵花;第二个礼拜就悄悄找领导想回到原来岗位。领导说,一回生二回熟,谁都是这样过来的,让他坚持。如今,都快半年多了,由于他的工作拖沓和差错,他成了众多同事吐槽的对象。
第三种,听不懂别人的话的人。听不懂别人的话,有的是理解力有问题,有的则是先入为主。有一次,我为生产部门一个提出职位进阶的员工做技术培训。因为他是上面内定的培养对象,所以上司特别重视,所以我也全程录像。培训结束后,我再三向他确认是否都明白,他回答没问题。然而,等到考核的时候,几个考官都傻了:他的做法完全是牛头不对马嘴。上司问他,谁教他这么做的。他一口咬定是我这么教他的。我实在没法解释,就直接把录像当众放了一遍。上司再次确认当时是不是如录像里的情况,他也肯定了。
Ⅳ 你认为程序员要不要接私活为什么
个人感觉,该不该接私活要看你的工作情况了,如果你在一个创业公司,天天加班,工作时间没有保证,那最好就不要接了,因为你会发现会把你搞的精疲力尽,对身心都是不好的,如果你有一个不经常加班的公司,有着充足的时间,那就不妨来考虑接一下,接一些自己能搞定的活儿也是未尚不可。
Ⅵ 程序员不喜欢你的表现
对信息的感知速度 逻辑推理能力 数学计算能力 短期记忆能力 空间视觉想象力 我的测试结果是:91% (换算成IQ,大概是121,属于正常智商)。其中逻辑推理能力达到了99%,而空间视觉想象力只有52%。 编程的工作高度依赖逻辑思维和抽象思维,所以好的程序员,逻辑推理能力一定要强,但并不要求智商水平很高。其实我一些从事人力资源工作的同事,以及从事咨询行业的朋友,智商测试结果比我还要高不少。 总的来说,只要不是太低,智商多高对学业成绩和工作表现,并没有太大的影响。反而情商对学习和工作发展有更大的意义。 程序员不喜欢你的表现2 情商,也就是情绪脑的管理水平,包括了四个方面: 对自我情绪的感知能力; 对自我情绪的管理能力; 对他人情绪的感知和理解能力; 对他人情绪的管理能力,也就是人际关系处理能力; 简单来说,就是控制自己情绪的能力,以及管理他人情绪的能力。 我们通常说一个人情商高,往往指的是他人际关系处理能力很高,但这只是情商的一个方面而已。其实控制好自己情绪的能力同样重要。比方说: 集中专注力去做好一件事情不分神; 碰到挫折以后不气馁,鼓励自己再接再厉; 碰到不爽的事情不失控,冷静的处理问题; 对取得的成绩不知足,不停追求更高的目标; 这些良好的`习惯和宝贵的品质,都和智商无关,不是由思考脑处理的,都是由情绪脑来接管,通过自我情绪管理来约束自己行为的。 看到这里,大家有没有想到,我们传统观念中的学霸,工作成绩卓越的同事,是不是都或多或少有极强的自我情绪管理能力,表现出来极其自律的品质?而这,就是高情商。 我也做过一次Thomas的TEIQ(综合商数,即情商)测试。总的分值1-100,1-30是偏低;30-70是中等;70-100是偏高。在拿到测试报告之前,我以为自己的情商测试结果一定是很低的,因为我是一个不太喜欢交际、说话又特别直的人。 但结果让我很惊讶,测试分值是69分,接近高情商区间,比身边大多数同事都高很多。 原来在自我情绪管理的方面,我差不多都在90分以上,有些甚至接近满分;但在感知他人情绪,人际交往,人际关系处理方面,我平均在30分左右。 所以我觉得,与其说程序员情商低,不如说程序员不喜欢交际、容易忽视别人的情绪,没有意识去主动管理别人的情绪。 程序员的工作挑战是很大的,面对新技术层出不穷,需要始终保持快速的学习能力;碰到线上系统的问题,要能够快速定位问题、解决bug。这些都需要强大的心理素质和自我激励能力。因此优秀的程序员,必然是一个情绪自控能力强、非常自律、而且在专业技术上有进取心的人。这样的人,情商怎么可能会低?
Ⅶ 如何面对爱插手自己工作的同事和不教什么东西又高要求的上司
1、面对爱插手自己工作的同事。既然人家手都伸到你的碗里了,如果你再没点动作,等到被别人抢了饭碗,就显得自己太无能,任人踩踏了。这样时间长了,别人就可能不认可你存在的价值,你在公司在领导面前就没有什么颜面了。事事被他插手,你工作的积极性和成就感都无从谈起。
增强职场竞争力。这里指的是你的业务能力,比如你是一个程序员,就要尽可能把技术练到更好。等到你在公司树立了权威,那么再挑剔的上司也要顾忌三分。
及时汇报工作进展。在任务进行到某一个重要阶段的时候就要向你的上司汇报情况,将目前的成果与问题说明白。而不要一直闷头做项目,直到项目结束了再等待领导的挑剔。纠正方向,越早越好。否则你花费的时间、精力代价更大。
必要的忍耐。身处职场,人人都有自己的个性与脾气。遇到挑剔的上司,难免会让你受气。如果你真的热爱自己的事业,就不要轻易放弃。将重心放到工作上,直到你的成就连领导也不敢小看。
Ⅷ 程序员开发项目的时候如何处理同事之间的意见分歧
解决平级同事之间的矛盾关系同样适用“宁得罪君子,不得罪小人”的原则,根据对同事的了解,对于肚量较小的员工,不必与他大动干戈,不明确赞同他的看法,不也反对,采用“不作为”的态势,保留自己的观点。
Ⅸ 程序员反感(讨厌、不喜欢)什么
奇葩要求,客户要做一个产品展示界面,认为阿里云这种风格很不错,老板还答应了,做不来,再见。
Ⅹ 什么极限编程
ExtremeProgramming(极限编程,简称XP)是由KentBeck在1996年提出的。KentBeck在九十年代初期与WardCunningham共事时,就一直共同探索着新的软件开发方法,希望能使软件开发更加简单而有效。Kent仔细地观察和分析了各种简化软件开发的前提条件、可能行以及面临的困难。1996年三月,Kent终于在为DaimlerChrysler所做的一个项目中引入了新的软件开发观念——XP。
XP是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。
什么是软件开发
软件开发的内容是:需求、设计、编程和测试!
需求:不仅仅是用户需求,应该是开发中遇到的所有的需求。比如,你首先要知道做这个项目是为了解决什么问题;测试案例中应该输入什么数据……为了清楚地知道这些需求,你经常要和客户、项目经理等交流。
设计:编码前,肯定有个计划告诉你要做什么,结构是怎样等等。你一定要按照这个来做,否则可能会一团糟。
编程:如果在项目截止日,你的程序不能跑起来或达不到客户的要求,你就拿不到钱。
测试:目的是让你知道,什么时候算是完成了。如果你聪明,你就应该先写测试,这样可以及时知道你是否真地完成了。否则,你经常会不知道,到底有哪些功能是真正完成了,离预期目标还差多远。
软件开发中,客户和开发人员都有自己的基本权利和义务。
客户:
定义每个用户需求的商业优先级;
制订总体计划,包括用多少投资、经过多长时间、达到什么目的;
在项目开发过程中的每个工作周,都能让投资获得最大的收益;
通过重复运行你所指定的功能测试,准确地掌握项目进展情况;
能随时改变需求、功能或优先级,同时避免昂贵的再投资;能够根据各种变化及时调整项目计划;
能够随时取消项目;项目取消时,以前的开发工作不是一堆垃圾,已开发完的功能是合乎要求的,正在进行或未完成的的工作则应该是不难接手的。
开发人员:
知道要做什么,以及要优先做什么;
工作有效率;
有问题或困难时,能得到客户、同事、上级的回答或帮助;
对工作做评估,并根据周围情况的变化及时重新评估;
积极承担工作,而不是消极接受分配;
一周40小时工作制,不加班。
这就是软件开发,除此之外再还有其它要关心的问题!
灵巧的轻量级软件开发方法
一套软件开发方法是由一系列与开发相关的规则、规范和惯例。重量级的开发方法严格定义了许多的规则、流程和相关的文档工作。灵巧的轻量级开发方法,其规则和文档相对较少,流程更加灵活,实施起来相对较容易。
在软件工程概念出现以前,程序员们按照自己喜欢的方式开发软件。程序的质量很难控制,调试程序很繁琐,程序员之间也很难读懂对方写的代码。1968年,EdsgerDijkstra给CACM写了一封题为的信,软件工程的概念由此诞生。程序员们开始摒弃以前的做法,转而使用更系统、更严格的开发方法。为了使控制软件开发和控制其它产品生产一样严格,人们陆续制定了很多规则和做法,发明了很多软件工程方法,软件质量开始得到大幅度提高。随着遇到的问题更多,规则和流程也越来越精细和复杂。
到了今天,在实际开发过程中,很多规则已经难于遵循,很多流程复杂而难于理解,很多项目中文档的制作过程正在失去控制。人们试图提出更全面更好的一揽子方案,或者寄希望于更复杂的、功能更强大的辅助开发工具(CaseTools),但总是不能成功,而且开发规范和流程变得越来越复杂和难以实施。
为了赶进度,程序员们经常跳过一些指定的流程,很少人能全面遵循那些重量级开发方法。
失败的原因很简单,这个世界没有万能药。因此,一些人提出,将重量级开发方法中的规则和流程进行删减、重整和优化,这样就产生了很多适应不同需要的轻量级流程。在这些流程中,合乎实际需要的规则被保留下来,不必要的复杂化开发的规被抛弃。而且,和传统的开发方法相比,轻量级流程不再象流水生产线,而是更加灵活。
ExtremeProgramming(XP)就是这样一种灵巧的轻量级软件开发方法。
为什么称为“Extreme”(极限)
“Extreme”(极限)是指,对比传统的项目开发方式,XP强调把它列出的每个方法和思想做到极限、做到最好;其它XP所不提倡的,则一概忽略(如开发前期的整体设计等)。一个严格实施XP的项目,其开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度。
XP的软件开发是什么样
1极限的工作环境
为了在软件开发过程中最大程度地实现和满足客户和开发人员的基本权利和义务,XP要求把工作环境也做得最好。每个参加项目开发的人都将担任一个角色(项目经理、项目监督人等等)并履行相应的权利和义务。所有的人都在同一个开放的开发环境中工作,最好是所有人在同一个大房子中工作,还有茶点供应;每周40小时,不提倡加班;每天早晨,所有人一起站着开个短会;墙上有一些大白板,所有的Story卡、CRC卡等都贴在上面,讨论问题的时候可以在上面写写画画;下班后大家可以一起玩电脑游戏……。
2极限的需求
客户应该是项目开发队伍中的一员,而不是和开发人员分开的;因为从项目的计划到最后验收,客户一直起着很重要的作用。开发人员和客户一起,把各种需求变成一个个小的需求模块(UserStory),例如“计算年级的总人数,就是把该年级所有班的人数累加。”;这些模块又会根据实际情况被组合在一起或者被分解成更小的模块;它们都被记录在一些小卡片(StoryCard)上,之后分别被程序员们在各个小的周期开发中(Iteration,通常不超过3个星期)实现;客户根据每个模块的商业价值来指定它们的优先级;开发人员要做的是确定每个需求模块的开发风险,风险高的(通常是因为缺乏类似的经验)需求模块将被优先研究、探索和开发;经过开发人员和客户分别从不同的角度评估每个模块后,它们被安排在不同的开发周期里,客户将得到一个尽可能准确的开发计划;客户为每个需求模块指定验收测试(功能测试)。
每发布一次开发的软件(经过一个开发周期),用户都能得到一个可以开始使用的系统,这个系统全面实现了相应的计划中的所有需求。而在一些传统的开发模式中,无论什么功能,用户都要等到所有开发完成后才能开始使用。
3极限的设计
从具体开发的角度来看,XP内层的过程是一个个基于测试驱动的开发(TestDrivenDevelopment)周期,诸如计划和设计等外层的过程都是围绕这些展开的。每个开发周期都有很多相应的单元测试(UnitTest)。刚开始,因为什么都没有实现,所以所有的单元测试都是失败的;随着一个个小的需求模块的完成,通过的单元测试也越来越多。通过这种方式,客户和开发人员都很容易检验,是否履行了对客户的承诺。XP提倡对于简单的设计(SimpleDesign),就是用最简单的方式,使得为每个简单的需求写出来的程序可以通过所有相关的单元测试。XP强调抛弃那种一揽子详细设计方式(BigDesignUpFront),因为这种设计中有很多内容是你现在或最近都根本不需要的。XP还大力提倡设计复核(Review)、代码复核以及重整和优化(Refectory),所有的这些过程其实也是优化设计的过程;在这些过程中不断运行单元测试和功能测试,可以保证经过重整和优化后的系统仍然符合所有需求。
4极限的编程
既然编程很重要,XP就提倡两个人一起写同一段程序(PairProgramming),而且代码所有权是归于整个开发队伍(CollectiveCodeOwnership)。程序员在写程序和重整优化程序的时候,都要严格遵守编程规范。任何人都可以修改其他人写的程序,修改后要确定新程序能通过单元测试。
5极限的测试
既然测试很重要,XP就提倡在开始写程序之前先写单元测试。开发人员应该经常把开发好的模块整合到一起(ContinuousIntegration),每次整合后都要运行单元测试;做任何的代码复核和修改,都要运行单元测试;发现了BUG,就要增加相应的测试(因此XP方法不需要BUG数据库)。除了单元测试之外,还有整合测试,功能测试、负荷测试和系统测试等。所有这些测试,是XP开发过程中最重要的文档之一,也是最终交付给用户的内容之一。
XP中的重要惯例和规则
1项目开发小组(Team)
在XP中,每个对项目做贡献的人都应该是项目开发小组中的一员。而且,这个小组中必须至少有一个人对用户需求非常清晰,能够提出需求、决定各个需求的商业价值(优先级)、根据需求等的变化调整项目计划等。这个人扮演的是“客户”这个角色,当然最好就是实际的最终用户,因为整个项目就是围绕最终用户的需求而展开的。程序员是项目开发小组中必不可少的成员。小组中可以有测试员,他们帮助客户制订验收测试;有分析员,帮助客户确定需求;通常还有个Coach(教练),负责跟踪开发进度、解决开发中遇到的一些问题、推动项目进行;还可以又一个项目经理,负责调配资源、协助项目内外的交流沟通等等。项目小组中有这么多角色,但并不是说,每个人做的工作是别人不能插手或干预的,XP鼓励每个人尽可能地为项目多做贡献。平等相处,取长补短;这就是最好的XP开发小组。
2计划项目(PlanningGame)、验收测试、小规模发布(SmallReleases)
XP开发小组使用简单的方式进行项目计划和开发跟踪,并以次预测项目进展情况和决定未来的步骤。根据需求的商业价值,开发小组针对一组组的需求进行一系列的开发和整合,每次开发都会产生一个通过测试的、可以使用的系统。
计划项目
XP的计划过程主要针对软件开发中的两个问题:预测在交付日期前可以完成多少工作;现在和下一步该做些什么。不断的回答这两个问题,就是直接服务于如何实施及调整开发过程;与此相比,希望一开始就精确定义整个开发过程要做什么事情以及每件事情要花多少时间,则事倍功半。针对这两个问题,XP中又两个主要的相应过程:
软件发布计划(ReleasePlanning)。客户阐述需求,开发人员估算开发成本和风险。客户根据开发成本、风险和每个需求的重要性,制订一个大致的项目计划。最初的项目计划没有必要(也没有可能)非常准确,因为每个需求的开发成本、风险及其重要性都不是一成不变的。而且,这个计划会在实施过程中被不断地调整以趋精确。
周期开发计划(IterationPlanning)。开发过程中,应该有很多阶段计划(比如每三个星期一个计划)。开发人员可能在某个周期对系统进行内部的重整和优化(代码和设计),而在某个周期增加了新功能,或者会在一个周期内同时做两方面的工作。但是,经过每个开发周期,用户都应该能得到一个已经实现了一些功能的系统。而且,每经过一个周期,客户就会再提出确定下一个周期要完成的需求。在每个开发周期中,开发人员会把需求分解成一个个很小的任务,然后估计每个任务的开发成本和风险。这些估算是基于实际开发经验的,项目做得多了,估算自然更加准确和精确;在同一个项目中,每经过一个开发周期,下一次的估算都会有更过的经验、参照和依据,从而更加准确。这些简单的步骤对客户提供了丰富的、足够的信息,使之能灵活有效地调控开发进程。每过两三个星期,客户总能够实实在在地看到开发人员已经完成的需求。在XP里,没有什么“快要完成了”、“完成了90%”的模糊说法,要不是完成了,要不就是没完成。这种做法看起来好象有利有弊:好处是客户可以马上知道完成了哪些、做出来的东西是否合用、下面还要做些什么或改进什么等等;坏处是客户看到做出来的东西,可能会很不满意甚至中止合同。实际上,XP的这种做法是为了及早发现问题、解决问题,而不是等到过了几个月,用户终于看到开发完的系统了,然后才告诉你这个不行、那个变了、还要增加
哪个内容等等。
验收测试
客户对每个需求都定义了一些验收测试。通过运行验收测试,开发人员和客户可以知道开发出来的软件是否符合要求。XP开发人员把这些验收测试看得和单元测试一样重要。为了不浪费宝贵的时间,最好能将这些测试过程自动化。
频繁地小规模发布软件(SmallReleases)
每个周期(Iteration)开发的需求都是用户最需要的东西。在XP中,对于每个周期完成时发布的系统,用户都应该可以很容易地进行评估,或者已经能够投入实际使用。这样,软件开发对于客户来说,不再是看不见摸不着的东西,而是实实在在的。XP要求频繁地发布软件,如果有可能,应该每天都发布一个新版本;而且在完成任何一个改动、整合或者新需求后,就应该立即发布一个新版本。这些版本的一致性和可靠性,是靠验收测试和测试驱动的开发来保证的。
3简单设计,PairProgramming,测试驱动开发,重整和优化
XP程序员不但做为一个开发小组共同工作,还以两个人为一个小开发单元编写同一个程序。开发人员们进行简单的设计,编写单元测试后再编写符合测试要求的代码,并在满足需求的前提下不断地优化设计。
简单设计
XP中让初学者感到最困惑的就是这点。XP要求用最简单的办法实现每个小需求,前提是按照这些简单设计开发出来的软件必须通过测试。这些设计只要能满足系统和客户在当下的需求就可以了,不需要任何画蛇添足的设计,而且所有这些设计都将在后续的开发过程中就被不断地重整和优化。
在XP中,没有那种传统开发模式中一次性的、针对所有需求的总体设计。在XP中,设计过程几乎一直贯穿着整个项目开发:从制订项目的计划,到制订每个开发周期(Iteration)的计划,到针对每个需求模块的简捷设计,到设计的复核,以及一直不间断的设计重整和优化。整个设计过程是个螺旋式的、不断前进和发展的过程。从这个角度看,XP是把设计做到了极致。
PairProgramming
XP中,所有的代码都是由两个程序员在同一台机器上一起写的——这是XP中让人争议最多、也是最难实施的一点。这保证了所有的代码、设计和单元测试至少被另一个人复核过,代码、设计和测试的质量因此得到提高。看起来这样象是在浪费人力资源,但是各种研究表明事实恰恰相反。——这种工作方式极大地提高了工作强度和工作效率。
很多程序员一开始是被迫尝试这点的(XP也需要行政命令的支持)。开始时总是不习惯的,而且两个人的效率不会比一个人的效率高。这种做法的效果往往要坚持几个星期或一两个月后才能很显着。据统计,在所有刚开始PairProgramming的程序员中,90%的人在两个月以后都很认为这种工作方式更加高效。
项目开发中,每个人会不断地更换合作编程的伙伴。因此,PairProgramming不但提高了软件质量,还增强了相互之间的知识交流和更新,增强了相互之间的沟通和理解。这不但有利于个人,也有利于整个项目、开发队伍和公司。从这点看,PairProgramming不仅仅适用于XP,也适用于所有其它的软件开发方法。
测试驱动开发
反馈是XP的四个基本的价值观之一——在软件开发中,只有通过充分的测试才能获得充分的反馈。XP中提出的测试,在其它软件开发方法中都可以见到,比如功能测试、单元测试、系统测试和负荷测试等;与众不同的是,XP将测试结合到它独特的螺旋式增量型开发过程中,测试随着项目的进展而不断积累。另外,由于强调整个开发小组拥有代码,测试也是由大家共同维护的。即,任何人在往代码库中放程序(CheckIn)前,都应该运行一遍所有的测试;任何人如果发现了一个BUG,都应该立即为这个BUG增加一个测试,而不是等待写那个程序的人来完成;任何人接手其他人的任务,或者修改其他人的代码和设计,改动完以后如果能通过所有测试,就证明他的工作没有破坏愿系统。这样,测试才能真正起到帮助获得反馈的作用;而且,通过不断地优先编写和累积,测试应该可以基本覆盖全部的客户和开发需求,因此开发人员和客户可以得到尽可能充足的反馈。
重整和优化(Refactoring)
XP强调简单的设计,但简单的设计并不是没有设计的流水帐式的程序,也不是没有结构、缺乏重用性的程序设计。开发人员虽然对每个USERSTORY都进行简单设计,但同时也在不断地对设计进行改进,这个过程叫设计的重整和优化(Refactoring)。这个名字最早出现在MartinFowler写的《Refactoring:》这本书中。
Refactoring主要是努力减少程序和设计中重复出现的部分,增强程序和设计的可重用性。Refactoring的概念并不是XP首创的,它已经被提出了近30年了,而且一直被认为是高质量的代码的特点之一。但XP强调,把Refactoring做到极致,应该随时随地、尽可能地进行Refactoring,只要有可能,程序员都不应该心疼以前写的程序,而要毫不留情地改进程序。当然,每次改动后,程序员都应该运行测试程序,保证新系统仍然符合预定的要求。
4频繁地整合,集体拥有代码(CollectiveCodeOwnership),编程规范
XP开发小组经常整合不同的模块。为了提高软件质量,除了测试驱动开发和PairProgramming以外,XP要求每个人的代码都要遵守编程规范,任何人都可以修改其他人写的代码,而且所有人都应该主动检查其他人写的代码。
频繁地整合(Integration)
在很多项目中,开发人员往往很迟才把各个模块整合在一起。在这些项目中,开发人员经常在整合过程中发现很多问题,但不能肯定到底是谁的程序出了问题;而且,只有整合完成后,开发人员才开始稍稍使用整个系统,然后就马上交付给客户验收。对于客户来说,即使这些系统能够通过终验收测试,因为使用时间短,客户门心里并没有多少把握。
为了解决这些问题,XP提出,整个项目过程中,应该频繁地,尽可能地整合已经开发完的USERSTORY(每次整合一个新的USERSTORY)。每次整合,都要运行相应的单元测试和验收测试,保证符合客户和开发的要求。整合后,就发布一个新的应用系统。这样,整个项目开发过程中,几乎每隔一两天,都会发布一个新系统,有时甚至会一天发布好几个版本。通过这个过程,客户能非常清楚地掌握已经完成的功能和开发进度,并基于这些情况和开发人员进行有效地、及时地交流,以确保项目顺利完成。
集体拥有代码(CollectiveCodeOwnership)
在很多项目开发过程中,开发人员只维护自己的代码,而且很多人不喜欢其他人随意修改自己的代码。因此,即使可能有相应的比较详细的开发文档,但一个程序员却很少、也不太愿意去读其他程序员的代码;而且,因为不清楚其他人的程序到底实现了什么功能,一个程序员一般也不敢随便改动其他人的代码。同时,因为是自己维护自己的代码,可能因为时间紧张或技术水平的局限性,某些问题一直不能被发现或得到比较好的解决。针对这点,XP提倡大家共同拥有代码,每个人都有权利和义务阅读其他代码,发现和纠正错误,重整和优化代码。这样,这些代码就不仅仅是一两个人写的,而是由整个项目开发队伍共同完成的,错误会减少很多,重用性会尽可能地得到提高,代码质量是非常好。
为了防止修改其他人的代码而引起系统崩溃,每个人在修改后都应该运行测试程序。(从这点,我们可以再次看到,XP的各个惯例和规则是怎样有机地结合在一起的。)
编程规范
XP开发小组中的所有人都遵循一个统一的编程标准,因此,所有的代码看起来好像是一个人写的。因为有了统一的编程规范,每个程序员更加容易读懂其他人写的代码,这是是实现CollectiveCodeOwnership的重要前提之一。
5Metaphor(系统比喻),不加班
XP过程通过使用一些形象的比喻让所有人对系统有个共同的、简洁的认识。XP认为加班是不正常的,因为这说明关于项目进度的估计和安排有问题。
Metaphor(系统比喻)
为了帮助每个人一致清楚地理解要完成的客户需求、要开发的系统功能,XP开发小组用很多形象的比喻来描述系统或功能模块是怎样工作的。比如,对于一个搜索引擎,它的Metaphor可能就是“一大群蜘蛛,在网上四处寻找要捕捉的东西,然后把东西带回巢穴。”
不加班
大量的加班意味着原来的计划是不准确的,或者是程序远不清楚自己到底什么时候能完成什么工作。而且,开发管理人员和客户也因此无法准确掌握开发速度;开发人员也因此非常疲劳。XP认为,如果出现大量的加班现象,开发管理人员(比如Coach)应该和客户一起确定加班的原因,并及时调整项目计划、进度和资源。
XP中一些基本概念的简介
UserStory:开发人员要求客户把所有的需求写成一个个独立的小故事,每个只需要几天时间就可以完成。开发过程中,客户可以随时提出新的UserStory,或者更改以前的UserStory。
StoryEstimates和开发速度:开发小组对每个UserStory进行估算,并根据每个开发周期(Iteration)中的实际情况反复计算开发速度。这样,开发人员和客户能知道每个星期到底能开发多少UserStory。
ReleasePlan和ReleaseScope:整个开发过程中,开发人员将不断地发布新版本。开发人员和客户一起确定每个发布所包含的UserStory。
Iteration(开发周期)和IterationPlan:在一个Release过程中,开发人员要求客户选择最有价值的UserStory作为未来一两个星期的开发内容。
TheSeed:第一个开发周期(Iteration)完成后,提交给客户的系统。虽然这不是最终的产品,但它已经实现了几个客户认为是最重要的Story,开发人员将逐步在其基础上增加新的模块。
ContinuousIntegration(整合):把开发完的UserStory的模块一个个拼装起来,一步步接近乃至最终完成最终产品。
验收测试(功能测试):对于每个UserStory,客户将定义一些测试案例,开发人员将使运行这些测试案例的过程自动化。
UnitTest(单元测试):在开始写程序前,程序员针对大部分类的方法,先写出相应的测试程序。
Refactoring(重整和优化):去掉代码中的冗余部分,增加代码的可重用性和伸缩性。
小结
XP的一个成功因素是重视客户的反馈——开发的目的就是为了满足客户的需要。XP方法使开发人员始终都能自信地面对客户需求的变化。XP强调团队合作,经理、客户和开发人员都是开发团队中的一员。团队通过相互之间的充分交流和合作,使用XP这种简单但有效的方式,努力开发出高质量的软件。XP的设计简单而高效;程序员们通过测试获得客户反馈,并根据变化修改代码和设计,他们总是争取尽可能早地将软件交付给客户。XP程序员能够勇于面对需求和技术上的变化。
XP很象一个由很多小块拼起来的智力拼图,单独看每一小块都没有什么意义,但拼装好后,一幅美丽的图画就会呈现在你面前。