Ⅰ 為什麼越來越多的人不想做程序員了
作為一個在帝都混日子的程序員,經常能看到不少同事轉行。
最開始是一位年紀比較大了(快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很象一個由很多小塊拼起來的智力拚圖,單獨看每一小塊都沒有什麼意義,但拼裝好後,一幅美麗的圖畫就會呈現在你面前。