2008年3月6日
題外話:我其實(shí)想說的是一個(gè)被人所忽視的問題。形式有沒有價(jià)值?我承認(rèn),形式化是不好的。但是這個(gè)世界有個(gè)東西,叫做儀式。
舉個(gè)例子,在國外,有種組織叫兄弟會(huì),(電影里很常見)他們的有些會(huì)設(shè)置很多可笑的考察儀式來考察你夠不夠入會(huì)的資格。有些會(huì)有危險(xiǎn),有些只是純粹搞出些恐怖氣氛嚇你看你會(huì)不會(huì)被嚇退。這種東西有價(jià)值嗎?心理學(xué)告訴我們,設(shè)置準(zhǔn)入門檻可以提高組織成員的忠誠度。如果你覺得這玩藝太可笑了,給取消掉。你會(huì)莫名其妙的發(fā)現(xiàn)后來加入的人對(duì)組織的認(rèn)可度忠誠度都不高。這就是儀式的價(jià)值。
今天說的是Retro,全名retrospective,中文名“回顧會(huì)議”,網(wǎng)上有很多相關(guān)文章,就不再這里贅述了。這里提到的Retro是最常見的一種模式,分Well, Less Well, Puzzle三個(gè)維度的模式。該模式的Retro的特點(diǎn)是會(huì)讓我們更多的關(guān)注less well,關(guān)注我們做的不好的那些。這點(diǎn)有好有壞。本文只揭示它好的一面。做為補(bǔ)充,還有一種海星圖的模式,感興趣的人可以自己查詢。
我個(gè)人認(rèn)為retro是敏捷開發(fā)中很重要的一道防線。是團(tuán)隊(duì)健康度的晴雨表,是溝通的橋梁,是共識(shí)建立的契機(jī),是改進(jìn)的開始。
對(duì)于團(tuán)隊(duì)本身就存在大量問題,而這些問題可能都在敏捷方法的問題域里時(shí)。Retro是一個(gè)很好的發(fā)力點(diǎn)。他的效果可能沒有持續(xù)集成那么立竿見影,往往是潤物細(xì)無聲。他可以幫我們把痛點(diǎn)暴露出來,但是不一定是根本問題。就像醫(yī)生看病也得先問你哪不舒服。而Retro就能幫團(tuán)隊(duì)說出來哪不舒服并達(dá)成共識(shí)。某種意義上講,它是個(gè)報(bào)警器。
如果已經(jīng)采用了大量敏捷實(shí)踐的團(tuán)隊(duì)呢?比如我們團(tuán)隊(duì),在我們團(tuán)隊(duì)的開發(fā)中,我們一直推進(jìn)著各種改進(jìn),期望讓我們的工作更有效率,交付更多價(jià)值,同時(shí)也讓我們的生活更美好一些,這是一件雙贏的事情。 可是我們也要看到改進(jìn)是需要成本的,而且也是有風(fēng)險(xiǎn)的,所以有的時(shí)候難以推動(dòng)。對(duì)于客戶( 有時(shí)是PM等內(nèi)部角色)來說,他討厭一切成本和風(fēng)險(xiǎn),而更感興趣的是新功能,當(dāng)碰到短視的負(fù)責(zé)人,或者交付壓力占了上風(fēng)的時(shí)候,難以推動(dòng)這點(diǎn)感覺尤為明顯。不過商業(yè)社會(huì)里競(jìng)爭(zhēng)如此激烈,這也無可厚非。雖然我們也知道出來混,欠下的遲早是要還的。
不過這不是我們今天討論的角度。今天我們站在推動(dòng)改進(jìn)的角度來看這個(gè)問題,開發(fā)時(shí),在開發(fā)第一線的我們往往是第一個(gè)了發(fā)現(xiàn)開發(fā)中的問題,然后我們會(huì)發(fā)現(xiàn)改進(jìn)最困難的是溝通,明明這是個(gè)問題,但是讓各方都接受這個(gè)問題并改進(jìn)它需要證據(jù),需要溝通,需要資源,最重要的需要時(shí)間。我曾眼睜睜得看著客戶只是加幾臺(tái)機(jī)器提升持續(xù)集成的構(gòu)建效率這件事竟然推動(dòng)了近一年才成功,那么在這個(gè)問題被發(fā)現(xiàn)但不能改進(jìn)的時(shí)間里,團(tuán)隊(duì)會(huì)怎樣呢?首先士氣會(huì)被打擊,接著如果問題長期不能解決并影響了工作效率,一種不愿追求卓越的氣氛會(huì)漸漸感染團(tuán)隊(duì)成員,進(jìn)而使得大家會(huì)在其他實(shí)踐上表現(xiàn)漸漸變差。( 相對(duì)于每個(gè)人自己,而不是團(tuán)隊(duì)其他成員)改進(jìn)的意愿也會(huì)不同程度的變低。這符合
破窗效應(yīng)。
這時(shí)候,很容易出現(xiàn)的一個(gè)傾向會(huì)是干脆我們不要retro了,反正也改進(jìn)不了,完全是浪費(fèi)時(shí)間。 這就成了自毀長城。不能干因?yàn)閳?bào)警器老響就把報(bào)警器拆了的事。出來混欠下的始終要還,學(xué)鴕鳥是沒用的。當(dāng)retro不能給我們提供更多實(shí)際改進(jìn)價(jià)值的時(shí)候,它還能提供最后一個(gè)價(jià)值:懺悔的儀式。
曾經(jīng)一直不明白西方人為什么定期去教堂懺悔,周周去,周周都有值得懺悔的,甚至犯過的錯(cuò)還有很多類似的。看起來沒什么用。但這就像房間,天天打掃天天都有的打掃的,心靈的房間也是一樣。一位有信仰的朋友告訴我,定期經(jīng)常向神懺悔會(huì)更愿意改進(jìn)自己,如果一段時(shí)間不去對(duì)自己的要求就會(huì)放松。人的心理就是這么奇怪。這揭示了一個(gè)道理,人是會(huì)逐漸放松對(duì)自己的要求的,所以需要一種手段讓我們保持對(duì)自己的高標(biāo)準(zhǔn)。
我個(gè)人認(rèn)為retro就是一個(gè)很好的手段。尤其我前面說過了,這里討論的這種Retro的模式的特點(diǎn)就是讓我們更關(guān)注于Less Well。定期,經(jīng)常,回顧,反思。當(dāng)我們無法變得更好的時(shí)候可以幫助我們反觀團(tuán)隊(duì)自身,不要變得更差。讓破窗效應(yīng)難以發(fā)生。
(本來只是想寫一個(gè)敏捷團(tuán)隊(duì)碰到讓人沮喪的情況時(shí)Retro提供的價(jià)值,結(jié)果越寫越多,有點(diǎn)跑題了⋯⋯)
在我們的開發(fā)中,有些實(shí)踐的價(jià)值是容易感受到的,比如重構(gòu),比如TDD,比如持續(xù)集成。
有些實(shí)踐的價(jià)值則不容易感受到,比如Retro(回顧會(huì)議),比如IPM(迭代計(jì)劃會(huì)議)。
以IPM為例,在我們的IPM上我們一般會(huì)做兩件事Kick off cards和Estimation。也就是選擇下個(gè)迭代要做的卡和評(píng)估每張卡的點(diǎn)數(shù)。這兩件事情似乎第一件事沒必要所有人都參與,第二件事感覺一定程度上是瞎蒙,尤其是一群人來蒙,顯得尤為的不靠鋪。而且似乎我們IPM就是為了選出下個(gè)迭代能做完的卡,就是為了知識(shí)傳遞,就是為了給客戶可視的數(shù)據(jù)和計(jì)劃,讓他們心理好過。
假設(shè)說我們不必所有人都參與就能保證選出適合下個(gè)迭代做的卡,我們通過每日Code Review等實(shí)踐使得每個(gè)人都不會(huì)缺少相關(guān)卡的知識(shí),而客戶也不特別在意我們的進(jìn)度(或者說我們的進(jìn)度他們總是滿意),是不是我們就不需要IPM了?是不是我們就不需要集體Estimation不需要集體Kick off了?
實(shí)際上,我們的項(xiàng)目就符合前面的假設(shè),在項(xiàng)目的最后,我們真的取消了IPM。這時(shí),才感覺出來IPM的價(jià)值。
整個(gè)團(tuán)隊(duì)的效率慢慢開始下降。對(duì)于目標(biāo)的理解開始不一致。雖然團(tuán)隊(duì)整體的表現(xiàn)并不差,雖然沒有出現(xiàn)任何實(shí)質(zhì)的問題,但容忍度低的人開始不舒服。跟團(tuán)隊(duì)自己以前的狀態(tài)比,確實(shí)有點(diǎn)退化的感覺。怎么會(huì)這樣呢?
每當(dāng)說到這種狀態(tài)出現(xiàn)在敏捷團(tuán)隊(duì)中的時(shí)候,我最常聽到就是人的問題,態(tài)度問題等等說法。其實(shí)我一直覺得,如果追究態(tài)度,空談人的問題有用的話,我朝應(yīng)該是世界第一而不是那個(gè)人人自我的美帝。人一直是有問題的,不然要管理學(xué)干什么?敏捷里提倡自組織團(tuán)隊(duì),自我管理。但決不是松散組織,不管理。自組織它也需要組織,自我管理它也是管理。像IPM這樣的活動(dòng),就是管理的一部分。
IPM上做的兩件事,看起來完全不靠鋪,實(shí)際上卻非常有價(jià)值。整個(gè)IPM活動(dòng)就是一個(gè)承諾的儀式。像古代行軍打仗前的誓師大會(huì)一樣,可以調(diào)動(dòng)起團(tuán)隊(duì)在下一個(gè)迭代中的士氣。通過集體參與評(píng)估和制定計(jì)劃,通過各個(gè)角色的共同作用,使得每個(gè)人都參與到整個(gè)計(jì)劃制定中來。自然而然的對(duì)下一個(gè)迭代許下承諾。而承諾一旦許下,就會(huì)像一個(gè)耳語的惡魔,暗中催促著人們的行為與其保持一致。
生活在我朝的人們,似乎對(duì)承諾這個(gè)東西的效果是完全不相信的。這也難怪,不過出于眾所周知的原因,咱不談我們?yōu)樯恫恍湃纬兄Z。從心理學(xué)的角度,承諾是有實(shí)際意義的。《影響力》“第三章 承諾和一致”中就講了這個(gè)極為簡(jiǎn)單卻極為有用的心理學(xué)原理:人人都有一種言行一致(同時(shí)也顯得言行一致)的愿望。
其中有很多很有趣的實(shí)驗(yàn),揭示了承諾的力量。 感興趣的人推薦讀一讀。里面有個(gè)小例子提到,兩個(gè)星期前一個(gè)愿意在自家的草地上插一個(gè)小牌子為交通安全做點(diǎn)貢獻(xiàn)的小承諾,使得該社區(qū)76%的人都在兩個(gè)星期后接受了在自家草地上插一個(gè)擋風(fēng)景的大牌子的請(qǐng)求。而對(duì)照社區(qū)只有17%。巨大的反差可以讓我們看到承諾的力量。
當(dāng)然我們對(duì)承諾的不信任也是有道理的,當(dāng)承諾真的難以完成的時(shí)候,幾乎所有人都會(huì)違背承諾。在傳統(tǒng)的瀑布式開發(fā)過程中,使得計(jì)劃這種承諾難度大大上升,而可信度也就大大下降。這也是為什么我們需要迭代的原因。
一個(gè)成功的企業(yè)需要積累。當(dāng)你坐在電腦旁,看著一個(gè)運(yùn)行達(dá)十年之久的軟件的源碼時(shí),相信我,你一定會(huì)更深刻的感受到積累這個(gè)詞,確確實(shí)實(shí)是個(gè)中性詞。
軟件多種多樣的功能支撐著一個(gè)企業(yè)帝國的運(yùn)轉(zhuǎn),它源源不斷的在為這個(gè)帝國創(chuàng)造著財(cái)富,毫無疑問它隨著時(shí)間積累了很多掙錢的能力。可是如
同歷史上其
他的帝國一樣,在繁華的背后,很多黑暗的東西同樣隨著時(shí)間積累了下來,臨時(shí)性的策略被固化在核心流程中,為擴(kuò)展留下的空白成了每次擴(kuò)展必須繞行的彎路,精妙的手法隨著時(shí)間的變遷顯得復(fù)雜過時(shí),分工協(xié)作使得同樣事情得處理方式大不相同,預(yù)先的設(shè)計(jì)又使得本不相同的東西硬造成了相同的樣子,管理的疏忽使得簡(jiǎn)單的功能用了復(fù)雜的模式實(shí)現(xiàn)。
坐在代碼面前,仿佛在讀一本被囚禁了靈魂的魔書,你能在注釋中讀出興奮與痛苦,你能在代碼中看到驕傲與彷徨。每當(dāng)完成一次重構(gòu)就像解救了一個(gè)被困的靈魂。那代碼又仿佛一個(gè)人的臉,你可以看到各個(gè)技術(shù)歷史階段在它臉上留下的歲月痕跡。暢游在代碼中,有些時(shí)候我們好像穿梭在時(shí)光的河流中,你能看到一個(gè)愚昧的風(fēng)格是如何從一個(gè)有價(jià)值的需求中演變而來。如今再看,仿佛一群羊在不斷的跳過一個(gè)早已不存在的柵欄一樣詭異。而有些時(shí)候,我們只能看到一些遺跡,原野中矗立的大石柱根本無法自己告訴我們他們到底是為何矗立在那里的。以及移動(dòng)他們會(huì)不會(huì)帶來什么災(zāi)難。
能力很強(qiáng),問題很多。是任何一個(gè)已經(jīng)有歷史的公司都會(huì)有的。軟件不過是公司的一個(gè)表現(xiàn)方面。就像一個(gè)擁有完整公司基因的細(xì)胞。準(zhǔn)確的說,任何時(shí)候,任何公司都不可能沒有問題的。但是何時(shí)解決?這個(gè)問題就跟什么時(shí)候重構(gòu)一樣,答案也是一樣,隨時(shí)。解決問題的時(shí)機(jī)會(huì)影響解決問題的難度。越晚解決,就越難解決。說起來容易,做起來談何容易。是的,解決問題總是需要鼓勵(lì)的,但是談何容易四個(gè)字卻很容易瓦解我們前進(jìn)的意志。低下頭埋到土里,是可以讓一切都清靜了。但不管我們做不做,甚至于即便我們?cè)谧觯瑔栴}也永遠(yuǎn)不會(huì)停止它產(chǎn)生并進(jìn)化的腳步。面對(duì)問題,只有應(yīng)戰(zhàn),沒有第二條路可以走。經(jīng)濟(jì)危機(jī)教會(huì)了很多企業(yè)只顧賺錢而忽略企業(yè)的問題會(huì)有什么后果。我相信有很多人會(huì)選擇遺忘并在遙遠(yuǎn)的未來繼續(xù)重犯同樣的錯(cuò)誤,但是我也相信,也會(huì)有很多人會(huì)選擇記住并把教訓(xùn)提煉成一種知識(shí)或制度,讓后世人學(xué)會(huì)警惕。
進(jìn)來聽聞最大的CMM堡壘DNV要搞敏捷。大票的獵頭紛紛出動(dòng),四處搜羅敏捷咨詢師。使敏捷這個(gè)本來只有小眾在實(shí)踐的一類開發(fā)方法陡然變得要大眾化了。本來以為是件好事。卻在昨天看到z叔大喊,敏捷要倒。當(dāng)時(shí)只是覺得有點(diǎn)道理。晚些時(shí)候卻切身體會(huì)到了。
收到某非知名公司舉辦的scrum培訓(xùn)的郵件。頓時(shí)心里一緊。在這個(gè)時(shí)間,用這個(gè)操作手法有點(diǎn)可怕,各培訓(xùn)公司都找到了敏捷里面最好切入的一個(gè)點(diǎn)---Scrum。
Scrum是個(gè)筐,什么都能往里裝啊。為什么這么說呢,他并不能算是一個(gè)完整的開發(fā)方法。只是一個(gè)框架。不領(lǐng)會(huì)敏捷的精神,沒有其他具體的開發(fā)方法,他只能是一個(gè)大面的東西,如果用上這種東西就號(hào)稱敏捷了。那真是可怕。而且,scrum證書也在這波浪潮中量產(chǎn)。一個(gè)人,花幾千塊錢,上兩天的課,拿著一張紙就號(hào)稱敏捷了。沒辦法,誰讓咱們崇拜證書這種看得見摸得著的東西呢。但這樣大量量產(chǎn)出來的敏捷項(xiàng)目經(jīng)理。一實(shí)踐肯定不對(duì)勁,就會(huì)用自己的理解去曲解敏捷。然后大家認(rèn)為敏捷就是早晨開個(gè)會(huì),月末開個(gè)會(huì)。最后的結(jié)果就是你在罵敏捷,我在夸敏捷,可是你嘴里的敏捷和我嘴里的敏捷根本就不是一個(gè)東西。
記得曾經(jīng)見過一個(gè)CMMI的咨詢師,張口閉口卡耐基梅隆,一付兄弟當(dāng)年在英國的時(shí)候的樣子。生搬硬套的CMMI流程。最后搞的那套流程根本不可操作,大家都為流程湊數(shù)據(jù)。當(dāng)下如果大家都從CMMI倒向Scrum,這種人咋生存呢?會(huì)掛掉?錯(cuò),搖身一變,舉起敏捷大旗開始搖旗吶喊。沒這兩下子怎么能在忽悠界縱橫這么多年呢。像這樣的人都來搞敏捷了。敏捷不臭,那除非老天開眼了。那原來搞敏捷的人呢?本來就是小眾,在這大浪里面,估計(jì)很快就看不見了。。。。從今開始,我還是少說兩句敏捷了。。。
我習(xí)慣于在午飯后午睡一下。上班時(shí)午睡,只能是趴著睡。最近才注意到,寫字樓的空調(diào)大多是從上往下吹得,所以這個(gè)時(shí)候整個(gè)后背是暴露給空調(diào)的。從中醫(yī)上講,背上主要是兩條經(jīng)絡(luò)。督脈和膀胱經(jīng)。其中膀胱經(jīng)主人體一身之陽氣。號(hào)稱人體最大的排毒通道。膀胱經(jīng)不通的人可能會(huì)怕風(fēng)怕冷,容易得濕疹等病,常年排毒不暢,可能會(huì)導(dǎo)致更多疾病。
體的經(jīng)絡(luò)不管哪一條,都怕六邪,風(fēng)濕熱火燥寒。對(duì)于處處空調(diào)的現(xiàn)代人,火燥熱遠(yuǎn)不如風(fēng)濕寒需要擔(dān)心。比如像這樣天天把后背暴露給空調(diào),而且是在睡覺這種放松狀態(tài)下。就等于天天讓空調(diào)的風(fēng)寒入侵膀胱經(jīng)。加上很多辦公室都有加濕器。那濕也是跑不了。當(dāng)然,人體自身有防御的能力,肯定不會(huì)馬上出問題的。但是天天這么搞,難免不出問題。上個(gè)禮拜加了幾天班覺得左肋靠近腋窩的地方疼。周末好一點(diǎn)了,今天下班前又痛了。引起我一點(diǎn)警惕。所謂猝死,大概就是這么一點(diǎn)點(diǎn)演變來的。干咱們這行撐不死可也別累死。
溫?zé)峥梢则?qū)寒,我想把背緊靠一會(huì)靠背取暖。這時(shí)發(fā)覺我的椅子后背只到肩胛骨中部。好像很多公司的椅子都是這樣的,不能很好的護(hù)住背部(除了老板椅。老板椅上面似乎還要往前多出一塊來,連后脖頸子都能護(hù)住。倒是很養(yǎng)生。)
所以,辦公室可以放一件外衣,睡覺的時(shí)候披上來防風(fēng)防寒。另外,可以偶爾的去做一些保健。比如拔罐,刮痧等。基本上背部拔罐就是在疏通膀胱經(jīng)。背部刮痧也是。不過要注意的是:
一,拔罐的話,頻率不宜過高,拔罐是排毒比較猛的一種方式,體內(nèi)毒多的時(shí)候倒是在排毒,毒少了以后,排的就不只是毒了。有一種說法,拔得太頻繁反而會(huì)有損陽氣。我比較認(rèn)可這種說法。一個(gè)月一次或者隔一個(gè)月一次為宜。拔罐后六個(gè)小時(shí)不能洗澡。
二,刮痧倒是可以頻繁點(diǎn),但最好找干凈的地方或讓自己家人做。肉少的地方盡量少刮。最近發(fā)現(xiàn)一種叫魔蝎刷的東西,個(gè)人感覺比刮痧板好用,可以替代刮痧板刷背。刮痧后半小時(shí)不能洗澡。從時(shí)間上也能看出哪個(gè)比較猛。
最后,多多運(yùn)動(dòng)是最好的保健方法。自我鍛煉總是要?jiǎng)龠^別人伺候。愿程序員們都能度過一個(gè)健康的夏天。
沒“貢
獻(xiàn)”的田鼠
在田野里,住著三只田鼠。
秋天到了,三只
田鼠開始準(zhǔn)備過冬的東西。
第一只田鼠每天都到田野上運(yùn)糧食,準(zhǔn)備冬天食用。
第二只田鼠每天都到田野上運(yùn)野草,準(zhǔn)備冬天取
暖。
而第三只田鼠每天都跑出去游玩,對(duì)糧食和野草一點(diǎn)兒也不關(guān)心,好像冬天永遠(yuǎn)也不會(huì)到來一樣。
前兩只田鼠勸它為即將到
來的冬天多準(zhǔn)備一些必要的東西,但它只是笑笑,仍然每天都出去游玩,經(jīng)常玩到天黑才回來。
寒冷的冬天很快到來了,三只田鼠住在洞里,餓了
就吃第一只田鼠運(yùn)回來的糧食,冷了就用第二只田鼠運(yùn)回來的野草取暖,而毫無貢獻(xiàn)的第三只田鼠自然也得到了前兩只田鼠的嘲笑。
然而日子一
天天地過去,每天都無所事事地待在洞里,做著同樣的游戲,吃著同樣的糧食,三只田鼠漸漸厭煩起來,感覺到了無聊的空虛。
這時(shí),第三只田鼠
開始為前兩只田鼠講故事,講它在秋天出去游玩的時(shí)候見到的許多新鮮有趣的故事,前兩只田鼠聽得津津有味,生活開始重新變得充實(shí)而有意義。
作
為感謝和報(bào)答,前兩只田鼠經(jīng)常把自己的糧食和野草挑出一些送給第三只田鼠。
原來,有些貢獻(xiàn)并不是從一開始就能看得出來的,然而我們卻經(jīng)常
因?yàn)闀簳r(shí)看不到它的“用處”就舍棄了它。
這篇文章是受啟發(fā)于要求我寫一些設(shè)計(jì)和spec的文檔的面試要求。趁這個(gè)機(jī)會(huì)整理整理自己的思路。
什么是軟件開發(fā)呢,最常見的一種說法是,軟件開發(fā)是一門藝術(shù)。我覺得更現(xiàn)實(shí)的講,軟件開發(fā)應(yīng)該是一種生產(chǎn)。跟其他所有的生產(chǎn)一樣。要考慮成本和收益。收益這塊,跟其他很多外部因素相關(guān),對(duì)開發(fā)者或者說開發(fā)者的管理者來說無法控制,開發(fā)者從職業(yè)的角度出發(fā)更多需要考慮的是成本。這也是我們職業(yè)的目標(biāo)。
軟件這種產(chǎn)品的生產(chǎn),材料本身的損耗也就是電腦,電費(fèi),基本屬于沉沒成本。不會(huì)因?yàn)樵蹅內(nèi)魏闻Χ淖儭#ㄒ膊皇峭耆荒芨淖儯荒苁亲兌唷!!!#┠敲矗畲蟮某杀緭p耗在時(shí)間上。一方面,程序員都屬于高薪人士(相對(duì),相對(duì))。每一天的損耗都意味著大量的錢打水漂了。另一方面,隨著時(shí)間的推移,商業(yè)價(jià)值在降低,風(fēng)險(xiǎn)卻在增加。
對(duì)軟件開發(fā)來說,需求實(shí)現(xiàn)速度,應(yīng)該說是很重要的,但是實(shí)現(xiàn)速度本身并不是考量的標(biāo)準(zhǔn)單位。作為最大成本考量標(biāo)準(zhǔn)的時(shí)間,從對(duì)她的消耗來看:除去簡(jiǎn)單的功能點(diǎn)實(shí)現(xiàn)需要,需求的變化浪費(fèi)的時(shí)間則更客觀。而無數(shù)實(shí)例證明,我們?cè)谛枨蠓治鲭A段投入時(shí)間誠然可以減少需求的變化,但是并不能達(dá)到我們滿意的高度,所以對(duì)需求變化的反應(yīng)也是我們的重要標(biāo)準(zhǔn)。
敏捷這個(gè)詞,我覺得非常好。做為一門方法學(xué),從名字上就說明了軟件開發(fā)需要關(guān)注的兩個(gè)重要的點(diǎn):需求實(shí)現(xiàn)速度和對(duì)于需求的反應(yīng)速度。當(dāng)然,說到這里有點(diǎn)虛了。我想,回歸到不太實(shí)際的本質(zhì),能更好的指導(dǎo)我們的實(shí)踐。Rails框架為什么這么火熱,恰恰因?yàn)樗龅搅诉@兩點(diǎn)。我們想想,為什么要設(shè)計(jì)?我讀過讓人舒爽的代碼,也讀過看著讓人想吐的代碼。拋掉個(gè)人的感情因素,這兩種代碼有什么區(qū)別呢?大部分讓我想吐的代碼里出現(xiàn)的是一些重復(fù)的代碼,看起來稍有不同,卻不肯費(fèi)點(diǎn)心思除掉這些“壞味道”。重復(fù)代碼的問題在哪里呢?最大的問題就是隨著代碼量的增多,工作量的與日劇增。維護(hù)量也會(huì)增大。而且,復(fù)雜度絕對(duì)不是O(n)。其實(shí)我常常覺得,我們最早學(xué)程序的時(shí)候要學(xué)算法與數(shù)據(jù)結(jié)構(gòu)。其實(shí)這個(gè)課程很早就告訴了我們編程最重要的兩塊:算法,結(jié)構(gòu)。好的設(shè)計(jì)就是好的結(jié)構(gòu)。可擴(kuò)展,可維護(hù),最起碼,可以分工。
好的設(shè)計(jì)可以大量的減少代碼。減少代碼就意味著成本的降低。也就是文初說的,我們職業(yè)的目標(biāo)達(dá)到了。但是現(xiàn)實(shí)往往不是那么美好,雖然我們有很多OO的設(shè)計(jì)模式,我們有很多最佳實(shí)踐。但是在現(xiàn)實(shí)中,我們往往需要妥協(xié)。一般是三個(gè)原因:性能、穩(wěn)定性、各種接口,在左右著我們。其實(shí),很多時(shí)候,這也是最考驗(yàn)一個(gè)程序員的功力的地方。如何在這三個(gè)沼澤上跳舞,才是軟件開發(fā)真正可以被稱之為藝術(shù)的地方。而怎么做,則只能靠一行一行的代碼鍛煉,一篇一篇文章和文檔整理經(jīng)驗(yàn),沒法一句半句說得清楚的了。
晨會(huì)是Scrum里的一個(gè)實(shí)踐。
最近才意識(shí)到,這種東西一點(diǎn)都不時(shí)髦。很多理發(fā)店,飯店,他們?cè)绯慷加羞@個(gè)。今天在大鴨梨看到他們的晨會(huì),頗有感覺。看著他們都站在那里,覺得跟站立式晨會(huì)差不多。不同的是他們的員工,年齡層比較低,處于還比較毛糙的年齡。也就是說,不僅需要教育怎么做事,還得教他們?cè)趺醋鋈恕K栽谶@個(gè)晨會(huì)上,經(jīng)理教育他們說,不要混日子,十年后,你們?nèi)绻麤]做出什么來,一生就這么過去了。跟他們說,要當(dāng)面說壞話,背后說好話。也就是進(jìn)行人性和行事風(fēng)格上的教育,也可以說是一種文化上的教育。經(jīng)理教育完,幾個(gè)像老員工的來說加單要寫名字,不要怕寫了名字會(huì)怎么著等等。雖然是端茶倒水送飯,但是需要注意的還真是不少。前臺(tái),服務(wù)員,后廚,這之間也是需要溝通規(guī)范,任何一個(gè)溝通不符合規(guī)范,就會(huì)出亂子。
比較起來,敏捷的實(shí)踐只是要求個(gè)人說自己做過什么,要做什么,有什么問題。不過我發(fā)覺,有些話,其實(shí)是應(yīng)該在晨會(huì)的時(shí)候應(yīng)該強(qiáng)化與灌輸,不見得是每天,但是隔三差五的就該講講。關(guān)于工作態(tài)度,配合。這是員工培訓(xùn)的最好時(shí)機(jī)。在這里用力,雖然不會(huì)有奇跡般的效果,但每隔一段時(shí)間肯定會(huì)有一點(diǎn)切實(shí)的進(jìn)步。企業(yè)與企業(yè)都是不同的,有自己的氛圍,那所謂的文化,就是企業(yè)的性格。員工與員工更是不同。但是企業(yè)喜歡的員工其實(shí)都很相似。不喜歡的員工卻各有各的不同。所以企業(yè)經(jīng)常培訓(xùn)員工。但我是不相信給員工搞一兩次課可以改變一個(gè)人的。有天在快餐店,聽到一個(gè)老銷售教育一個(gè)新銷售說,鴨子聽鷹講怎么飛。上完課,鷹飛回家了,鴨子還是走回家的。不能飛的鴨子又不缺什么,野鴨就能飛。所以,僅僅幾天的員工培訓(xùn)能改變什么呢?不能指望著幾天就能給公司制造出好用的員工來。公司對(duì)教育的重視不夠說小了是不把自己的錢當(dāng)回事,說大了其實(shí)是社會(huì)責(zé)任的缺失。
你們10年后還一事無成,這是給員工灌輸?shù)囊环N危機(jī)意識(shí)。要當(dāng)面說壞話,背后說好話,這是對(duì)員工進(jìn)行人性的教育。這像是領(lǐng)導(dǎo)說的話,有人說,領(lǐng)導(dǎo)兩個(gè)字是領(lǐng)袖+導(dǎo)師。身為導(dǎo)師不引導(dǎo)人光明磊落,就不能怪人言可畏。有喜歡以流言御人的領(lǐng)導(dǎo)才有大量到處嚼舌頭的下屬。現(xiàn)代企業(yè)不是古代的官僚衙門。該專心搞的是經(jīng)營而不是政治。
散會(huì)后,員工繼續(xù)去工作了。你說這個(gè)晨會(huì)有什么作用嗎?不知道,就像一顆石頭扔進(jìn)了平靜的水里。一陣激蕩過后我們什么都看不到了。但是,我想,日積月累,石頭扔得多了。在你不注意的時(shí)候,水面會(huì)悄悄上升的。
敏捷作為方法學(xué),其實(shí)還是比較虛的。哪怕是其中比較實(shí)的最佳實(shí)踐,也是非常難以掌握運(yùn)用的。原因其實(shí)很簡(jiǎn)單。人要想通過敏捷偷懶是絕對(duì)不可能的。敏捷的實(shí)施,在最初肯定是非常累的。因?yàn)楦淖兛偸峭纯嗟摹;仡欂S田的歷史,他們?cè)趧?chuàng)造TPS的時(shí)候,工人們也是想把大野耐一的那些破爛東西都給砸咯。
不過很多時(shí)候,痛苦是幸福的開始。一個(gè)人完成很多人合作完成的工作,咋看起來是非常勞累的。但是習(xí)慣了,也就那樣了。TPS里面基礎(chǔ)就是讓一個(gè)工人具備兩項(xiàng)以上的技能。程序員也是一樣。不能為自己的懶惰找理由。大家都是人,都想懶,但是今天懶了,總會(huì)有一天被逼著勤快。就好像沒有時(shí)間鍛煉,就有時(shí)間生病一樣。只有每個(gè)團(tuán)隊(duì)成員都變得敏捷了,敏捷的方法才有意義。
時(shí)間。。。曾經(jīng)是我最害怕的東西。。。如今卻變成了最喜歡的東西。。。
這個(gè)世界紛紛擾擾有那么多的真實(shí)與虛假
只有時(shí)間能把它們分離開來。
時(shí)間,跟所有自然的偉力一樣,從來都是緩緩的,慢慢的顯示著自己的力量。
人可能等不及看到它的效果,可它卻一直履行著自己的職責(zé)
一切浮于表面的虛幻,終會(huì)在時(shí)間的侵蝕下消逝,只留下最真實(shí)的東西。
google上搜這個(gè)詞,搜到的很多是征文,和一些扯淡的文章。
跟這篇文章一比就差的比較遠(yuǎn)咯:
http://www.dapenti.com/blog/more.asp?name=xilei&id=15410
節(jié)選精華“中國夢(mèng)”解釋如下:
如果有人問什么是中國夢(mèng)?我說,只要你看看這個(gè)國內(nèi)的精英怎么選擇的,你就知道了:
【1】讀書,考上清華北大,然后,到外企工作,出國,拿綠卡;
【2】唱歌跳舞,不惜一切代價(jià)成名,出國,變更國籍;
【3】當(dāng)官,貪污腐敗,找機(jī)會(huì)逃跑到國外,躲起來過一擲千金的日子;
【4】做生意,賺到足夠的錢,然后,出國定居,想生幾個(gè)孩子就生幾個(gè)孩子,讓小孩都在國外上大學(xué)。
BlogJava,應(yīng)該是一個(gè)技術(shù)博客。倒回來看自己寫的東西,卻感覺離題越來越嚴(yán)重。
對(duì)技術(shù)的熱情在衰退。所寫的技術(shù)相關(guān)的東西越來越少。
從Java到Flex到Grails。技術(shù)照理增長了不少,人卻越來越迷茫。
對(duì)文科的興趣在增長,已然超越了對(duì)程序設(shè)計(jì)的興趣。
可是做的工作又不得不繼續(xù)從事程序設(shè)計(jì)的學(xué)習(xí),不然一旦失業(yè)了,我又能做什么呢?
所以每當(dāng)看一些文科的書,就會(huì)有一種罪惡感。人活成這樣,不得不說是一件悲哀的事情。
其實(shí)心里明白,所謂悲哀在旁人看來不過是一種吃飽了撐著的心態(tài)。
買了域名和空間,準(zhǔn)備換一個(gè)獨(dú)立博客了。到時(shí)想寫些什么就寫些什么了,也不用擔(dān)心站方有問題。
最近一直在看跟豐田生產(chǎn)體系有關(guān)的書,得到一些很有意思的知識(shí)點(diǎn)
- 剛明白原來這些個(gè)名詞他們是JIT->TPS->Lean->Agile這么一個(gè)關(guān)系。
-
豐田老總一拍腦袋提出3年之內(nèi)超越福特。這種感覺就像好像有一家中國軟件公司一拍腦袋說,三年之內(nèi)超越微軟一樣。我要是執(zhí)行人,只會(huì)覺得上邊又發(fā)神經(jīng)了,這不是瘋了嗎?結(jié)果大野耐一到底是大野耐一,竟然真的找到了方法。
- 生產(chǎn)過剩的浪費(fèi)
- 制造不良品的浪費(fèi)
- 停工等活的浪費(fèi)
- 動(dòng)作上的浪費(fèi)
- 搬運(yùn)的浪費(fèi)
- 加工本身的浪費(fèi)
- 庫存的浪費(fèi)
-
豐田的思路其實(shí)簡(jiǎn)單到了不能再簡(jiǎn)單,利潤=銷售價(jià)格-成本。那么在經(jīng)濟(jì)增長無望的時(shí)代,減少成本就等于創(chuàng)造利潤。過去的時(shí)代是一個(gè)經(jīng)濟(jì)高速發(fā)展的時(shí)代。就像日本泡沫經(jīng)濟(jì)時(shí)代一樣。但是泡沫破裂的時(shí)候,豐田反而崛起。類似的如學(xué)習(xí)TPS的佳能,在5年內(nèi)銷售沒有增加的情況下,利潤增長十倍。
- 面對(duì)一個(gè)即將來臨的經(jīng)濟(jì)增長放緩的時(shí)代,成本開始成為管理者嘴上流行的新詞應(yīng)該是下一步的趨勢(shì)。
-
軟件開發(fā)中的浪費(fèi)有哪些呢?我現(xiàn)在想不到太多。但是跟朋友聊天我突然意識(shí)到,猶豫也是一個(gè)巨大的浪費(fèi)。作為一項(xiàng)腦力勞動(dòng),開發(fā)時(shí)的猶豫就如同停工等活的浪費(fèi)和動(dòng)作上的浪費(fèi)。這種事情其實(shí)可以避免,我開始明白TPS這樣一個(gè)強(qiáng)調(diào)變化與改進(jìn)的過程,為什么還如此強(qiáng)調(diào)標(biāo)準(zhǔn)化。應(yīng)該就是通過整理最佳實(shí)踐并確定為標(biāo)準(zhǔn)流程來減少重復(fù)犯錯(cuò)與猶豫造成的浪費(fèi)。那么結(jié)對(duì)對(duì)效率造成的改進(jìn),別的不提,減少了猶豫的時(shí)間應(yīng)該是很重要的一點(diǎn)。而這也是在水面以下最不容易被發(fā)現(xiàn)的浪費(fèi)。因?yàn)楠q豫和謹(jǐn)慎,從表面上看,似乎是一樣的。
通往天堂的輪船和通往地獄的輪船燒得都是同一種燃料,那就是人類的欲望。
記得小時(shí)候看《讀者》這本雜志,里面有一個(gè)故事,上帝帶一個(gè)人去參觀地獄,地獄里支著一口大鍋,鍋周圍坐著一群人,每個(gè)人拿著一個(gè)很長的勺子,因?yàn)樯鬃犹L了,想要吃東西,經(jīng)常會(huì)碰到別人,所以互相之間總會(huì)打起來,結(jié)果所有人都吃不飽,人人臉上充滿著憤怒和痛苦。然后上帝帶他又去參觀天堂,結(jié)果天堂里跟地獄的擺設(shè)一模一樣。但是人人臉上洋溢著幸福,原來,這里的人會(huì)用長勺子喂對(duì)面的人,所以,每個(gè)人都能吃飽。
同樣的配置,同樣的人,同樣都有吃飽的欲望。一處是天堂,一處是地獄。現(xiàn)實(shí)中也是如此,一個(gè)好的游戲規(guī)則,游戲中便是天堂,一個(gè)不好的游戲規(guī)則,游戲中便是地獄。
相傳,有兩個(gè)嫌疑犯,合謀殺死了一個(gè)人,之后被警察抓住,警察將他們分開審訊。并告訴他們說,如果你們兩個(gè)人都不說的話,以我們現(xiàn)在的證據(jù),我們可以讓你們坐一年的牢。如果你招供了,而你的同伙沒有招供,那么我們將當(dāng)庭釋放你,你的同伙關(guān)20年。如果你和你的同伙都招供了,那么我們也就沒有必要照顧你們?nèi)魏我粋€(gè),你們一人關(guān)10年。
這就是著名的囚徒困境。處于困境中的囚徒,該如何選擇呢?
如果我是那個(gè)囚徒,我不說,你說了,我被關(guān)20年。你說了,我也說了,我關(guān)10年,只有你不說我不說的情況下,我還要關(guān)1年。這里還有一個(gè)極大的誘惑,那就是我說,你不說,我可以當(dāng)庭釋放。人性如此不可靠,綜合判斷的話,還是說最保險(xiǎn),保不齊還能當(dāng)庭釋放呢?不如賭一把。
這就是我全部的如意算盤,可惜,另一個(gè)囚徒他又不傻,他也會(huì)這么想。于是,利益最大化的可能性變成了永遠(yuǎn)不可能達(dá)到的彼端。而10年這個(gè)選項(xiàng)變成了我唯一的下場(chǎng),也是我們雙方唯一的下場(chǎng)。這個(gè)次壞的結(jié)局被稱之為雙輸。我們追求的利益最大化的那一點(diǎn)被稱之為單贏。而每人都得到次好的那個(gè)看起來更不可能的選項(xiàng)被稱之為雙贏。
這個(gè)故事中其實(shí)并不虛幻,現(xiàn)實(shí)中的我們都是這樣的囚徒。想想日常中遇到的一些類似的情況,真的是非常的熟悉。
現(xiàn)實(shí)中的情況復(fù)雜一些,可是道理相同。我們每個(gè)人都追求自己的利益最大化,可是長遠(yuǎn)來看,最大化的利益或不曾降臨,或稍縱即逝。我們最終得到的只有那個(gè)次壞的選項(xiàng)。不過還好我們還可以合理化,安慰自己說,總算沒有到最壞的結(jié)果。但實(shí)際上我們明明可以到達(dá)雙贏的結(jié)局。
從剛知道這個(gè)故事的時(shí)候,我就發(fā)覺工作中的情況與此非常類似,于是我想,應(yīng)該找辦法擺脫這個(gè)困境,遠(yuǎn)離雙輸,通往雙贏。我覺得,憑借敏捷方法我可以不用陷入這個(gè)困境。可是我錯(cuò)了,以前的困境拼圖并不完整,敏捷方法恰恰是補(bǔ)完了這個(gè)困境通向雙贏的那最后一塊拼圖,至此一個(gè)完整的囚徒困境才算是建立完成了。有誘惑,有陷阱,有希望,于是也就有了困惑。于是,困境始成。
在這個(gè)困境里,企業(yè)那點(diǎn)道道,就不說了,大家都很熟悉,可是作為我們程序員,就多么高尚嗎?
敏捷要求全能小團(tuán)隊(duì),可對(duì)于程序員來說,只干自己擅長的那一攤事,然后拿工資是利益最大化的選擇。抽空還能自己學(xué)點(diǎn)東西提升一下自己。或者聊聊天、泡個(gè)論壇、玩?zhèn)€網(wǎng)游什么的。我們自己做出了并不比企業(yè)高多少的選擇。通過雙方的不懈努力,終于,企業(yè)和我們達(dá)到了雙輸?shù)慕Y(jié)局。簡(jiǎn)直就是悲劇。悲劇一再上演著,卻沒多少人太在意,至少大家都可以安慰自己說,總算沒有到最壞的結(jié)果,一定是哪里做的不夠好,再改進(jìn)一些會(huì)好的。可惜,自然規(guī)律是很無情的。你做了這個(gè)選擇,就只有這個(gè)結(jié)局,于是悲劇一再上演。
沒有解決的辦法嗎?有,當(dāng)囚徒困境不是模型里的單次博弈而是多次博弈時(shí)就有解。可以采用一報(bào)還一報(bào)的方式,當(dāng)一方選擇個(gè)人利益最大化的選擇時(shí),那另一方也選,直到對(duì)方放棄。也就是不停的雙輸,并且溝通,直到大家一起回到雙贏境地下。這就是囚徒困境的唯一破解之法。只可惜這個(gè)方法也有問題。第一個(gè)選擇個(gè)人利益最大化的人會(huì)在這個(gè)方法中獲利。如果利益比較大的話,反復(fù)幾次,他就可以有機(jī)會(huì)破壞這個(gè)平衡,將雙贏博弈再次變?yōu)榱愫筒┺摹K裕瑧土P機(jī)制也是很需要的。
方法有了,可是模型畢竟是模型,現(xiàn)實(shí)比這復(fù)雜得多。在囚徒困境之外,你會(huì)發(fā)現(xiàn),還有團(tuán)隊(duì)這個(gè)群體存在。當(dāng)一個(gè)人做選擇很容易,當(dāng)一群人做選擇的時(shí)候,就很難了。按照大眾心理學(xué)的說法,群體幾乎是沒有意識(shí)的。所以這個(gè)時(shí)候,我是只能感慨個(gè)人的渺小了。
價(jià)值,所有的方法學(xué)都會(huì)指向這個(gè)詞。
可是所謂的價(jià)值,有的時(shí)候說得清楚,而有的時(shí)候很難說得清楚的。客戶說出來的清楚,但有可能根本不是他最需要的。如果天下的人都清楚的知道自己要什么,也許也就不會(huì)有什么方法學(xué)了。
就考慮我們自己吧,我們想要什么?錢,沒錯(cuò),誰都需要錢。但要錢干嗎呢?在錢的背后是我們追求的價(jià)值。大家都想讓自己的價(jià)值得到體現(xiàn)。可是這簡(jiǎn)單的一句話在每個(gè)人身上卻有不同的含義。
客戶提出需求的時(shí)候總是欲求不滿的,仿佛跟上帝許愿一般。可是我們畢竟不是上帝,只是勤勞的工匠。工匠是一種介于藝術(shù)家與科學(xué)家之間的職業(yè),是兼顧感性與理性的一群人。在我們的身上有像藝術(shù)家一樣追求超越自我的性格也有像科學(xué)家一樣鍥而不舍追求真理的性格,制造出對(duì)人們有用的工具是我們最大的價(jià)值體現(xiàn)吧。可復(fù)雜的現(xiàn)實(shí),讓我們這么利他的追求也難以實(shí)現(xiàn)。
紅警、星際、暗黑。還有人記得當(dāng)年的這三個(gè)偉大的作品同臺(tái)競(jìng)技的那個(gè)時(shí)代是怎樣的情景嗎?
不記得也沒關(guān)系,因?yàn)檫@個(gè)時(shí)代又要來臨了!
這次是紅警3、星際2和暗黑3.哇咔咔,未來的幾年不會(huì)太無聊了。不要太沉迷于游戲中才好,呵呵。
昨天,蓋茨離開了微軟。對(duì)我來說那一天只是一個(gè)普通工作周的結(jié)束,對(duì)微軟來說,卻是一個(gè)時(shí)代的結(jié)束。
用蓋茨大叔的操作系統(tǒng)的歷史跟我接觸電腦的歷史一般長。從最早的dos到win32到win95、98、me、xp、2000、2003、vista。我?guī)缀跤眠^微軟的每一代操作系統(tǒng)。經(jīng)常會(huì)罵微軟垃圾,可我也從來沒掏錢買過正版操作系統(tǒng),這種罵多少有點(diǎn)齷齪。
時(shí)隔若干年之后,總算我也用上了正版的windows(筆記本送的Vista)。回想起來,一些往事不由得浮上心頭
最早的時(shí)候接觸的dos已經(jīng)記不得是哪個(gè)版了,286時(shí)代的,而那個(gè)286電腦大概長成這樣:
但是開始正式學(xué)的dos應(yīng)該是6.22的:

那個(gè)時(shí)候裝機(jī)只需要一張5存盤:

后來才有的3.5寸盤:

那個(gè)時(shí)候盤經(jīng)常壞,所以3.5寸盤的塑料盒和5存盤的紙袋是很重要的東西。
后來,接觸到的第一個(gè)圖形化的操作系統(tǒng)是windows 3.2,那個(gè)時(shí)候我并不知道apple是什么:

操作起來大概是這么個(gè)感覺:

沒有任務(wù)欄、沒有開始菜單,非常詭異。再后來的,就是windows95了吧:

win95的界面比較經(jīng)典,可以看出來現(xiàn)在的windows界面相比win95其實(shí)沒有太大的變化:

當(dāng)時(shí)的游戲大多都是在dos下的,機(jī)器內(nèi)存又小,為了玩游戲需要切到dos下,關(guān)掉95。即便在這么困難的環(huán)境下,依然有偉大的作品誕生:


。。。。
那個(gè)時(shí)候,很多游戲的安裝需要靠一個(gè)叫arj的解壓工具:

中間還有一個(gè)改進(jìn)版的95,被稱之為win97,至今我也不知道到底有沒有那么一個(gè)正式的97出現(xiàn)過,反正很快,98就誕生了:

回想起來,那年開始,我接觸的游戲開始變多,我永遠(yuǎn)忘不了我看到星際的時(shí)候的感受:

在那個(gè)時(shí)代,還有一個(gè)稱得上傳奇的病毒---CIH,以其可以對(duì)電腦造成物理傷害而聞名:

98是一個(gè)及其不穩(wěn)定的操作系統(tǒng),解決98里一些較大問題的唯一法寶往往就是重裝,也許正是因?yàn)樗缁瘌P凰一般的再生能力,一直到2000和xp誕生之后都有人選擇他做自己的操作系統(tǒng)。
而win me。。。很多人根本就不知道他的存在:

不知道現(xiàn)在有幾個(gè)人知道win me安裝完第一次啟動(dòng)時(shí)必須忍受那個(gè)開機(jī)動(dòng)畫的事。再后來就是2000了,其實(shí)在win32時(shí)代就有windowsNT,微軟用它在服務(wù)器市場(chǎng)里戰(zhàn)斗,不過我個(gè)人并沒有用過,windows 2000是我接觸的第一款微軟的服務(wù)器級(jí)別的操作系統(tǒng):

到了windows 2000之后我對(duì)微軟的怨言已經(jīng)少很多了,呵呵。之后微軟家族的產(chǎn)品越出越好,只不過漏洞和病毒依舊多不勝數(shù)。XP和2003就不回顧了,反正他們還不算歷史。看看前面的這些東西,想想蓋茨大叔的退休,該說些什么呢?私底下罵了微軟若干年了,反過來看,微軟也給我?guī)砹撕芏鄻啡ぁR苍S,應(yīng)該對(duì)他說一聲,謝謝。
前些天跟朋友聊天,聊得很激烈,我也收獲很多。
中間聊到過程,朋友認(rèn)為,管理的最高境界應(yīng)該是沒有過程,但仔細(xì)一問發(fā)現(xiàn),還是有過程的,只不過是一些更人性化的過程而已。結(jié)合我另一些朋友的觀點(diǎn),看來“過程”這個(gè)詞有點(diǎn)招人恨了。(當(dāng)然如果是瀑布式的過程的話,我會(huì)第一個(gè)跳出來恨的,:P)
我一直認(rèn)為過程這種東西,做不好就是枷鎖,做好了就是鎧甲,讓你在工作中左沖右時(shí)保障你的安全。這次敏捷大會(huì)跟o6z聊天時(shí),他說,雖然他老說敏捷,但他
其實(shí)是一個(gè)很偏好重型過程的人。其實(shí)還是我的那個(gè)比喻,只不過重型的鎧甲也是鎧甲,更適用于直線沖鋒陷陣的重裝騎兵,但是你要是隨便找個(gè)步兵團(tuán)隊(duì)來配上重裝騎兵的鎧甲,估計(jì)還沒打就被壓死了。
關(guān)于過程這個(gè)東西,很有趣。既然想到這了,就像抽取一些自己的零散思維放上來。
我琢磨XP有很長一段時(shí)間了,Scrum也看了一段時(shí)間,就個(gè)人來說,不是很喜歡Scrum。總覺得這個(gè)東西天生帶有一點(diǎn)滋生官僚這種細(xì)菌的潛質(zhì)。常聽說
XP沒有管理的內(nèi)容,Scrum在這方面做的更好。可我還是覺得Scrum沒提供什么東西,完全可以把Scrum的一些東西吸收到XP中,結(jié)合自己的團(tuán)隊(duì)
實(shí)踐搞一些混合敏捷(Hybrid
Agile)。因?yàn)镾crum在管理方面做的東西并沒有多少,實(shí)在算不上盔甲,頂多是個(gè)盾牌。比較起來,XP的話,倒是有豐富的價(jià)值觀和配套的實(shí)踐,在吸
取了它的一些本質(zhì)的東西之后集合公司實(shí)際做一些定制化的管理框架更好。
下一步準(zhǔn)備研究一下FDD,再考慮跟前面?zhèn)z方法混搭一下。我感覺這搞過程越來越像J2EE開發(fā)了:Struts + Spring + Hibernate一樣的玩法。
第110集的銀魂非常的搞。桂入獄了,而且是號(hào)稱從未有人逃出來過的監(jiān)獄,里面關(guān)的都是罪大惡極的人,但是入獄的領(lǐng)袖到底還是領(lǐng)袖,很快他就成為了監(jiān)獄中的老大,并且給這些終生無望的人帶來了改變,每天的勞改變得不再無聊,人人都有了目標(biāo),臉上都洋溢著希望,乏味的人生從此有味道起來。。。。。當(dāng)然,這終究是一部搞笑的動(dòng)畫片,前半截不管鋪墊的怎么熱血,最后一幕還是抖出包袱:前面只是陰錯(cuò)陽差得演了一場(chǎng)各懷鬼胎的陰謀鬧劇。。。囧rz
雖然是搞笑的,但是那些洋溢著希望的臉,卻在腦海中怎么也驅(qū)之不去。監(jiān)獄是人生的地獄,那里的色彩只有一種---灰色。如果是終生監(jiān)禁,這種顏色還會(huì)伴隨你一生,成為你余生的主色調(diào)。進(jìn)入監(jiān)獄的人,在第一夜關(guān)燈的剎那開始明白,自己的人生從此完了。彩色的世界已經(jīng)離自己遠(yuǎn)去,剩下的時(shí)間里只有單調(diào)的監(jiān)獄生活,不會(huì)再有希望。在那個(gè)世界里,幾乎不會(huì)有那樣的神情、那樣的臉,只有充滿戾氣的臉才跟那個(gè)環(huán)境般配。當(dāng)這個(gè)動(dòng)畫以夸張搞笑的手法把一張張這樣的臉呈現(xiàn)在我眼前的時(shí)候,我的第一感想竟然是羨慕。。。。
是啊,羨慕。我驚奇的發(fā)現(xiàn),希望在我的詞典里被擠到某個(gè)小角落很久了。感謝一些人,讓我看透了一些事情。同樣也虧得他們,我開始不再抱有幻想,變得更加理性,雖然人生不再有明確的方向,卻敢于邁出自己堅(jiān)實(shí)的腳步。這種沒有方向感的自信我不知道是什么,但是在這種自信的世界里,沒有希望的存在。偶爾升起的希望很快會(huì)被我的理智所設(shè)下的“幻想偵測(cè)系統(tǒng)”預(yù)測(cè)到并驅(qū)散。(目前這個(gè)系統(tǒng)的誤殺率還真不是一般的高啊。)
走在地鐵站中,看過往的人群,有各式各樣的臉,有幸福的、有木訥的、有暴戾的、有冰冷的,也有洋溢著希望的,對(duì)于見過的部分人們,說實(shí)話,真的有很多看起來充滿希望的,不過有些是因?yàn)闆]心沒肺,有些不好說是因?yàn)橛赂疫€是無知,或者說不準(zhǔn)是因?yàn)闊o知而勇敢,更多的是讓通過一種眼不見為凈的手法,讓自己的人生有希望起來,可是當(dāng)真想到未來時(shí),總會(huì)有一陣陣恐慌。
我想,希望這種若有似無的東西,看起來很沒有價(jià)值,實(shí)際上卻可以很有價(jià)值。一個(gè)人生活中充滿希望,那么他是幸福的,他就會(huì)有安全感,工作也會(huì)賣力許多。有什么理由不給人們帶來更多的希望呢?如果我們的團(tuán)隊(duì)被希望所籠罩,我們的團(tuán)隊(duì)就會(huì)有更大的活力。對(duì)于軟件這個(gè)行業(yè),非常需要注重人。希望,是對(duì)人非常重要的一個(gè)東西。那么我們的團(tuán)隊(duì)建設(shè)者們,是不是也應(yīng)該注意一下這個(gè)東西呢?
早在工作之前,就有學(xué)長們、老師們諄諄教導(dǎo)說,語言不要貪多,學(xué)一門語言學(xué)到精,其他語言再學(xué)就很容易了。
我是這么做的,而且,做的有點(diǎn)過。很長時(shí)間里都扎在Java的世界里不肯出來,找開源工具也一定要找基于Java的。最早找一個(gè)Wiki都執(zhí)意要找Java的,找到了JSPWiki。也因此認(rèn)識(shí)了BeanSoft和Java Ajax群的朋友們,呵呵。
但是,隨著開發(fā)任務(wù)的變化,不得不去學(xué)一些其他的語言。沒辦法,人在江湖身不由己啊,所以,也就開始了多門語言的學(xué)習(xí)之路。javascript可以說是我學(xué)的第一門“外語”。最早的時(shí)候?qū)s的應(yīng)用,也就簡(jiǎn)單用一下得了。后來隨著時(shí)間的推移,覺得將來脫不了要靠它吃飯,也就主動(dòng)買了幾本JavaScript的書,慢慢的去啃,甚至啃到了很多對(duì)我沒什么用的高級(jí)的特性,再后來工作需要,接觸了Flex,js用的就少了,也就慢慢的放下了。
ActionScript是我接觸的第三門外語。也是用心比較大的,呵呵,很長一段時(shí)間里甚至熱情超越了Java。中間根據(jù)個(gè)人興趣還看了點(diǎn)Ruby。
隨著實(shí)踐的增多,對(duì)語言的恐懼心理下降了。反而發(fā)現(xiàn)了各個(gè)語言所在世界的優(yōu)勢(shì)。每個(gè)語言所在的世界里都有非常優(yōu)秀的東西。最早想做一個(gè)手腳架,看了一下Rails,是基于Ruby的;為了測(cè)試Flex,研究了FunFX,也是基于Ruby的;前不久在部門里搭建了一個(gè)wiki,是基于PHP的;這段時(shí)間又研究了一下Trac,是基于Python的;研究Trac的時(shí)候發(fā)覺它可以跟Bugzilla集成,而Bugzilla是基于Perl的。這么多優(yōu)秀的東西,讓我覺得學(xué)習(xí)多門語言的困難變得無所謂了。
上次去OpenParty,參與了鄭曄的那個(gè)session。他講了自己在項(xiàng)目中使用多種語言的經(jīng)歷。其實(shí)很有趣,作為只會(huì)一種語言的人來說,他覺得學(xué)多門語言會(huì)讓自己泛而不精,然而真正掌握多門語言的人卻發(fā)覺,他山之石可以攻玉,當(dāng)你學(xué)會(huì)別的語言之后反過來在使用以前的語言的時(shí)候,思路會(huì)變得異常開闊。不管是對(duì)設(shè)計(jì)模式的領(lǐng)悟上還是對(duì)架構(gòu)的組織上,都達(dá)到了一個(gè)更高的高度,反而更加精深了。
回來后,我也想了很多。記得早前看o6z一個(gè)帖子講,SOA之所以風(fēng)行,很大原因是因?yàn)槠髽I(yè)已經(jīng)積累了一些設(shè)備和軟件。因?yàn)榻鹑陲L(fēng)暴也好,因?yàn)榻?jīng)濟(jì)衰退也好,因?yàn)槌杀究紤]也好,因?yàn)檫@這那那也好,不想統(tǒng)一成一個(gè),需求決定供給,所以SOA才風(fēng)行起來。那么這樣一個(gè)環(huán)境對(duì)我們開發(fā)人員的會(huì)不會(huì)有什么影響呢?而且開源風(fēng)行的今天,我們的軟件行業(yè)也已經(jīng)積累了一批財(cái)富。我們業(yè)內(nèi)的人,也是不想統(tǒng)一替換成一類語言的,那么市場(chǎng)上的需求會(huì)不會(huì)慢慢變得要求我們程序員必須掌握多種語言呢?其實(shí)現(xiàn)在已經(jīng)這樣了,我就是一個(gè)例證,我的變化不是我主觀想這么做的,而是一只看不見的手---市場(chǎng)推動(dòng)的。不過我個(gè)人預(yù)測(cè)未來可能會(huì)更嚴(yán)重,如果JVM成功變成一個(gè)可以跑各種動(dòng)態(tài)語言的超級(jí)平臺(tái)的話。
瘋?cè)墓适乱恢崩_著我---相傳,有一個(gè)國家,有一口瘋?cè)攘巳娜硕紩?huì)瘋,很快全國人民都瘋了,只有國王是正常的,在國民眼中看來國王是不正常的,其結(jié)果就是國王被灌下瘋?cè)蔀榱睡傋樱珖駳g。作為旁觀者看來,你告訴我,國王是對(duì)的?還是國民是對(duì)的?
可是跟所有的故事一樣,故事總是只強(qiáng)調(diào)問題的一方面,我反過來講這個(gè)故事,如果全國人民都沒瘋,就國王瘋了,國王認(rèn)為,不行,全國人民得跟我這樣,于是想法設(shè)法讓全國人民喝上瘋?cè)D敲船F(xiàn)在作為旁觀者你告訴我,國王是對(duì)的?還是國民是對(duì)的?
現(xiàn)在有一個(gè)國家,有兩口泉,一口是瘋?cè)豢谑切讶:攘睡側(cè)娜藭?huì)變成瘋子,喝了醒泉的人會(huì)變成正常人。最早國家的人全變成了瘋子。機(jī)緣巧合,國王喝下了醒泉。清醒過來的國王想讓國民都醒過來,想讓國民喝醒泉。而國民發(fā)現(xiàn)了國王與自己不一樣的地方,于是將國王灌下瘋?cè)瑖踉俅委偭恕D敲船F(xiàn)在作為旁觀者,你告訴我,國王是對(duì)的,還是國民是對(duì)的?
其實(shí)三個(gè)問題都挺簡(jiǎn)單的,第一個(gè):國王是對(duì)的,第二個(gè),國王是錯(cuò)的,第三個(gè),還是國王是對(duì)的。可是,我現(xiàn)在再給旁觀者的你一個(gè)新情報(bào),三個(gè)故事是一件事,只不過是三個(gè)人講的,所以出現(xiàn)了三個(gè)版本。其實(shí)我還能講一個(gè)故事,就是把第三個(gè)故事反過來講,大家自己想去吧,相當(dāng)于第二個(gè)故事的擴(kuò)展版。如果是這四個(gè)故事一塊看,你說誰是對(duì)的呢?是“群眾的眼睛是雪亮的”呢?還是“真理掌握在少數(shù)人手中”呢?
如果到現(xiàn)在你還沒有被我繞暈了的話,應(yīng)該心中還能響起柯南的那句話:“真相只有一個(gè)”。沒錯(cuò),所以你只要找到那兩個(gè)泉,搞清楚到底哪個(gè)是醒泉哪個(gè)是瘋?cè)秃昧恕U胬恚匀痪椭朗钦莆赵谡l手中了。繼而也就可以證明國王是對(duì)的,還是國民是對(duì)的。
可是,事情沒有那么簡(jiǎn)單,你率領(lǐng)的觀察隊(duì)發(fā)現(xiàn),兩個(gè)泉水是兩口魔泉,你喝下一口泉水的水,你就有擁有了一種價(jià)值觀,喝另一口泉的水,就擁有了另一種價(jià)值觀。兩種價(jià)值觀是對(duì)立的,但是,誰知道哪種是瘋的呢?事情變得更復(fù)雜了。。。難道在這個(gè)事件中我們無法證明什么嗎?誒,還真有一個(gè),你證明了,這個(gè)國家有兩口魔泉,不是一口。
這世界上有很多事情就是這樣,撲朔迷離的,就算最終謎底揭曉,發(fā)覺反而不知道對(duì)錯(cuò)了。可是如果我們一開始就知道這些,我們就能知道對(duì)錯(cuò)了嗎?還是不知道啊。不過呢,這種問題,我們苦惱,精英們比我們更苦惱。早在我們考慮之前,精英賢者們就在考慮這些問題了,并得到了一些結(jié)論。最早的時(shí)候,老子就說,有錯(cuò)才有對(duì)。這說法比較言簡(jiǎn)意賅,乍一看就是句廢話。我以前也覺得他是句廢話,知道有一天看到了另一句話,才明白他老人家的微言大義。這句話就是:“可以被證偽的命題才是科學(xué)的命題”。這話聽著跟我們?nèi)粘@飳?duì)科學(xué)的印象不太一樣呢,我們常說,你這個(gè)說法不科學(xué),那意思就是不對(duì)。科學(xué)當(dāng)然是對(duì)的,證偽,證明是錯(cuò)誤的,那種東西怎么能算是科學(xué)的呢?可惜,事實(shí)正是如此,所有科學(xué)的命題都是可以被證偽的。科學(xué)也正是因?yàn)樾欧钸@一條原則,所以才可以自我修正,自我進(jìn)化,以致今天的高度。
所謂可以被證偽不是說這個(gè)東西有錯(cuò)誤,而是說,你這個(gè)命題天生帶著可以被推翻的情況出生的。比如,曾經(jīng)有人懷疑進(jìn)化論的科學(xué)性,說你這個(gè)東西無法被證偽,進(jìn)化論的擁護(hù)者就說,你只要找到一批侏羅紀(jì)的兔子或者猩猩化石什么的,那么進(jìn)化論就被證偽了,因?yàn)檫M(jìn)化論說物種的進(jìn)化一定是從低級(jí)到高級(jí)。這種情況,我們稱之為可被證偽。指一個(gè)命題能夠被推翻。什么是不可被證偽的呢?比如說什么是美的,我們常說情人眼里出西施,那美自然是無法被證偽的東西。藝術(shù)的東西,大都是無法被證偽的。無法被證偽的東西,自然沒有錯(cuò)誤,沒有錯(cuò)誤的東西自然就沒有正確。像這樣的東西,就不要追求什么對(duì)錯(cuò)了,硬要追求,只有自討苦吃。
前一陣跟一做企業(yè)文化咨詢的哥們混了一陣,從他那瞅見一書,挺有意思。叫《公司基因》,看著不錯(cuò)就買了。
這OpenParty是不興推薦書了,下次再有機(jī)會(huì)就推薦這個(gè)。
這書里認(rèn)為企業(yè)文化不管怎么變,他的DNA都是由四個(gè)元素組成的,即:組織架構(gòu)(原詞是structure)、決定權(quán)、信息、激勵(lì)機(jī)制。
它根據(jù)這四個(gè)元素把企業(yè)分成了七種類型
- 消極進(jìn)取型
- 時(shí)進(jìn)時(shí)停型
- 過度膨脹型
- 過度管理型
- 隨機(jī)應(yīng)變型
- 軍隊(duì)型
- 韌力調(diào)節(jié)型
其中前四者看名字就知道不是什么好東西,書中也定義為不健康的企業(yè)。后三者,雖然都算是健康的,但最好的其實(shí)是最后一個(gè)。
敏捷常常被說是一種文化,我也這么覺得。所以,我最近一直讓自己從這四個(gè)角度看敏捷的方法學(xué)。分析來分析去,反而搞不清敏捷應(yīng)該塑造一種文化,還是某種文化是維持敏捷的土壤。有點(diǎn)雞生蛋蛋生雞的意思。不過不管哪個(gè)生哪個(gè),如果目的是養(yǎng)雞,那誰先誰后就不是我關(guān)心的了。
這本書前面部分寫了太多關(guān)于案例的內(nèi)容。沒有足夠形象的講解Scrum。也沒有充分描述Scrum的假設(shè)、適應(yīng)情況和不適應(yīng)情況。講Scrum的風(fēng)格跟微軟的講師講座倒是真挺像。
書中的Service1st公司的案例跟我們部門的情況極其相似。最后他也沒解決,只是說Scrum在現(xiàn)有的形勢(shì)下帶來了什么好處,有些失望。不過仔細(xì)想想,這個(gè)團(tuán)隊(duì)的問題不是軟件開發(fā)方法的問題,而是企業(yè)文化的問題。所以Scrum解決不了是意料之中的。
但是這本書,說實(shí)話,不是特別經(jīng)典的一本書,大概看看吧。
敏捷是以消除浪費(fèi)、提高質(zhì)量為目標(biāo)的。但是有些時(shí)候總能見到一些原教旨主義者指出,重構(gòu)也是浪費(fèi)、結(jié)對(duì)也是浪費(fèi)、討論也是浪費(fèi)。然后呢,又有人提出,XX是必要的浪費(fèi)這種說法。
想了一下,XX是必要的浪費(fèi)這個(gè)說法其實(shí)不確切,只能說,這些東西是必要的成本支出。所謂浪費(fèi),必須從經(jīng)濟(jì)學(xué)角度講才行。不然世間一切都可以帶上這個(gè)難看的帽子。
從牛博網(wǎng)最近新來的騙銀老師那里學(xué)來一個(gè)概念:“經(jīng)濟(jì)學(xué)上有個(gè)奇怪的概念叫‘冤死的損失’(deadweight loss),英文的直譯是‘未被釋放出來的能量損失’,那是說,有一部分損失,...”誰也沒拿走,“...但因?yàn)樾试颍湍敲磻{空損失掉了。”
因?yàn)槁犉饋砗苄瑸榱俗尨蠹腋美斫猓_銀老師在后面講的一個(gè)非常耳熟能詳?shù)睦樱?br />
“
我雇了一幫人,天天就負(fù)責(zé)刨坑,刨了然后填上,然后再刨開,再填上(這例子不荒謬,中國隨處可見),我發(fā)給他們工資,這一來一往國民生產(chǎn)總值(GDP)就上去了。看起來誰也沒損失什么,對(duì)不對(duì)?只是簡(jiǎn)單的財(cái)富轉(zhuǎn)移。其實(shí)不然,這里面有巨大的浪費(fèi),因?yàn)檫@些錢、這些勞力本來可以用在其他更為有效的生產(chǎn)上,可都用來刨坑了,那就是浪費(fèi)。”(其實(shí)個(gè)人這個(gè)例子還不夠形象,如果挖坑和填坑的不是一批人,他們自己根本就不知道自己做的是浪費(fèi)的事情,就知道干了活,拿錢,而且還為挖坑和填坑做了很多過程改進(jìn),提高工作效率。那就更形象了。)
所以說,您不能因?yàn)槟承┕ぷ髯隽四芸吹叫Ч耍筒环Q之為浪費(fèi),而有些工作做了您看不到效果就稱之為浪費(fèi)了,應(yīng)當(dāng)反思一下是不是自己眼界不到。
離職將近,我在交接工作之際,因?yàn)槲易钍欤砸野岩蕾囄邑?fù)責(zé)模塊的其他模塊的適配器類改至新版。自己搬著Mingle寫了一些故事卡,又用CC寫了一
些持續(xù)集成的腳本。接下來,我還會(huì)去寫測(cè)試用例。整個(gè)過程中,沒有一行有效代碼的產(chǎn)出。在以代碼計(jì)績(jī)效的角度看,我的工作就算是浪費(fèi)。可是,大家應(yīng)該知
道,沒有這些東西,先不說我會(huì)不會(huì)在開發(fā)的時(shí)候保證質(zhì)量。就說我離開以后,當(dāng)產(chǎn)品質(zhì)量出問題了,誰來保證?我可以根據(jù)異常一眼看出問題可能出在哪里,新接手的人能嗎?如果他改了程序,能保證不會(huì)按下葫蘆起來瓢嗎?他需要時(shí)間去犯錯(cuò)去學(xué)習(xí),這個(gè)時(shí)間,沒有產(chǎn)生新的價(jià)值,這才是真正的浪費(fèi)。而且這也就成了挖坑-填坑的模式了。
問題反過來了,我做好這個(gè)CI的環(huán)境走了,來了一個(gè)新人接手,會(huì)怎樣?一天,系統(tǒng)報(bào)異常了。他有我的測(cè)試環(huán)境,而且,還是可以運(yùn)行的。他可以很快的寫一個(gè)測(cè)試用
例,并開始調(diào)試,即便他無法理解整個(gè)設(shè)計(jì),那不妨礙他快速的修復(fù)Bug。而且,因?yàn)橐郧暗臏y(cè)試用例可以自動(dòng)運(yùn)行,他還可以保證自己的修改不會(huì)導(dǎo)致之前的功
能出現(xiàn)問題。一個(gè)為產(chǎn)品而組織的團(tuán)隊(duì),離開了某個(gè)特定的人,產(chǎn)品仍然可以自我完善,能完成這樣的目標(biāo)的手法才是最有價(jià)值的。
很多人擔(dān)心前期花費(fèi)的時(shí)間太多,后期就更沒時(shí)間,問題又來了。前期花費(fèi)的時(shí)間多,是浪費(fèi)掉了,還是合理的用掉了?如果是浪費(fèi)掉了,自然不應(yīng)該,如果是合理的用掉了,那是必須的。我們學(xué)軟件工程的時(shí)候都學(xué)過,一個(gè)問題發(fā)現(xiàn)的越晚,改正他的成本就越高。后期所謂的沒時(shí)間,就是因?yàn)榍捌谔鄦栴}沒有修正。
說道這個(gè)前后期的問題就不得不提最近一次結(jié)對(duì)的經(jīng)歷。在我的堅(jiān)持下,總算完成了一次與同等水平開發(fā)人員的結(jié)對(duì)編程。持續(xù)時(shí)間有三天。與同等水平的人結(jié)對(duì),感覺是不一樣。也發(fā)現(xiàn)了很多以前沒有發(fā)現(xiàn)的問題。這都是個(gè)人問題,脫離我本人就沒有意義了,所以也就不說了。主要說一下心得。這三天的時(shí)間里做了一件什么事呢?推翻以前分成兩個(gè)模塊的應(yīng)用,合成一個(gè)。兩個(gè)人做一件事,大家可以隨時(shí)根據(jù)今天剩余的時(shí)間做工作的調(diào)節(jié),精確到小時(shí)。因?yàn)榱私獾男畔⒉煌梢钥焖賯鬟f,合作互補(bǔ),當(dāng)他提出一方案的時(shí)候我可以快速告訴他,我這邊沒有問題,減少了嘗試造成的時(shí)間浪費(fèi)。因?yàn)閮蓚€(gè)人一起做,腦子根本停不下,一個(gè)人停了,另一個(gè)人還在轉(zhuǎn),帶著你不得不進(jìn)行。一天的有效工作時(shí)間在6小時(shí)以上。而分開的話,基本上能有3個(gè)小時(shí)就不錯(cuò)了。
(中間發(fā)生的一點(diǎn)插曲。因?yàn)榻Y(jié)對(duì)開發(fā)從不了解的人看來,是一件很浪費(fèi)時(shí)間的事情。所以出現(xiàn)干預(yù)結(jié)對(duì)的現(xiàn)象出現(xiàn),理由是擔(dān)心做不完。我覺得,如果不是堅(jiān)持的話,就真的做不完了。從現(xiàn)實(shí)中看來,強(qiáng)調(diào)浪費(fèi),很容易被偷歡概念。而偷換概念的人很多人都沒有做過仔細(xì)的考慮。純粹的想當(dāng)然。)
今天公司過了CMMI 4級(jí),5級(jí)沒過,聽老外講述什么是5級(jí)也就是說什么是持續(xù)改進(jìn)以后,感覺到CMMI的持續(xù)改進(jìn)和Agile的消除浪費(fèi)其實(shí)是一枚硬幣的兩面,持續(xù)改進(jìn)就是消除浪費(fèi),為什么這么說呢?CMMI的持續(xù)改進(jìn)本來就是高級(jí)別的過程域,那個(gè)時(shí)候指望重大變革基本就不靠譜,所以這個(gè)時(shí)候,看不管哪個(gè)行業(yè),都會(huì)走向消除浪費(fèi)的方向,軟件開發(fā)也不例外。CMMI的持續(xù)改進(jìn)要求一直做一直做,那跟敏捷要求的追求精益的觀點(diǎn)是一致的。
CMMI認(rèn)為通過4級(jí)的度量形成了穩(wěn)定的過程之后,5級(jí)就應(yīng)該是對(duì)4級(jí)過程的不斷改進(jìn),什么時(shí)候看,都是不滿足的,值得修改的。那種精神不正是敏捷的世界觀嗎?CMMI給出了一堆過程域和目標(biāo),并沒有告訴我們?cè)趺磳?shí)現(xiàn),Agile就更粗狂,不過大家提到Agile其實(shí)想到的是XP。所以覺得Agile就是一堆實(shí)踐而已,沒關(guān)系,不去爭(zhēng)辯這個(gè)問題。我就看XP,XP的那12個(gè)最佳實(shí)踐,跟CMMI的思想一點(diǎn)都不矛盾。(細(xì)節(jié)不可考,因?yàn)楹芏鄷r(shí)候我很難清到底是CMMI里面就定好了這細(xì)節(jié)還是我們的EPG定的)。以前的時(shí)候只是粗略的感覺這兩者可以不矛盾,現(xiàn)在培訓(xùn)過后,更證實(shí)了這點(diǎn)。
============
縮寫解釋:
Agile 敏捷
CMMI 能力成熟度模型集成
XP 極限編程
EPG 企業(yè)過程小組
不知不覺做這個(gè)產(chǎn)品已經(jīng)一年了,其實(shí)除了技術(shù)積累,對(duì)這個(gè)產(chǎn)品的概念基本是處于原始階段。雖然早已經(jīng)過了企業(yè)內(nèi)容管理與網(wǎng)站內(nèi)容管理的疑問階段。但是內(nèi)容管理本身是對(duì)企業(yè)有什么價(jià)值,問了很多人。很多人的回答都不讓我們滿意,因?yàn)樗麄兓卮鸬钠鋵?shí)是工作流有什么價(jià)值、OA有什么價(jià)值、文檔管理有什么價(jià)值、ERP有什么價(jià)值。
昨天聽一位曾經(jīng)實(shí)施過FileNet的同事說了一句話才明白過來這個(gè)東西的價(jià)值在于“提供一種海量非結(jié)構(gòu)化異構(gòu)文檔的查詢服務(wù)”,其余的都是在其之上的附加價(jià)值。
價(jià)值有了,可是越看越?jīng)]底:“海量”、“非結(jié)構(gòu)化”、“異構(gòu)”僅一個(gè)關(guān)鍵字就夠麻煩的了,三個(gè)拼一塊。。。很好,很強(qiáng)大。。。。。
這兩天為了Fluorida的closePopUp功能,讀了點(diǎn)Flex框架的源碼,對(duì)Alert,TitleWindow以及Flex的PopUp功能做了簡(jiǎn)單的分析。
【Alert和PopUp】
Alert內(nèi)部其實(shí)是調(diào)用了PopUpManager.在parent參數(shù)為null或者為Application的時(shí)候,彈出的窗口將跟當(dāng)前Application在一個(gè)容器下。Alert在最頂層,Application在最底層,中間那層是一個(gè)稱之為modalWindows的控件,其實(shí)就是Alert后面那個(gè)磨砂的層。為了點(diǎn)到Alert上的按鈕,寫了一個(gè)小程序分析Alert的結(jié)構(gòu),不是很好讀,但是可以運(yùn)行一下,看看分析出的Alert的內(nèi)部結(jié)構(gòu):(大略說一下,Alert的Child有一個(gè)AlertForm,而AlertForm的Child除了第一個(gè)是TextField以外,都是按鈕)
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
<mx:Script>
<![CDATA[
import mx.core.IChildList;
import mx.core.UIComponent;
import mx.core.IFlexDisplayObject;
import mx.managers.ISystemManager;
import mx.managers.PopUpManagerChildList;
import mx.managers.PopUpManager;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.core.Singleton;
import mx.managers.IPopUpManager;
private function showSimpleAlert():void{
Alert.okLabel="oKey";
Alert.show("Hello, World!","",15,null,alertCloseHandle);
var myTimer:Timer = new Timer(1000, 1);
myTimer.addEventListener("timer", timerHandler);
myTimer.start();
}
private function alertCloseHandle(event:CloseEvent):void{
simpleAlertShower.label = event.detail.toString();
}
private function timerHandler(event:TimerEvent):void{
var text:String = "elements:";
var sm:ISystemManager = (Application.application.root as ISystemManager);
text+=sm.numChildren.toString();
text+=";\n modalWindows:";
text+=sm.numModalWindows.toString();
for(var index:int = 0; index < sm.numChildren; index++)
{
text += "\n" + index + " : ";
text += sm.getChildAt(index).toString();
}
var alert:Alert = sm.getChildAt(sm.numChildren - 1) as Alert;
text += "\n buttonFlags : "+alert.buttonFlags;
text += "\n alertChildren:" + alert.numChildren;
for(var index:int = 0; index < alert.numChildren; index++)
{
text +="\n" + alert.getChildAt(index).toString();
}
var alertForm:UIComponent = alert.getChildAt(0) as UIComponent;
text += "\n alertFormChildren:" + alertForm.numChildren;
for(var index:int = 0; index < alertForm.numChildren; index++)
{
text +="\n"+index+":"+ alertForm.getChildAt(index).toString();
}
popupChildText.text = text;
alertForm.getChildAt(1).dispatchEvent(new MouseEvent(MouseEvent.CLICK));
// var popupContainer:IChildList = (application.root as IChildList);
// PopUpManager.removePopUp(popupContainer.getChildAt( popupContainer.numChildren - 1 ) as IFlexDisplayObject);
}
]]>
</mx:Script>
<mx:Button id="simpleAlertShower" click="showSimpleAlert();" label="Click Me"/>
<mx:Text id="popupChildText"/>
</mx:Application>
【關(guān)于TitleWindow】
TitleWindow作為彈出窗口的時(shí)候,跟Alert處的位置沒什么區(qū)別,我想說的是TitleWindow的closeButton在哪里。下面這個(gè)同樣不好讀的程序可以幫助你分析TitleWindow或者說Panel里面都有用什么,以及closeButton在哪,其實(shí)就是在rawChildren的最后一個(gè)。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">
<mx:Script>
<![CDATA[
import mx.containers.TitleWindow;
import mx.core.IChildList;
import mx.core.UIComponent;
import mx.core.IFlexDisplayObject;
import mx.managers.ISystemManager;
import mx.managers.PopUpManagerChildList;
import mx.managers.PopUpManager;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.core.Singleton;
import mx.managers.IPopUpManager;
private function showSimpleAlert():void{
var popUpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this,TitleWindow,true));
popUpWindow.width = 400;
popUpWindow.height = 300;
popUpWindow.visible = true;
popUpWindow.showCloseButton = true;
var myTimer:Timer = new Timer(2000, 1);
myTimer.addEventListener("timer", timerHandler);
myTimer.start();
}
private function alertCloseHandle(event:CloseEvent):void{
simpleAlertShower.label = event.detail.toString();
}
private function timerHandler(event:TimerEvent):void{
var text:String = "elements:";
var sm:ISystemManager = (Application.application.root as ISystemManager);
text+=sm.numChildren.toString();
text+=";\n modalWindows:";
text+=sm.numModalWindows.toString();
text+="\n top children: ";
for(var index:int = 0; index < sm.numChildren; index++)
{
text += "\n" + index + " : ";
text += sm.getChildAt(index).toString();
}
var titleWindow:TitleWindow = sm.getChildAt(sm.numChildren - 1) as TitleWindow;
text += "\n popUpWindowrawChildren:" + titleWindow.rawChildren.numChildren;
for(var index:int = 0; index < titleWindow.rawChildren.numChildren; index++)
{
text +="\n" + titleWindow.rawChildren.getChildAt(index).toString();
}
var titleBar:UIComponent = (titleWindow.rawChildren.getChildAt(2) as UIComponent);
text += " has " + titleBar.numChildren;
text += "\n" + titleBar.getChildAt(3).toString();
popupChildText.text = text;
// var popupContainer:IChildList = (application.root as IChildList);
// PopUpManager.removePopUp(popupContainer.getChildAt( popupContainer.numChildren - 1 ) as IFlexDisplayObject);
PopUpManager.removePopUp(titleWindow);
}
]]>
</mx:Script>
<mx:Button id="simpleAlertShower" click="showSimpleAlert();" label="Click Me"/>
<mx:Text id="popupChildText"/>
</mx:Application>
最近的一個(gè)月事情真不少,公司內(nèi):要過CMMI,公司外:活動(dòng)接連著就有倆。接連參加了OpenParty和RIAMeeting之后覺得自己應(yīng)該總結(jié)一下了。
上次的OpenParty質(zhì)量奇高。從那里學(xué)到了很多知識(shí),從gigix那里學(xué)到基礎(chǔ)的價(jià)值,在session的學(xué)習(xí)中還順帶自己想明白了迪米特法則的價(jià)值,了解了壞的制度是如何作用于公司氛圍的,親眼目睹到設(shè)計(jì)欠債的后果,以及補(bǔ)救僅能做到的程度有多高。從Tin哪里學(xué)到界面開發(fā)過程方面的一些非常優(yōu)秀思路,今天參加RIAmeeting的時(shí)候還討論了更細(xì)節(jié)的開發(fā)人員和設(shè)計(jì)人員配合的問題。這次的好topic太多了,只能挑著最感興趣的聽了,次感興趣的其實(shí)也很想去聽得,比如精益、CMMI & Agile、巨富客戶端,這一說起來好像哪個(gè)都想聽了,但只有在好看簿上看了,這種不完美別有一番吸引力,還有些沒選上的topic其實(shí)也不錯(cuò)的。希望下次有機(jī)會(huì)聽到。Open Party給我的東西太多了,每次想說的時(shí)候就被教育一次自己的語言能力有多貧乏。
這次RIAmeeting也不錯(cuò),見到一些老朋友,也見到了沒有見過面的朋友。而topic呢,說實(shí)話,我已經(jīng)過了對(duì)技術(shù)普及的topic感興趣的階段了。所以兩個(gè)主要的topic都不是很吸引我,而這半途蹦出來的一位90后的小兄弟貢獻(xiàn)的topic給了我不小的震撼,他的作品雖然還有點(diǎn)稚嫩,但是可以看到很多創(chuàng)新點(diǎn)和一些真正的產(chǎn)品級(jí)設(shè)計(jì)。看到了一個(gè)如此鮮活,沒有被教育體制的“壓模機(jī)”殘害過的頭腦,感覺真是不錯(cuò)。(腦子中閃過“炸學(xué)校”短片里的那個(gè)壓模機(jī))一年、3萬行代碼,高二,這幾個(gè)關(guān)鍵加在一起,讓我覺得這個(gè)小兄弟的時(shí)間管理能力應(yīng)該不錯(cuò),于是問了一下,他還真給出了一個(gè)時(shí)間表,很有意思。會(huì)后的討論也很有趣,大家就美工與開發(fā)人員如何配合展開了很深的討論。那對(duì)美工與程序員的搭檔給我留下深刻印象,他們說的一些話體現(xiàn)出來態(tài)度讓我仿佛看到了一個(gè)優(yōu)秀的團(tuán)隊(duì),尤為欣賞,尤其那位美工那種追求更高效交流以期減少浪費(fèi)的“敏捷”態(tài)度在美工中真的是非常少見。(說實(shí)話,程序員中這種態(tài)度也不忒多見)
兩個(gè)活動(dòng)都參加之后,個(gè)人比較來看,Open Party比RIAmeeting精彩,大概是因?yàn)镽IAMeeting更像是Flex的傳播活動(dòng),偏向普及,缺乏高級(jí)點(diǎn)的交流,而OpenParty則是從業(yè)人員的經(jīng)驗(yàn)交流,門檻稍微高一點(diǎn)。其實(shí)對(duì)于線下的交流我還是比較喜歡門檻高一點(diǎn),那樣比較過癮。
【花絮】
在OpenParty上我們講解了FunFX之后。熊節(jié)跟我說他剛才也做了一個(gè)自動(dòng)化測(cè)試的框架。雖然我已經(jīng)把敏捷和熊節(jié)這兩個(gè)詞關(guān)聯(lián)起來很久了,但是這等速度還是讓我吃了一驚(導(dǎo)致現(xiàn)在我還在懷疑是不是我聽錯(cuò)了,
已經(jīng)證實(shí)。。。我聽錯(cuò)了)。那個(gè)框架當(dāng)天就被熊節(jié)發(fā)到了google code上,當(dāng)時(shí)他的名字是:
Fluorine,還寫了一句很有趣的話:Fluorine makes your teeth FLASH。可惜這個(gè)名字有人用過了,現(xiàn)在改名為Fluorida。
Fluorida的原理說白了很簡(jiǎn)單,使用dispatchEvent的方式模擬操作,若干個(gè)月之前我也這么干過,當(dāng)時(shí)是對(duì)這種方式的可行性表示懷疑的。在后來在Google code上下載了代碼并閱讀一遍之后,我開始覺得這個(gè)做法沒啥問題。而且相比FunFx,他不需要Flex程序員再去學(xué)Ruby。今天很榮幸的加入到這個(gè)項(xiàng)目組中。
如今預(yù)覽版--0.0.1版已經(jīng)發(fā)布,廣泛征集回饋和建議中,有任何建議可以到
http://code.google.com/p/fluorida/wiki/Announcement001 發(fā)表評(píng)論
======
主要相關(guān)報(bào)道及文章:
http://www.matrix.org.cn/resource/news/7cf0239a-ebe6-11dc-91da-b599c3ba16ef.html
http://dreamhead.blogbus.com/logs/16533990.html
http://gigix.thoughtworkers.org/2008/3/6/announcement-fluorida-0-0-1
項(xiàng)目地址:
http://code.google.com/p/fluorida/
這世界上有很多界限,有些是看的見得,有些是看不見的。看得見的界限我們想辦法總能突破,而看不見的,則無法可想。
最可悲的是當(dāng)看到本來看不見界限的時(shí)候,剎那的無力感會(huì)將自己的一切驕傲粉碎。
我很喜歡《褻瀆》的一個(gè)詞--位面。不一樣強(qiáng)大的人們就像活在不同的位面。在一個(gè)位面里,沒什么障礙是無法突破的,可位面間的界限,有時(shí)候你連他在哪都不知道。何談突破。