先說項(xiàng)目開發(fā)過程中團(tuán)隊(duì)人員的分工協(xié)作蔼卡。
一 人員安排
畢業(yè)至今的大部分項(xiàng)目都是獨(dú)立完成喊崖,雖然也有和其他同事協(xié)作的時(shí)候,但自認(rèn)為對團(tuán)隊(duì)協(xié)作的了解和認(rèn)知都還有所欠缺雇逞。很清楚團(tuán)隊(duì)協(xié)作的重要性荤懂,但尚未有很好的機(jī)會(huì)在相對成熟的團(tuán)隊(duì)中鍛煉實(shí)踐。
先拋開軟件開發(fā)團(tuán)隊(duì)中人員的具體安排不講喝峦,單純的看軟件開發(fā)工作的分工势誊。在上面設(shè)想的開發(fā)架構(gòu)中,宏觀上可將一個(gè)項(xiàng)目劃分為前端谣蠢、程序粟耻、數(shù)據(jù)庫三個(gè)模塊。由此可推導(dǎo)出團(tuán)隊(duì)中需要的成員:美工眉踱、程序員和項(xiàng)目經(jīng)理挤忙。
認(rèn)為理想的軟件開發(fā)團(tuán)隊(duì)由四個(gè)專業(yè)技能過硬的成員組成:一個(gè)美工,熟悉UI的設(shè)計(jì)并具備將效果圖轉(zhuǎn)換成前端頁面的能力谈喳,也就是得同時(shí)精通PhotoShop册烈、HTML、CSS婿禽、jQuery等前端知識赏僧;一個(gè)程序員,熟練掌握代碼的編寫重構(gòu)扭倾;一個(gè)項(xiàng)目經(jīng)理淀零,具備需求分析的能力、數(shù)據(jù)庫設(shè)計(jì)維護(hù)的能力膛壹、架構(gòu)設(shè)計(jì)的能力驾中、程序編寫的能力、前端樣式腳本編寫的能力模聋,最重要的是對業(yè)務(wù)流程有精準(zhǔn)的把握肩民;一個(gè)部門經(jīng)理,和前三位不一樣链方,部門經(jīng)理只具備領(lǐng)導(dǎo)能力即可持痰,他是兼職,不需要把全部時(shí)間投入到團(tuán)隊(duì)中祟蚀。
大部分中小型項(xiàng)目可以由這樣的四人團(tuán)隊(duì)完成工窍,可如果項(xiàng)目較大占调,已經(jīng)大大超出了四個(gè)人可完成的工作量,可以再加一個(gè)前端開發(fā)人員移剪。也就是說兩個(gè)前端開發(fā)者,一個(gè)負(fù)責(zé)UI設(shè)計(jì)薪者,做出完整的效果圖纵苛,這個(gè)人的設(shè)計(jì)功底應(yīng)該比較強(qiáng);一個(gè)負(fù)責(zé)將效果圖轉(zhuǎn)換成頁面言津,并完成樣式攻人、腳本等的編寫,這個(gè)人對前端樣式腳本的掌握應(yīng)該比較熟練悬槽。同時(shí)程序員的數(shù)量也可以增加怀吻,可以根據(jù)業(yè)務(wù)將軟件劃分成不同的功能模塊,按照功能模塊進(jìn)行工作量上的劃分初婆,交給不同的程序員完成蓬坡。也可以根據(jù)程序架構(gòu)進(jìn)行工作量上的劃分,實(shí)體由誰來負(fù)責(zé)磅叛、接口由誰來負(fù)責(zé)屑咳、應(yīng)用層由誰來負(fù)責(zé)、業(yè)務(wù)邏輯層由誰來負(fù)責(zé)弊琴、數(shù)據(jù)訪問層由誰來負(fù)責(zé)兆龙,等。無論項(xiàng)目如何龐大敲董,這個(gè)項(xiàng)目的整體設(shè)計(jì)師只能有一位紫皇,那就是項(xiàng)目經(jīng)理,負(fù)責(zé)UI的設(shè)計(jì)者腋寨,最好也只有一位聪铺,這樣可以確保整個(gè)項(xiàng)目設(shè)計(jì)的完整性、協(xié)調(diào)性精置。
也沒有更大規(guī)模項(xiàng)目的開發(fā)經(jīng)驗(yàn)雁乡,如果成員質(zhì)量可靠的話类少,四個(gè)人的開發(fā)團(tuán)隊(duì)足以應(yīng)付大部分Web業(yè)務(wù)系統(tǒng)的開發(fā)。一直主張,在可能的情況下屿聋,團(tuán)隊(duì)中的成員質(zhì)量應(yīng)該越高越好,而團(tuán)隊(duì)中的成員數(shù)量則應(yīng)該越少越好娶桦。因?yàn)樗娜艘陨系膱F(tuán)隊(duì)浦楣,溝通成本會(huì)隨著人員數(shù)量的增長指數(shù)增長,工作效率也會(huì)隨著人員數(shù)量的增長指數(shù)下降火欧。
團(tuán)隊(duì)成員中溝通的問題稍后介紹棋电,先來講下團(tuán)隊(duì)各成員的工作重心茎截。項(xiàng)目經(jīng)理負(fù)責(zé)數(shù)據(jù)庫的詳細(xì)設(shè)計(jì)、程序架構(gòu)和前端的宏觀設(shè)計(jì)赶盔,把控全局且必須參與到具體的開發(fā)工作中企锌。項(xiàng)目經(jīng)理是整個(gè)團(tuán)隊(duì)成員中工作量最大的一位,必須是全職于未,在一個(gè)項(xiàng)目完工之前撕攒,他不應(yīng)該去做與這個(gè)項(xiàng)目無關(guān)的任何其它工作。部門經(jīng)理主要負(fù)責(zé)跟蹤項(xiàng)目開發(fā)進(jìn)程烘浦,督促項(xiàng)目經(jīng)理和團(tuán)隊(duì)的工作抖坪,并滿足項(xiàng)目經(jīng)理調(diào)用公司各種資源的需求。部門經(jīng)理可以定期組織會(huì)議聽取項(xiàng)目經(jīng)理和團(tuán)隊(duì)針對項(xiàng)目的工作匯報(bào)闷叉,也可以提出自己的部分意見擦俐,但對于項(xiàng)目的開發(fā)實(shí)現(xiàn)沒有任何的決定權(quán)。部門經(jīng)理的責(zé)任最大握侧,但日常工作量并不多蚯瞧,因?yàn)樗麩o需涉及具體的項(xiàng)目開發(fā)工作。
對項(xiàng)目的最終展現(xiàn)有決定權(quán)的只能有兩個(gè)人品擎,一個(gè)是客戶状知,一個(gè)是項(xiàng)目經(jīng)理∧醪椋客戶是第一位的饥悴,提出需求;項(xiàng)目經(jīng)理是第二位的盲再,決定此需求的實(shí)現(xiàn)方式西设。除此之外,不應(yīng)該有其它任何人干涉項(xiàng)目的具體工作答朋。尤其是管理者贷揽,比如這里的部門經(jīng)理。部門經(jīng)理必須要跟蹤并督促項(xiàng)目的進(jìn)展梦碗,但萬萬不要干涉具體的項(xiàng)目開發(fā)設(shè)計(jì)禽绪。
負(fù)責(zé)整體設(shè)計(jì)的人一定要參與到開發(fā)工作中,誰設(shè)計(jì)的誰就要參與到具體開發(fā)中洪规,不懂開發(fā)不想開發(fā)開發(fā)不了就不要參與設(shè)計(jì)印屁。有些懂技術(shù)的管理者喜歡自己設(shè)計(jì)項(xiàng)目,然后交由下面的人去實(shí)現(xiàn)自己的設(shè)計(jì)斩例,這種看似沒有問題的分工方式實(shí)際上是最致命的雄人。管理者喜歡這樣做,是想讓這個(gè)項(xiàng)目按自己的理念完成念赶,讓這個(gè)項(xiàng)目處于自己的掌控之中础钠,但同時(shí)恰力,具體的開發(fā)工作又是非常繁瑣耗費(fèi)精力的,這部分工作全交給下面的員工去做旗吁,自己坐享其成踩萎。這樣分工的問題在哪里呢?坦白的講很钓,很多管理者對技術(shù)的掌握驻民、對業(yè)務(wù)的了解遠(yuǎn)不如基層員工,由他來負(fù)責(zé)設(shè)計(jì)履怯,設(shè)計(jì)本身可能就是有問題的。更壞的情況是裆泳,不負(fù)責(zé)整個(gè)項(xiàng)目的整體設(shè)計(jì)叹洲,整體設(shè)計(jì)由項(xiàng)目經(jīng)理來做,但關(guān)鍵性的業(yè)務(wù)工禾,非要自己來設(shè)計(jì)运提。項(xiàng)目經(jīng)理、程序員在去實(shí)現(xiàn)這樣的設(shè)計(jì)時(shí)闻葵,會(huì)遇到很多問題民泵,有的是在開發(fā)過程中就做不下去了,有的勉強(qiáng)開發(fā)出來槽畔,卻給后期的擴(kuò)展維護(hù)更改埋下了巨大隱患栈妆,一個(gè)失敗的項(xiàng)目也就這么出來了。
在法律術(shù)語中有“誰主張誰舉證”的說法厢钧,在軟件開發(fā)中也應(yīng)該有一條類似的術(shù)語鳞尔,“誰設(shè)計(jì)誰開發(fā)”。你設(shè)計(jì)卻讓別人去開發(fā)同你主張卻讓別人舉證一樣荒唐早直×燃伲“誰設(shè)計(jì)誰開發(fā)”可以有效避免上面提到的問題,如果項(xiàng)目設(shè)計(jì)者知道由自己去參與實(shí)現(xiàn)自己的設(shè)計(jì)霞扬,那他在設(shè)計(jì)時(shí)就會(huì)慎重許多糕韧。如果他自己開發(fā)都無法實(shí)現(xiàn)自己的設(shè)計(jì),那別人又能如何呢喻圃?這樣責(zé)任就會(huì)歸咎到根源上萤彩。如果真的形成這樣一條鐵律,或許就不會(huì)有人去輕易的干涉設(shè)計(jì)工作斧拍,因?yàn)槌杀咎咂故琛⒋鷥r(jià)太大。
之所以花這么多時(shí)間講管理者饮焦、設(shè)計(jì)者怕吴、開發(fā)者之間的分工窍侧,是因?yàn)檫^去經(jīng)手的諸多項(xiàng)目中有不少都是毀在了管理者的干涉上。但是转绷,人員分工方案和“誰設(shè)計(jì)誰開發(fā)”原則只是一種理想的情況伟件,現(xiàn)實(shí)的工作中,怕很難能做到這點(diǎn)议经。團(tuán)隊(duì)之間需要一個(gè)相互角逐的過程斧账,每個(gè)人都在往里面施加自己的影響力,最終勝出的那個(gè)人才可能有最終的話語權(quán)煞肾。有人的地方就會(huì)有江湖咧织,有江湖的地方就會(huì)有爭斗。
曾多次向同事講過《人月神話》中提到的巴比倫塔的故事籍救,上帝為了阻止人們建造巴比倫塔而創(chuàng)造了不同的語言习绢,使人與人之間無法溝通,最終導(dǎo)致此工程的失敗蝙昙。團(tuán)隊(duì)協(xié)作中最核心的問題就是溝通闪萄。適時(shí)的進(jìn)行定期的、不定期的會(huì)議對團(tuán)隊(duì)人員之間的相互磨合至關(guān)重要奇颠“苋ィ《動(dòng)物世界》中有記錄,狼群即便是在非守獵的閑暇時(shí)間也會(huì)定期組織聚會(huì)烈拒,增進(jìn)感情圆裕、明確組織中的成員地位。人也應(yīng)該是一樣的荆几。
人與人間的溝通效率直接決定著整個(gè)團(tuán)隊(duì)的工作效率葫辐。在上面提到的對軟件開發(fā)團(tuán)隊(duì)的成員劃分中,項(xiàng)目經(jīng)理對數(shù)據(jù)庫伴郁、程序耿战、架構(gòu)的設(shè)計(jì)要和程序員對接,項(xiàng)目經(jīng)理對界面焊傅、前端的設(shè)計(jì)要和美工剂陡、前端開發(fā)者對接,項(xiàng)目經(jīng)理對全局的設(shè)計(jì)狐胎、比如前端腳本和后端程序的互調(diào)要和所有人對接鸭栖。UI設(shè)計(jì)者要和將UI轉(zhuǎn)換成具體頁面并編寫相應(yīng)腳本的前端人員對接。前端人員要和程序員進(jìn)行對接握巢。項(xiàng)目經(jīng)理是所有溝通渠道的樞紐晕鹊,責(zé)任重大。
人不是機(jī)器,都會(huì)有情緒溅话,有好惡晓锻,這種好惡情緒會(huì)導(dǎo)致團(tuán)隊(duì)各成員之間互相合得來或合不來,這是致命的飞几。在團(tuán)隊(duì)砚哆,應(yīng)該杜絕個(gè)人情緒,拋開喜怒哀樂只就事論事就工作論工作屑墨。為了保證溝通渠道的暢通躁锁,定期的會(huì)議是必須的,項(xiàng)目開發(fā)過程中卵史,也可根據(jù)實(shí)際情況增加臨時(shí)會(huì)議战转。團(tuán)隊(duì)初建之時(shí),為了增進(jìn)相互了解以躯,定期的會(huì)議應(yīng)該是相對頻繁的槐秧。團(tuán)隊(duì)成型之后,定期的會(huì)議可以適當(dāng)(是適當(dāng))減少寸潦,而著重于增加溝通效率。既然都相互熟悉了社痛,那就把溝通成本降到最低见转。除了會(huì)議,也可以嘗試進(jìn)行其它的團(tuán)體活動(dòng)蒜哀,比如適時(shí)的戶外活動(dòng)斩箫、定時(shí)聚餐等等,以增進(jìn)相互了解撵儿。團(tuán)隊(duì)的形成乘客,終需要時(shí)間的磨合,而如何把這個(gè)磨合時(shí)間降到最底淀歇,團(tuán)隊(duì)帶頭人的責(zé)任最大易核。在團(tuán)隊(duì)中,個(gè)人能量的大小不是最重要的浪默,重要的是整個(gè)團(tuán)隊(duì)能量的大小牡直。成然,團(tuán)隊(duì)中每個(gè)成員的質(zhì)量在一定程度上決定著整個(gè)團(tuán)隊(duì)的質(zhì)量纳决,可如果每個(gè)成員僅僅在技術(shù)上優(yōu)秀碰逸,互相之間卻不溝通協(xié)調(diào)、甚至在工作上為一己之私勾心斗角阔加,那這個(gè)團(tuán)隊(duì)永遠(yuǎn)不會(huì)是一個(gè)成功的團(tuán)隊(duì)饵史。團(tuán)隊(duì)中的每個(gè)成員都應(yīng)該擁有大局觀念、團(tuán)結(jié)意識,這才是第一位的胳喷。
鍛煉團(tuán)隊(duì)最有效的方式和鍛煉個(gè)人的一樣湃番,還是實(shí)戰(zhàn),如果不考慮人員變動(dòng)厌蔽,三個(gè)項(xiàng)目過去牵辣,團(tuán)隊(duì)自然可以成型。
認(rèn)為理想的WEB應(yīng)用程序開發(fā)框架是自己先前設(shè)想的那種奴饮,前端纬向、程序、數(shù)據(jù)庫之間互相分離戴卜,以上關(guān)于團(tuán)隊(duì)成員的劃分安排即是在這種開發(fā)框架下設(shè)定逾条。如果不是這種開發(fā)模式,比如用了服務(wù)器控件投剥、比如用的是其它編程語言师脂、比如不支持多數(shù)據(jù)庫,甚至是非WEB應(yīng)用項(xiàng)目的開發(fā)江锨,團(tuán)隊(duì)成員劃分方案大致類似吃警。
二 了解需求
雖然在本文檔中對軟件開發(fā)的環(huán)節(jié)逐個(gè)分別進(jìn)行討論,但這并不是說各個(gè)環(huán)節(jié)之間是完全隔離的啄育。正如下面的圖中所繪酌心,了解需求、需求分析挑豌、文檔設(shè)計(jì)等環(huán)節(jié)之間都是有交集的安券,而非孤立的。在了解需求的時(shí)候項(xiàng)目經(jīng)理的腦海中其實(shí)已經(jīng)開始進(jìn)行需求分析氓英、項(xiàng)目設(shè)計(jì)了侯勉,在需求分析的時(shí)候項(xiàng)目經(jīng)理的腦海中也已經(jīng)開始進(jìn)行項(xiàng)目設(shè)計(jì)了,文檔的整理也都是在這些環(huán)節(jié)中逐步先成型于腦海铝阐,最后將其表述在WORD文檔中址貌。
在第二次世界大戰(zhàn)中,美國陸軍兵器修理部首創(chuàng)5W2H分析法徘键,又叫七何分析法芳誓,這對于決策和執(zhí)行性的活動(dòng)措施非常有幫助,也有助于彌補(bǔ)考慮問題的疏漏啊鸭,此分析法非常適用于軟件開發(fā)前的需求了解锹淌、確認(rèn)、分析赠制。2H赂摆,How to do挟憔、How much實(shí)際就是就是對需求進(jìn)行分析的過程,這個(gè)會(huì)在下個(gè)章節(jié)中介紹烟号。5W绊谭,What、Who汪拥、Why达传、Where、When才是了解需求時(shí)要向目標(biāo)對象確認(rèn)的問題迫筑,是本模塊要介紹的內(nèi)容宪赶。
在軟件需求了解過程中,對要思考的5W問題進(jìn)行了新的排序脯燃。
步驟(1)做什么(What)搂妻?
第一個(gè)要搞明白的,這是什么辕棚?要實(shí)現(xiàn)什么功能欲主?必須要實(shí)現(xiàn)的功能有哪些?不確定是否要實(shí)現(xiàn)的功能有哪些逝嚎?核心的功能有哪些扁瓢?是WEB應(yīng)用系統(tǒng)還是桌面應(yīng)用程序?是注重處理業(yè)務(wù)實(shí)現(xiàn)還是注重信息展示還是兩者兼有补君?對于數(shù)據(jù)庫有沒有特別的要求引几?有沒有什么規(guī)范、有的話是什么赚哗?
初次了解她紫,就應(yīng)該用草紙給出一個(gè)大致的列表硅堆,列出開發(fā)要實(shí)現(xiàn)的核心功能屿储。What是5W的核心,盡可能詳細(xì)的弄明白自己將要開發(fā)的是什么樣的軟件非常重要渐逃。不過够掠,也別期望經(jīng)過些簡短溝通分析就能把所有細(xì)節(jié)確定下來,完整需求的確認(rèn)是貫穿好多個(gè)環(huán)節(jié)的茄菊。
以往的項(xiàng)目中疯潭,甚至有到開發(fā)階段才發(fā)現(xiàn)自己對需求的理解有誤。設(shè)計(jì)都已經(jīng)完了面殖,都已經(jīng)開始開發(fā)了竖哩,出現(xiàn)這樣的問題自然會(huì)非常麻煩,但也應(yīng)該有相應(yīng)的解決措施脊僚。也正因?yàn)槿绱讼嗳诹私庑枨髸r(shí)才不得不仔細(xì),盡可能的和項(xiàng)目負(fù)責(zé)人多會(huì)面多溝通以搞清楚這個(gè)What。
步驟(2) 誰(who)增淹?
項(xiàng)目的需求來自于誰(哪里)椿访?項(xiàng)目的使用者是誰?項(xiàng)目的溝通協(xié)調(diào)人是誰虑润?項(xiàng)目的檢驗(yàn)者是誰成玫?項(xiàng)目的主負(fù)責(zé)人是誰?
就曾遇到過的情況拳喻,項(xiàng)目的開發(fā)需求一般來自于四種目標(biāo)對象:
A哭当、客戶。這是最常見的情況舞蔽,因?yàn)閱挝坏目蛻粲心骋环矫娴木唧w需要荣病,才要做這個(gè)項(xiàng)目。只要客戶那邊負(fù)責(zé)項(xiàng)目溝通協(xié)調(diào)的是個(gè)明白人渗柿,后面一切都好辦个盆。而且就過去遇到的情況,協(xié)調(diào)人一般都是基層員工或基層員工的小領(lǐng)導(dǎo)朵栖,對現(xiàn)實(shí)的需求也都比較清楚胆筒,這樣自己的工作做起來還是比較容易的。
B熏瞄、自己葱绒。這是特殊情況,比如提到的權(quán)限管理系統(tǒng)门扇,是因?yàn)樽约旱呐d趣雹有,覺得有必要做個(gè)什么項(xiàng)目。自己想要的東西臼寄,當(dāng)然自己最清楚了霸奕,這本來是了解需求的最簡單情況,但因?yàn)樽约合胍目偸翘^完美吉拳,總是想開發(fā)一個(gè)盡乎完美的產(chǎn)品质帅,所以其實(shí)這個(gè)才是最難的。
C留攒、市場煤惩。更多的像是在說互聯(lián)網(wǎng)產(chǎn)品,既然是來自于市場炼邀,那就面臨著諸多的不確定性魄揉。你的使用者都是泛泛的用戶,沒有非常明確的需求拭宁。只能是自己通過可能的渠道去了解洛退,并參考網(wǎng)絡(luò)中已有的資源票彪,來大致確定一種需求,再進(jìn)行開發(fā)不狮。如果項(xiàng)目經(jīng)理的能力足夠降铸,又沒有來自領(lǐng)導(dǎo)層的不靠譜干預(yù),這個(gè)也是有可能開發(fā)出實(shí)用性產(chǎn)品的摇零,不過推掸,不容易。
D驻仅、領(lǐng)導(dǎo)谅畅。公司的領(lǐng)導(dǎo)層憑空想要這么一個(gè)東西,比如別的公司有病理心電噪服,我們沒有毡泻,你們做一個(gè)。這還不是最麻煩的粘优,更麻煩的是憑空想象這么一個(gè)產(chǎn)品還在憑空規(guī)定一種技術(shù)仇味,要求必須這樣這樣開發(fā),要求必須按他的想法來做雹顺。曾經(jīng)說過丹墨,見過的同行中60%以上的人不識貨,見過的客戶中80%以上的人不識貨嬉愧,見過的領(lǐng)導(dǎo)中100%的人不識貨贩挣,真的不是夸張,所以這是四種情況中最麻煩的一種没酣。也可能是被糊涂的領(lǐng)導(dǎo)折磨過敏了王财,總之,以后如再遇到這種情況裕便,一定做好心理準(zhǔn)備绒净,如果發(fā)現(xiàn)領(lǐng)導(dǎo)是自己見過的糊涂的那種,盡可能的想辦法把活推給別人闪金。
并不是做互聯(lián)網(wǎng)產(chǎn)品出身疯溺,所以對第三種情況不敢妄談论颅,但并不認(rèn)為自己對互聯(lián)網(wǎng)產(chǎn)品的了解就不如企業(yè)內(nèi)部應(yīng)用系統(tǒng)哎垦。也一直希望手里的系統(tǒng)都能像互聯(lián)網(wǎng)產(chǎn)品一樣易用穩(wěn)定,這是自己追求的產(chǎn)品目標(biāo)恃疯。
項(xiàng)目的使用者肯定不是唯一的漏设,結(jié)合上面的What,應(yīng)該弄明白會(huì)有哪幾類使用者今妄,每類使用者之間可使用的功能有什么區(qū)別郑口,每類使用者的人數(shù)大致有多少鸳碧,哪一類是系統(tǒng)的主要用戶,這對于設(shè)計(jì)階段劃分系統(tǒng)角色非常重要犬性。
因?yàn)樽约旱墓ぷ髡袄耄?xiàng)目開發(fā)需求大都來自于A情況,也就是實(shí)實(shí)在在的客戶乒裆。這種情況套利,項(xiàng)目最終的成敗不僅僅是由產(chǎn)品的好壞來決定。項(xiàng)目最終能否順利驗(yàn)收鹤耍,說白了肉迫,也就是項(xiàng)目校驗(yàn)者、主負(fù)責(zé)人的一句話稿黄。 所以應(yīng)提前弄清楚項(xiàng)目的協(xié)調(diào)人喊衫、校驗(yàn)者、主負(fù)責(zé)人杆怕,這對于后期工作也是至關(guān)重要的族购。
步驟(3)何地(where)?
開發(fā)完成的項(xiàng)目最終要部署在什么地方陵珍?環(huán)境是內(nèi)網(wǎng)還是外網(wǎng)联四?什么操作系統(tǒng)什么數(shù)據(jù)庫什么環(huán)境可變動(dòng)否?確定的還是不確定的撑教?
比如現(xiàn)在開發(fā)的遠(yuǎn)程醫(yī)學(xué)平臺朝墩,在每個(gè)省份每個(gè)客戶那里的部署環(huán)境都不大一樣,尤其是網(wǎng)絡(luò)環(huán)境伟姐。有的是要部署在內(nèi)網(wǎng)收苏,有的是要部署在外網(wǎng),有的是要求內(nèi)外網(wǎng)都可以訪問愤兵。雖然最終的網(wǎng)絡(luò)環(huán)境對開發(fā)工作影響并不大鹿霸,但還是提前知道有點(diǎn)心理準(zhǔn)備為好。操作系統(tǒng)一般都是Windows的秆乳,數(shù)據(jù)庫一般是Oracle和 SQLServe懦鼠,這些要求一般都是由開發(fā)者來提,不過也有客戶為了跟他們內(nèi)部的系統(tǒng)保持一致直接要求必須用什么庫屹堰。
對于不確定的部署環(huán)境肛冶,開發(fā)者只能提前做好多個(gè)準(zhǔn)備,不過這個(gè)問題不大扯键。了解清楚Where睦袖,主要是為后期項(xiàng)目的部署做好準(zhǔn)備。
步驟(4)何時(shí)(when)荣刑?
目標(biāo)對象要求多長時(shí)間完成工作馅笙?自己初步估計(jì)需要多長時(shí)間可以開發(fā)完成伦乔?目標(biāo)對象的可承受時(shí)間下限是什么?
目標(biāo)對象可能是客戶董习、自己烈和、市場、領(lǐng)導(dǎo)皿淋。對于客戶斥杜,他們當(dāng)然是要求愈快愈好,其實(shí)大部分情況他們自己也說不清楚具體的時(shí)間沥匈,只是希望今天提出要求蔗喂,明天就能出來,這當(dāng)然是不可能的高帖。要了解的是他們能承受的上限缰儿,開發(fā)時(shí)間千萬不要越過這個(gè)上限。
可以在計(jì)劃上對項(xiàng)目進(jìn)行分期散址,一期實(shí)現(xiàn)核心的功能乖阵,先上線運(yùn)行,后面再逐步完善预麸。想一次性完美實(shí)現(xiàn)所有的需求瞪浸,不但時(shí)間不允許,怕開發(fā)人員的能力也是不夠的吏祸。
先出來這么一樣產(chǎn)品对蒲,讓客戶先用著,后面再一點(diǎn)點(diǎn)完善贡翘。說的直白點(diǎn)蹈矮,就是敏捷開發(fā)、頻繁迭代鸣驱,這也是好多領(lǐng)導(dǎo)多次要求的開發(fā)方式泛鸟,但其實(shí)這樣做的問題非常多,而且這種方式非常不適合項(xiàng)目的目標(biāo)對象是客戶的情況踊东。
先期的產(chǎn)品定然有瑕疵北滥,匆忙上線只會(huì)讓客戶對這個(gè)產(chǎn)品各種不滿意,而且客戶一但看到這個(gè)產(chǎn)品闸翅,那怕明知它是先期的再芋,也會(huì)提出各種各樣的更改要求。這樣缎脾,忙于應(yīng)付客戶更改要求的開發(fā)人員哪里還有時(shí)間繼續(xù)未完成的開發(fā)工作祝闻?所以前期應(yīng)盡可能的和目標(biāo)對象角逐占卧,把時(shí)間拖到最長遗菠,以盡可能多的完成這個(gè)產(chǎn)品联喘,完成的差不多時(shí)再拿給用戶看。后期的產(chǎn)品已經(jīng)很完善了辙纬,如果功能豁遭、效果圖又都在前期做過詳細(xì)確認(rèn),這時(shí)客戶的更改要求應(yīng)該會(huì)相應(yīng)少些贺拣,既便很多蓖谢,不涉及根本功能的變更,開發(fā)者要做的工作也就相對容易了譬涡。
目標(biāo)對象是領(lǐng)導(dǎo)和市場的處理方式類似闪幽,如果目標(biāo)對象是自己,開發(fā)工作一般都只能抽業(yè)余時(shí)間涡匀,也應(yīng)該有非常明確的時(shí)間底線才好盯腌,不能總是拖著。所有的工作陨瘩,拋開時(shí)間來談都沒有任何意義腕够。
在這里整理軟件開發(fā)的完整流程,就是想將項(xiàng)目周期壓縮到最低舌劳。因?yàn)槟繕?biāo)對象的耐性不是無限的帚湘,可以盡量拖著以把產(chǎn)品做到最好,但拖的時(shí)間越長甚淡,自己面臨的各方壓力就會(huì)越大大诸,如果達(dá)到臨界值,項(xiàng)目也就報(bào)廢了贯卦。這種情況也是出現(xiàn)過很多次的底挫,不能不引起警覺。
步驟(5)為什么(why)脸侥?
Why應(yīng)該是貫穿在前四個(gè)W中的建邓,每得到一個(gè)W的答案,都應(yīng)該多問一句睁枕,這樣做的目的是什么官边?為什么要這樣做?不這樣做不行嗎外遇?用另外一種做法行不行注簿?Why提供了一個(gè)更好更深入了解需求的機(jī)會(huì)。
從項(xiàng)目啟動(dòng)開始跳仿,手里邊就應(yīng)該有一支鉛筆诡渴、一個(gè)鉆筆刀、幾張白紙菲语,以便隨時(shí)把自己的思路記錄下來妄辩。和目標(biāo)對象溝通了解需求時(shí)應(yīng)該注意積累一些小的技巧惑灵。在會(huì)面時(shí)近可能的用手機(jī)進(jìn)行錄音,以方便自己后期查對眼耀。備好紙筆英支,對關(guān)鍵性問題進(jìn)行記錄。見面時(shí)注意把控整體的交流氛圍并注意一些溝通技巧哮伟,如果是相對正式的會(huì)談大家應(yīng)該提前互相預(yù)約一下干花,讓雙方都有些準(zhǔn)備,自己要提前準(zhǔn)備好要問的問題楞黄。首次見面池凄,應(yīng)該互留下聯(lián)系方式,以方便后面隨時(shí)溝通鬼廓。如果能深入到前線修赞,和目標(biāo)對象天天照面,那就更好了桑阶,可以隨時(shí)對需求了解確認(rèn)柏副,這樣就很少出問題了。還有蚣录,如果可能的話割择,讓目標(biāo)對象提供一些和項(xiàng)目相關(guān)的書面材料,表格萎河、文檔荔泳、手冊、宣傳材料虐杯。不管有用沒用玛歌,先搜集過來再說。
無論準(zhǔn)備的有多充分擎椰,也不能祈求一次簡單的會(huì)面支子、一次簡單的溝通就能把所有的需求了解清楚。你能理解的清楚达舒,目標(biāo)對象卻未必能一次就把自己想要的說清楚值朋,有時(shí)甚至?xí)z忘掉關(guān)鍵部分。溝通巩搏、了解昨登、分析、確認(rèn)是一個(gè)循環(huán)的過程贯底,就像上面的流程圖中所繪丰辣,跟客戶的溝通確認(rèn)是貫穿整個(gè)開發(fā)前的階段的,甚至?xí)永m(xù)到開發(fā)之中、開發(fā)之后笙什。
了解需求之后飘哨,可以落實(shí)的是,初步的溝通筆記得湘、錄音資料杖玲,目標(biāo)標(biāo)對象提供的相關(guān)文檔資料顿仇,腦海中本項(xiàng)目的早期零散瑣碎片段淘正。
三 需求分析
對需求進(jìn)行分析的過程,就是將早期進(jìn)行需求了解時(shí)搜集到的資料臼闻、腦海中的零散碎片進(jìn)行整理的過程鸿吆,最終以文檔的形式將需求具體化下來。
需求分析時(shí)述呐,首先將手里面掌握的零碎的資料做下整理惩淳,把用戶提到的要求再梳理一下,用草紙做下大致的記錄乓搬。然后考慮前面提到的2H的問題思犁。
步驟(6) 怎樣(How)?
實(shí)現(xiàn)這樣的需求應(yīng)該怎樣做进肯?有沒有技術(shù)難點(diǎn)激蹲、可否實(shí)現(xiàn)?業(yè)務(wù)流程應(yīng)該是怎樣的江掩?數(shù)據(jù)庫如何設(shè)計(jì)学辱?總的架構(gòu)如何設(shè)計(jì)?框架如何設(shè)計(jì)环形?前端如何設(shè)計(jì)策泣?能安排給誰來做各模塊?目前的需求有哪些模糊的部分需要再次確認(rèn)抬吟?
考慮How的問題萨咕,并不是說現(xiàn)在就要給出一個(gè)詳細(xì)的實(shí)施方案,而是說要對目前掌握到的這個(gè)初步需求進(jìn)行分析火本,發(fā)現(xiàn)其中的實(shí)施難點(diǎn)任洞、需求模糊點(diǎn)。對于難點(diǎn)发侵,考慮下其可否解決交掏、成本如何;對于模糊點(diǎn)刃鳄,標(biāo)記出來后面再次確認(rèn)盅弛。
步驟(7)多少(How much)?
這個(gè)項(xiàng)目的繁雜度如何?做的話時(shí)間成本挪鹏、人力成本是多少见秽?項(xiàng)目的收益是多少、對單位對自己對現(xiàn)在對將來有什么益處讨盒?對單位來講有沒有市場解取?對個(gè)人來講能不能鍛煉自己鞏固提升自己的位置、還是僅僅徒增麻煩返顺?
拋開時(shí)間來講禀苦,所有的工作都沒有任何意義。拋開成本來講遂鹊,工作更是沒有意義振乏。這里的成本,主要是開發(fā)中涉及的人月的問題秉扑,需要多少人多少時(shí)間慧邮。項(xiàng)目的收益能岩,先從個(gè)人來講撰洗,再從公司來講,對于自己和公司都沒有任何好處的項(xiàng)目果正,盡可能的不要接手秦躯。
對手中得到的書面資料及用戶的錄音資料進(jìn)行分析整理忆谓,把核心部分條理化,確認(rèn)的和模糊的分別標(biāo)記宦赠。和目標(biāo)對象保持溝通陪毡,把模糊的部分清晰化。
早期的需求分析勾扭,我們至少要得出下面四個(gè)問題的的初步答案毡琉。
第一個(gè),初步整理后的需求確認(rèn)書妙色。在對了解需求時(shí)的資料進(jìn)行梳理后桅滋,整理出一份前期的需求確認(rèn)書。至少要把核心需求列清晰身辨,以文檔的形式具體化下來丐谋,并和客戶保持非正式溝通、確認(rèn)煌珊。這樣的溝通確認(rèn)應(yīng)該是多次的号俐、循環(huán)的,以對這個(gè)確認(rèn)書進(jìn)行多次的完善定庵,逐步的將其具體化吏饿。
第二個(gè)踪危,可行性研究。對這個(gè)初步的需求確認(rèn)書進(jìn)行可行性研究猪落,用戶的要求是否可以實(shí)現(xiàn)贞远。如果不可以,為什么笨忌?難點(diǎn)在哪里蓝仲?如果可以,難度系數(shù)如何官疲?從個(gè)人來講袱结、從單位來講付出收益間是正值還是負(fù)值?在你看來袁余,結(jié)合你當(dāng)前的時(shí)間安排擎勘,這個(gè)到底值不值得抽出時(shí)間來開發(fā)咱揍。
第三個(gè)颖榜,業(yè)務(wù)流程。就自己了解到的用戶需求煤裙,實(shí)現(xiàn)這些需求的業(yè)務(wù)流程是怎樣的掩完。核心業(yè)務(wù)有哪些?核心業(yè)務(wù)的流程是什么硼砰?附屬業(yè)務(wù)有哪些且蓬?附屬業(yè)務(wù)的流程是什么?比如要給犬只辦卡题翰、比如要進(jìn)行會(huì)診恶阴、比如要交費(fèi)、比如要統(tǒng)計(jì)豹障、比如要管理網(wǎng)站展示信息冯事、比如要進(jìn)行權(quán)限管理,等等血公,大致的流程是怎樣的昵仅?這些要和用戶確認(rèn)清楚。更詳細(xì)的流程累魔,會(huì)在設(shè)計(jì)階段具體化下來摔笤,這里必須得出初步的流程。
第四個(gè)垦写,開發(fā)成本吕世。如果說這個(gè)項(xiàng)目可以開發(fā),值得開發(fā)梯投,業(yè)務(wù)流程也理得差不多了命辖,那需要多少人渴析、具體到是誰?需要多少時(shí)間吮龄、最少要多少時(shí)間俭茧、最長要多少時(shí)間?你個(gè)人以及公司能否持續(xù)投入這樣的時(shí)間和人力來做這項(xiàng)工作漓帚?
早期分析之后母债,即便得到的結(jié)論是不值得開發(fā),或者說要耗費(fèi)的成本很多尝抖、公司可能無法投入這些成本毡们,個(gè)人恐怕也沒有最終的決定權(quán)。項(xiàng)目是否要開發(fā)昧辽,只能說明自己的意見衙熔,會(huì)和最上面的領(lǐng)導(dǎo)層或者商務(wù)部門間進(jìn)行角逐,但拍板的還是大BOSS搅荞。如果說非要開發(fā)自己覺得不能開發(fā)的項(xiàng)目红氯,或者說對自己來講不值的項(xiàng)目,這時(shí)能做的只有明哲保身了咕痛,以手里的其它重要工作為借口把工作推給別人痢甘。如果推也推不掉,那就坦然接受了茉贡,全力去做這個(gè)不可改變的事情塞栅,力求把損失降到最低而把可能的收益最大化。
在整個(gè)的需求分析過程中腔丧,在早期的需求確認(rèn)書出來之后放椰,我們和目標(biāo)對象的溝通應(yīng)該是持續(xù)的。在最后應(yīng)該和目標(biāo)對象進(jìn)行一次正式詳細(xì)的溝通愉粤,把早期的需求確認(rèn)書砾医、早期分析之后零散的碎片進(jìn)一步整理,然后再出一份正式的需求確認(rèn)文檔科汗,交由用戶簽字確認(rèn)藻烤。這份文檔,就是目前可得到的最詳細(xì)的需求確認(rèn)文檔头滔。
在這個(gè)需求分析怖亭、對需求反復(fù)確認(rèn)的過程中,腦海中其實(shí)已經(jīng)開始進(jìn)行項(xiàng)目的初步的設(shè)計(jì)才對坤检。流程兴猩、架構(gòu)、界面早歇、數(shù)據(jù)庫倾芝、程序讨勤、前端、業(yè)務(wù)晨另、權(quán)限等等片段潭千,已經(jīng)開始出現(xiàn)在腦海中了。需要哪些人來做哪些模塊借尿、各模塊大致要花多少時(shí)間刨晴、哪些功能哪些環(huán)節(jié)可能會(huì)出現(xiàn)問題、項(xiàng)目開發(fā)之中開發(fā)之外的阻力可能會(huì)有哪些路翻?這些自己心里面都應(yīng)該有數(shù)了狈癞,只是,仍然沒有具體化下來茂契,而這個(gè)具體化的過程蝶桶,就是項(xiàng)目設(shè)計(jì)的過程。
四 項(xiàng)目設(shè)計(jì)
經(jīng)過需求分析之后掉冶,我們手里已經(jīng)有了一份比較明確的需求確認(rèn)書真竖,同時(shí)項(xiàng)目經(jīng)理的腦海中也有了一個(gè)模糊的模型。項(xiàng)目設(shè)計(jì)環(huán)節(jié)郭蕉,就是要以這份需求確認(rèn)書為基本依據(jù)疼邀,和客戶繼續(xù)保持溝通喂江,將腦海中的項(xiàng)目模型具體化下來召锈,落實(shí)成效果圖、CDM获询、PDM及開發(fā)文檔等電子資料涨岁。
一直在講,無論到哪個(gè)環(huán)節(jié)吉嚣,都不敢說需求已經(jīng)全部確認(rèn)下來梢薪。人的時(shí)間和精力是有限的,但客戶的需求卻是無限的尝哆,哪怕僅僅針對當(dāng)前的項(xiàng)目秉撇。我們能做的不是把客戶的需求全部了解清楚,而是把了解到的需求搞明白秋泄、弄清楚琐馆,不要領(lǐng)會(huì)錯(cuò)了。對于了解的需求恒序,可以少些瘦麸,但不能出錯(cuò)。了解錯(cuò)了歧胁,設(shè)計(jì)就會(huì)出錯(cuò)滋饲,開發(fā)就會(huì)出錯(cuò)厉碟,一錯(cuò)全錯(cuò)。
項(xiàng)目設(shè)計(jì)階段屠缭,要考慮的主要有七個(gè)問題箍鼓。第一個(gè)是業(yè)務(wù)流程,核心業(yè)務(wù)呵曹、附屬業(yè)務(wù)的流程各是什么樣的袄秩;第二個(gè)是前端,包括效果圖逢并、頁面之剧、腳本、樣式砍聊;第三個(gè)是數(shù)據(jù)庫背稼,把業(yè)務(wù)流層轉(zhuǎn)換成表結(jié)構(gòu)、表與表間的關(guān)系玻蝌;第四個(gè)是開發(fā)用什么樣的架構(gòu)蟹肘,前端、程序俯树、數(shù)據(jù)庫之間以什么方式對接帘腹;第五個(gè)是程序,既包括前端腳本的程序也包括后臺的程序许饿,程序的架構(gòu)是什么樣的阳欲,工廠模式、三層陋率、還是其它球化;第六個(gè)是技術(shù)關(guān)鍵點(diǎn),比如有的要用到讀卡機(jī)等外接硬件瓦糟、比如要放在觸摸屏上筒愚、比如要有視頻功能、比如要讀取影像文件菩浙,這些特定的技術(shù)點(diǎn)如何攻破巢掺。第七個(gè)是人員安排和時(shí)間結(jié)點(diǎn),具體到哪個(gè)人來做哪項(xiàng)工作劲蜻,每項(xiàng)工作的時(shí)間節(jié)點(diǎn)是什么陆淀。
業(yè)務(wù)流程是我們在需求分析過程中就已經(jīng)開始確認(rèn)的,但這里要盡一步具體化斋竞。拿起手里的鉛筆倔约,把項(xiàng)目中的所有業(yè)務(wù)列舉出來,再把每個(gè)業(yè)務(wù)的流層圖畫出來坝初。反復(fù)檢查這些流程圖浸剩,檢查業(yè)務(wù)的每一個(gè)環(huán)節(jié)钾军,并跟客戶溝通確認(rèn)。當(dāng)所有的流程圖可以無誤的表述各個(gè)業(yè)務(wù)時(shí)绢要,我們的設(shè)計(jì)就已經(jīng)成功了一半吏恭。
畫流程圖的過程,就是在腦海中模擬使用要開發(fā)的軟件的過程重罪,不過這時(shí)的軟件還在虛無縹緲之中樱哼。在我們的腦海中虛擬出一個(gè)大工廠,但里面什么也沒有剿配,嘗試著走入這座工廠去完成自己的任務(wù)——也就是客戶提出的需求搅幅。為了實(shí)現(xiàn)需要的功能這里可能要建一個(gè)車間,然后思考車間應(yīng)該有多大呼胚、應(yīng)該建成什么樣子的茄唐?為了完成要實(shí)現(xiàn)的功能這里應(yīng)該放置一臺機(jī)器,這臺機(jī)器應(yīng)該如何安放蝇更、用來制造什么物質(zhì)沪编?就這樣的自由組合拼接,直到這個(gè)工廠可以實(shí)現(xiàn)我們提出的所有的功能年扩、完成我們所有的業(yè)務(wù)流程蚁廓。然后繼續(xù)在腦海中模擬使用這個(gè)工廠,一遍又一遍的走我們的業(yè)務(wù)流程厨幻,直到確認(rèn)每個(gè)環(huán)節(jié)都不再出現(xiàn)問題相嵌,都可以應(yīng)付現(xiàn)實(shí)的需求。在這個(gè)過程中克胳,業(yè)務(wù)流程中不合理部分會(huì)被修改或剔除平绩,我們的流程會(huì)更趨于,同時(shí)我們要開發(fā)的軟件也已經(jīng)開始成型漠另。
在梳理這些業(yè)務(wù)流程的時(shí)候,或者說在建工廠的時(shí)候跃赚,腦海中應(yīng)該已經(jīng)開始考慮界面部分如何實(shí)現(xiàn)了笆搓,還是用手里的鉛筆,把界面的草圖畫出來纬傲。每個(gè)業(yè)務(wù)的每個(gè)環(huán)節(jié)满败,在前端如何展現(xiàn)?以什么樣的方式最有特點(diǎn)叹括、最絢麗出眾算墨、最易于人機(jī)交互?只是汁雷,項(xiàng)目經(jīng)理也只能給出一個(gè)大致的草圖净嘀,具體的設(shè)計(jì)實(shí)現(xiàn)還是由美工人員來完成报咳。
外觀界面是項(xiàng)目給人的第一印象,站在客戶的角度來講很重要挖藏。就像一座房子暑刃,你用的鋼筋混泥土的質(zhì)量再好,入住的人是看不到的膜眠,可如果裝修的很奢華岩臣,那給人的第一印象就是這房子很高大上。程序員一般容易輕視界面的重要性宵膨,覺得這不過是一幅皮囊架谎,只要架構(gòu)足夠穩(wěn)定,界面再怎么絢麗辟躏,也不過是是增刪改查幾種動(dòng)作的操作方式不同而以狐树。這樣想也無可厚非,說明項(xiàng)目開發(fā)團(tuán)隊(duì)中每個(gè)人的關(guān)注點(diǎn)不同鸿脓,但項(xiàng)目經(jīng)理應(yīng)該有全局關(guān)念抑钟,要清楚的知道每個(gè)部分的輕重。在不同的需求野哭、不同的客戶在塔、不同的領(lǐng)導(dǎo)、不同的時(shí)間拨黔、不同的外部狀況下蛔溃,各部分的輕重緩急并非是一成不變的。
數(shù)據(jù)庫的設(shè)計(jì)跟界面草圖的設(shè)計(jì)幾乎同步篱蝇,業(yè)務(wù)流程分析完畢贺待、界面草圖繪制完成,實(shí)現(xiàn)這些業(yè)務(wù)用到哪些表就很明確了零截。還是用手中的筆麸塞,把要用到的表列出來,把每張表的關(guān)鍵字段列出來涧衙,把表與表間的關(guān)系標(biāo)注出來哪工。從其功能上來講,數(shù)據(jù)庫就像工廠的倉庫弧哎,但對軟件設(shè)計(jì)者而言雁比,數(shù)據(jù)庫更像是一棟樓房的地基,直接決定著整個(gè)項(xiàng)目的穩(wěn)定性撤嫩。
有人說數(shù)據(jù)庫難以設(shè)計(jì)偎捎,其實(shí)難的并不是數(shù)據(jù)庫的設(shè)計(jì),而是業(yè)務(wù)流程的梳理。再復(fù)雜的業(yè)務(wù)茴她,只要理得清寻拂,表現(xiàn)在數(shù)據(jù)庫中,無外乎是表與表間的三種關(guān)系:one-to-one败京、one-to-many以及many-to-many兜喻。更進(jìn)一步的,many-to-many實(shí)際上就是兩個(gè)one-to-many赡麦。對于核心業(yè)務(wù)部分尚不能明確表與表關(guān)系的朴皆,能一對多就不要一對一,能多對多就不要一對多泛粹。這樣開發(fā)的復(fù)雜度會(huì)增加遂铡,卻消除了后面可能的修改擴(kuò)展的隱患。 “刻削之道晶姊,鼻莫如大扒接,目莫如小。鼻大可小们衙,小不可大也钾怔;目小可大,大不可小也蒙挑。舉事亦然宗侦。為其后可復(fù)者也,則事寡敗矣忆蚀⊙┪唬”說的就是這個(gè)道理甘耿。對于非核心業(yè)務(wù)也不能明確關(guān)系的,可根據(jù)實(shí)際情況氛什,綜合考量開發(fā)實(shí)現(xiàn)的煩瑣程度及未來的可變性再做決定旦签。
當(dāng)業(yè)務(wù)流程负芋、前端界面散庶、數(shù)據(jù)庫的草圖出來不傅,就開始考慮項(xiàng)目的整體架構(gòu)、前端腳本和后臺程序的局部架構(gòu)观堂。前端和程序之間通過何種方式互調(diào)让网?程序和數(shù)據(jù)庫之間以什么方式對接?前端腳本的代碼如何編寫师痕?后臺程序如何設(shè)計(jì)可以把代碼重復(fù)率降到最低、把程序的穩(wěn)定性而账、可調(diào)整性抬到最高胰坟?
類似于表現(xiàn)在數(shù)據(jù)庫的三種關(guān)系,再復(fù)雜的業(yè)務(wù),表現(xiàn)在具體的前端笔横、程序中竞滓,無外乎是四種動(dòng)作,對數(shù)據(jù)庫操作的四種動(dòng)作:增(Add)吹缔、刪(Delete)商佑、改(Update)、查(Select)厢塘。更進(jìn)一步的茶没,四種動(dòng)作其實(shí)就兩種:讀和寫。查為讀晚碾,增抓半、刪、改為寫格嘁,讀寫動(dòng)作的操作頻繁度比例大約為十比一笛求。
界面、頁面糕簿、樣式探入、腳本、程序懂诗、權(quán)限蜂嗽、數(shù)據(jù)庫、整體架構(gòu)响禽、局部架構(gòu)徒爹,自己想要的到底是什么樣子的?發(fā)揮好高級語言封裝芋类、繼承隆嗅、多態(tài)的特性,使架構(gòu)和程序更加的安全侯繁、易用胖喳、穩(wěn)定、高擴(kuò)展贮竟、高內(nèi)聚丽焊、低耦合且功能更強(qiáng)大。在開發(fā)過程中咕别,應(yīng)該把自己遇到的暫時(shí)不好解決的問題及一閃而過的項(xiàng)目靈感等進(jìn)行記錄技健,然后在后面的修改擴(kuò)展中或者是下一個(gè)項(xiàng)目的開發(fā)中,吸收優(yōu)秀的處理經(jīng)驗(yàn)惰拱、竭力避免已經(jīng)出現(xiàn)過的問題雌贱。只有通過這樣的反復(fù)積累,自己在開發(fā)細(xì)節(jié)上的處理才會(huì)日趨完善。
項(xiàng)目設(shè)計(jì)就是給出這個(gè)項(xiàng)目的實(shí)施方案欣孤。在設(shè)計(jì)的過程中馋没,有可能會(huì)發(fā)現(xiàn)一些業(yè)務(wù)之外的技術(shù)難點(diǎn),這些技術(shù)難點(diǎn)大都是之前未曾遇到過的或者是遇到過未曾完美解決的降传。比如前面提到的視頻篷朵、影像及外接硬件等,這些技術(shù)難點(diǎn)如果攻不破婆排,項(xiàng)目肯定也沒辦法完成声旺。對于這些技術(shù)難點(diǎn),應(yīng)該額外分配人手專門對其研究泽论、評估艾少,這個(gè)也馬虎不得。對于特定的項(xiàng)目翼悴,個(gè)人比較偏向于用開源軟件解決這些特定的技術(shù)點(diǎn)缚够,比如處理網(wǎng)頁視頻通信的有WebRTC、OpenMeetings鹦赎,處理影像的有dcm4chee等等谍椅。不過這樣做的問題也不少,如果開源產(chǎn)品不成熟古话,研究配置起來是非常耗時(shí)的雏吭,而且后期的更改維護(hù)幾乎是不可能的,因?yàn)楦拈_源產(chǎn)品的源代碼代價(jià)很大陪踩,相較之下反不如自己研究開發(fā)呢杖们。對于公司通用的項(xiàng)目,遇到相應(yīng)的技術(shù)難點(diǎn)肩狂,肯定是要專門分配人手研究的摘完,比如有些公司本身就是做PACS的,那影像讀取部分自然要掌握核心代碼傻谁。
業(yè)務(wù)流程的草圖出來后孝治,多次檢查有無遺漏環(huán)節(jié),并和目標(biāo)對象循環(huán)溝通確認(rèn)审磁。然后把根據(jù)業(yè)務(wù)流程圖繪制的前端界面草圖交給UI設(shè)計(jì)師谈飒,并把想法告知,由其用PhotoShop將草圖具體化成效果圖态蒂,這個(gè)階段杭措,仍然和目標(biāo)對象保持溝通。效果圖出來后钾恢,找目標(biāo)對象確認(rèn)瓤介,并再次確認(rèn)需求分析吕喘、業(yè)務(wù)流程有無遺漏赘那、有無錯(cuò)誤刑桑。經(jīng)過客戶、UI設(shè)計(jì)師募舟、項(xiàng)目經(jīng)理之間的反復(fù)溝通祠斧、反復(fù)確認(rèn)、反復(fù)修改之后拱礁,出來一份最終的效果圖琢锋。然后項(xiàng)目經(jīng)理根據(jù)效果圖之后更加完整的需求把數(shù)據(jù)庫草圖具體化下來,用PowerDesigner設(shè)計(jì)出相應(yīng)的CDM圖呢灶、PDM圖吴超,并用此工具整理出完整的數(shù)據(jù)庫文檔。這樣前端界面和數(shù)據(jù)庫的設(shè)計(jì)就算完成了鸯乃。后面就是考慮程序和架構(gòu)的具體實(shí)現(xiàn)方式了鲸阻。
最后應(yīng)該考慮的是人員安排及開發(fā)周期問題,具體到團(tuán)隊(duì)中的誰缨睡、要做什么工做鸟悴、時(shí)間節(jié)點(diǎn)是什么,可以借用Project工具奖年,為開發(fā)任務(wù)分配資源细诸、跟蹤進(jìn)度、管理預(yù)算和分析工作量陋守≌鸸螅控制大型項(xiàng)目的第一個(gè)步驟是制定進(jìn)度表,進(jìn)度表由里程碑和日期組成水评。里程碑必須是具體的猩系、特定的和可度量的事件,能進(jìn)行清晰地定義之碗。
過去的項(xiàng)目開發(fā)對時(shí)間的控制非常糟糕蝙眶,大部分項(xiàng)目最終完成所用的時(shí)間都是自己初期預(yù)估的三倍,這到也成了自己的一條經(jīng)驗(yàn)褪那∮姆祝客戶、公司給出的時(shí)間和自己的預(yù)估相差很大博敬,所以自己的早期預(yù)估只能是非常保守的預(yù)估友浸,后面就是長期的和公司、客戶拖延時(shí)間偏窝。還真應(yīng)了那句編程名言:最初的90%的代碼用去了最初90%的開發(fā)時(shí)間收恢,余下的10%的代碼用掉另外90%的開發(fā)時(shí)間武学。項(xiàng)目經(jīng)理心里面應(yīng)該有非常明確的人員安排計(jì)劃、時(shí)間節(jié)點(diǎn)跟蹤計(jì)劃伦意,并將其落實(shí)到文檔中火窒。開發(fā)進(jìn)度應(yīng)該嚴(yán)格依照進(jìn)度表推進(jìn),并根據(jù)明確的時(shí)間節(jié)點(diǎn)(里程碑)進(jìn)行定期的考核驮肉、演示熏矿。
在需求分析之后應(yīng)該有初步的流程草圖、模糊的項(xiàng)目模型和相對明確的需求確認(rèn)書离钝,而在項(xiàng)目設(shè)計(jì)之后票编,必須有客戶確認(rèn)的前端效果圖、完整的數(shù)據(jù)庫表結(jié)構(gòu)卵渴、數(shù)據(jù)庫文檔及詳細(xì)具體的項(xiàng)目開發(fā)文檔慧域。這個(gè)項(xiàng)目開發(fā)文檔,可以是一份浪读,也可以拆分成多份昔榴。里面有開發(fā)背景、需求分析瑟啃、業(yè)務(wù)流程论泛、技術(shù)難點(diǎn)、架構(gòu)蛹屿、程序編寫方式屁奏、人員安排、時(shí)間規(guī)劃等等的詳細(xì)介紹错负。當(dāng)這些文檔出來之后坟瓢,我們的設(shè)計(jì)也就已經(jīng)明確下來。
五 項(xiàng)目開發(fā)
項(xiàng)目開發(fā)環(huán)節(jié)所觸碰的都是些具體的技術(shù)細(xì)節(jié)犹撒。在過去的項(xiàng)目中折联,開發(fā)環(huán)節(jié)所用到的時(shí)間要遠(yuǎn)大于前面提到的六分之一的比例,是最費(fèi)心的识颊。也正因此诚镰,才覺得自己過去項(xiàng)目開發(fā)前的設(shè)計(jì)工作做的很不完善,因?yàn)樵谠O(shè)計(jì)理想的情況下祥款,軟件開發(fā)工作只不過是一些重復(fù)性的體力勞動(dòng)清笨,根本無需再耗費(fèi)心力。
理想情況終歸是理想情況刃跛,真實(shí)的情況是抠艾,自己接手的很多項(xiàng)目從架構(gòu)、程序到頁面桨昙、樣式检号、腳本腌歉,甚至是前端設(shè)計(jì)工作,都由一個(gè)人獨(dú)自完成齐苛。一方面翘盖,公司未必有足夠的人力安排到你所在的項(xiàng)目;另一方面脸狸,即便人手足夠最仑,也未必能將合適的人擰合在一起去組建成一個(gè)團(tuán)隊(duì)。這又涉及到公司部門管理的問題炊甲。而一個(gè)人又很難掌握開發(fā)一個(gè)完整項(xiàng)目所需的、各部分的諸多技術(shù)細(xì)節(jié)欲芹,擅長寫后臺程序的人未必擅長寫樣式卿啡,擅長寫樣式的人未必擅長寫腳本,擅長樣式和腳本的人卻又未必擅長做UI設(shè)計(jì)菱父,雖然你可能都會(huì)颈娜,卻很難做到都擅長,這是人的局限性——我一直在試圖突破的局限性浙宜。
于是官辽,在這種更多的、非理想的情況下粟瞬,在一個(gè)人有局限性的情況下同仆,我在做需求分析設(shè)計(jì)時(shí)是不可能事無巨細(xì)的。以自己當(dāng)前的水平裙品,設(shè)計(jì)過程并不能滲透到所有的細(xì)節(jié)中俗批。虛擬的工廠畢竟不是真實(shí)的工廠,哪怕自己對所有的技術(shù)都很精通市怎,怕也很難在前期設(shè)計(jì)階段虛擬出一個(gè)和最終真實(shí)工廠一樣的模型岁忘。項(xiàng)目設(shè)計(jì)者之間設(shè)計(jì)水平的差距就體現(xiàn)在這個(gè)構(gòu)建虛擬模型的過程中,誰的設(shè)計(jì)模型虛擬的更真實(shí)区匠、更具體干像、更合理誰就更勝一籌。優(yōu)秀的設(shè)計(jì)者虛擬出的設(shè)計(jì)模型肯定和最終開發(fā)出的真實(shí)項(xiàng)目相差不大才對驰弄,因?yàn)樵诤侠砬闆r下麻汰,項(xiàng)目的物理實(shí)現(xiàn)(Realization)都能依照它的設(shè)計(jì)實(shí)現(xiàn)(Implementation)有條不紊的推進(jìn)。
因上所述揩懒,項(xiàng)目設(shè)計(jì)者更應(yīng)當(dāng)在平時(shí)扎扎實(shí)實(shí)的提高自己各方面的基本功什乙,以盡可能的完善前期設(shè)計(jì)。而為了應(yīng)付非理想情況下的前期設(shè)計(jì)已球,項(xiàng)目開發(fā)者要注意的問題也有很多臣镣,就過去的經(jīng)驗(yàn)辅愿,項(xiàng)目開發(fā)過程中要關(guān)注的主要有下面幾項(xiàng):
第一個(gè)要注意的問題是頁面、樣式忆某、腳本点待、程序的編寫細(xì)節(jié)。我們在完成設(shè)計(jì)后動(dòng)手開發(fā)弃舒,第一件要做的事情是將UI設(shè)計(jì)師出的效果圖轉(zhuǎn)換成HTML頁面癞埠,也就是美工常說的切頁。那頁面是什么格式的聋呢,HTML苗踪、ASPX、JSP還是PHP削锰?美工和負(fù)責(zé)前端腳本的開發(fā)人員通铲、負(fù)責(zé)后臺程序的程序員之間應(yīng)該先達(dá)成一種共識,其實(shí)在項(xiàng)目設(shè)計(jì)階段器贩,這里應(yīng)該是先規(guī)劃好的:頁面颅夺、腳本、后臺程序間通過什么樣的方式交互蛹稍?雖然前臺腳本和后臺程序完全是兩碼事吧黄,在細(xì)節(jié)上差異巨大,但編寫腳本和編寫程序要追求的目標(biāo)是相似的——腳本和程序的架構(gòu)設(shè)計(jì)都應(yīng)該盡可能的低重復(fù)唆姐、高擴(kuò)展拗慨、易用易調(diào)取、安全厦酬,甚至是樣式和頁面的設(shè)計(jì)也應(yīng)該追求類似的目標(biāo)胆描,比如頁面、樣式仗阅、腳本昌讲、程序都要求低重復(fù)性。如何保證高內(nèi)聚减噪、低耦合定律短绸?如何在程序中抓捕所有的異常、不讓任何一個(gè)異常被暴露筹裕?等等這些問題醋闭,在設(shè)計(jì)架構(gòu)時(shí)就應(yīng)該考慮到。自己過去的筆記中有關(guān)于架構(gòu)的問題列表朝卒,應(yīng)該做些整理证逻,力求不再讓這些問題出現(xiàn)在開發(fā)環(huán)節(jié)。不敢對樣式和腳本的技術(shù)細(xì)節(jié)枉談抗斤,但具體到后臺程序的編寫囚企,思路可以參考《重構(gòu)丈咐,改善既有代碼設(shè)計(jì)》這本書,里面有很多代碼重構(gòu)的技巧龙宏、實(shí)例值得學(xué)習(xí)借鑒棵逊。在開發(fā)環(huán)節(jié),前端和后臺程序的編寫是可以并行的银酗。有些環(huán)節(jié)必須單步順序執(zhí)行辆影,比如只有效果圖出來后才能出切頁,但大部分環(huán)節(jié)是可并行的黍特。在不同的開發(fā)階段團(tuán)隊(duì)人員的工作量也是不一樣的蛙讥,熟悉之后,可以更輕松的對團(tuán)隊(duì)中的人力資源進(jìn)行調(diào)配衅澈。
第二個(gè)要注意的問題是代碼生成器等工具的使用键菱。要?jiǎng)?chuàng)造軟件生產(chǎn)流水線,主要依賴的工具就是代碼生成器今布。學(xué)會(huì)使用CodeSmith之后,代碼編寫的效率有了很大的提高拭抬。CodeSmith就像是軟件工程中的機(jī)器人部默,其存在的目的就是為了消滅重復(fù)工作、消除體力勞動(dòng)造虎,讓人專心于創(chuàng)造工作傅蹂。像數(shù)據(jù)庫設(shè)計(jì)工具PowerDesigner、代碼審查工具StyleCop算凿、程序幫助文檔生成工具SandCastle等等都是類似的目的份蝴,學(xué)會(huì)使用這些工具,可以讓自己的工作事半功倍氓轰。不過“有機(jī)械者必有機(jī)事婚夫,有機(jī)事者必有機(jī)心”,想要熟練的應(yīng)用這些工具也是要費(fèi)時(shí)間和心思的署鸡,而且工具并非萬能的案糙。比如CodeSmith,過去一直試圖用其生成盡可能多的代碼靴庆,但卻總有些部分需要手動(dòng)去改时捌,這樣整個(gè)項(xiàng)目的編碼就會(huì)分成三部分:一部分是純手工編寫的,比如工具類庫炉抒;一部分是混合的奢讨,既有生成的也手動(dòng)更改的;一部分是純工具生成的焰薄,比如數(shù)據(jù)庫訪問層拿诸。常用的工具類到是可以統(tǒng)一做下整理到工具類庫扒袖,也不麻煩,但需要手工改動(dòng)的其它部分還是要耗人力的佳镜。希望可以將這部分需要手工改動(dòng)代碼降到最低僚稿,讓絕大部分代碼可以由工具自動(dòng)生成求泰、自動(dòng)修改名挥。盡管便捷工具的問題有很多,但整體來講读跷,還是有不少好工具值得人花些時(shí)間去學(xué)習(xí)使用啊掏。
第三個(gè)要注意的問題是開發(fā)進(jìn)度跟蹤蠢络。在項(xiàng)目設(shè)計(jì)階段,應(yīng)該有比較明確的進(jìn)度表才對迟蜜,即便沒有很明確的文檔刹孔、沒有用Project,項(xiàng)目經(jīng)理心里也應(yīng)該對時(shí)間有數(shù)娜睛,在某個(gè)時(shí)間點(diǎn)某個(gè)功能必須完成髓霞、在某個(gè)時(shí)間點(diǎn)必須出來可演示的版本、在某個(gè)時(shí)間點(diǎn)必須可以上線試運(yùn)行畦戒、在某個(gè)時(shí)間點(diǎn)所有的項(xiàng)目開發(fā)工作必須完成方库。還是那句話,拋開時(shí)間來講工作毫無意義障斋。為了跟蹤項(xiàng)目開發(fā)進(jìn)度纵潦,確保項(xiàng)目的每個(gè)階段性目標(biāo)可以按時(shí)完成,定期的團(tuán)隊(duì)會(huì)議是不可或缺的垃环。通過會(huì)議間的溝通協(xié)調(diào)邀层,找出時(shí)間延后或提前的原因,以部署下一階段的開發(fā)任務(wù)遂庄。當(dāng)每個(gè)階段性目標(biāo)都可以準(zhǔn)時(shí)完成時(shí)寥院,整個(gè)項(xiàng)目的開發(fā)定然也能按時(shí)完成。
第四個(gè)要注意的問題是人與人間的溝通涧团、協(xié)作只磷。中小型的項(xiàng)目,一個(gè)人可以勉強(qiáng)應(yīng)付的泌绣,我決不會(huì)希望去安排兩個(gè)人钮追。一個(gè)人面臨再多的問題也都是項(xiàng)目的問題,多一個(gè)人性質(zhì)就完全變了阿迈,溝通協(xié)調(diào)元媚、意見統(tǒng)一、互相游說爭辯,耗費(fèi)的無用的時(shí)間可是要倍增的刊棕。但是炭晒,你總不可能所有的項(xiàng)目都獨(dú)自開發(fā),更多的情況下甥角,還是要跟人合作的——人或多或少网严。良好溝通協(xié)作的前提是團(tuán)隊(duì)中所有的成員必須在出現(xiàn)不同意見時(shí)保持心平氣和,團(tuán)隊(duì)人員和客戶之間互相角逐嗤无,團(tuán)隊(duì)人員之間互相角逐震束,團(tuán)隊(duì)人員和團(tuán)隊(duì)領(lǐng)導(dǎo)者之間互相角逐,團(tuán)隊(duì)領(lǐng)導(dǎo)者和公司各部門当犯、和公司領(lǐng)導(dǎo)之間也在互相角逐垢村,費(fèi)心費(fèi)口舌!為了保證溝通渠道的暢通嚎卫,定期的會(huì)議是必須的嘉栓,團(tuán)隊(duì)也應(yīng)該定期向領(lǐng)導(dǎo)作匯報(bào),并時(shí)刻和用戶保持溝通拓诸,時(shí)刻了解用戶的想法侵佃、糾正可能的錯(cuò)誤。一直到現(xiàn)在奠支,都不敢說用戶的需求已經(jīng)全部確定了下來趣钱!
第五個(gè)要注意的問題是開發(fā)過程中的沼澤地。在開發(fā)過程中(設(shè)計(jì)階段也有)經(jīng)常會(huì)碰到突然毫無頭緒的情況胚宦,有早期的設(shè)計(jì)也不管用,就是不知道如何走下去了燕垃。還有可能突然發(fā)現(xiàn)枢劝,后期一些功能的實(shí)現(xiàn)把整個(gè)程序結(jié)構(gòu)全給打亂了,雖然跌跌撞撞完成了要實(shí)現(xiàn)的功能卜壕,卻覺得程序超脫了自己掌控您旁。再有就是開發(fā)遇到致命問題,如陷入泥沼一樣轴捎,項(xiàng)目到了進(jìn)退不得的地步鹤盒。靈感喪失的狀況經(jīng)常出現(xiàn),對著屏幕大腦卻一片空白侦副,這時(shí)通常會(huì)躲到空空的樓道閣間中來會(huì)踱步侦锯,才會(huì)理出些思緒。還有秦驯,自己開發(fā)的每個(gè)項(xiàng)目幾乎都有相應(yīng)的筆記尺碰,不停的寫不停的分析,這些筆記一方面用于計(jì)劃、安排亲桥、總結(jié)自己當(dāng)前的工作洛心,一方面幫助自己清理思路找到工作靈感。還是比較偏向于在靈感缺失時(shí)到外面去走走換個(gè)思路的辦法题篷,再就是平時(shí)應(yīng)該多讀些技術(shù)類的書词身、多關(guān)注網(wǎng)上的實(shí)際案例、多參與高難度項(xiàng)目的開發(fā)番枚,讓自己擁有源源不斷的源頭活水法严,如此,思維將永不枯竭户辫。遇到程序結(jié)構(gòu)被打亂的情況也無需擔(dān)心渐夸,只要不影響大局,后面可以專門抽出時(shí)間來對相應(yīng)的代碼進(jìn)行重構(gòu)渔欢、整修墓塌。開發(fā)過程中沼澤地的出現(xiàn)大都還是因?yàn)樵缙谠O(shè)計(jì)考慮的不完整,如果早期對架構(gòu)設(shè)計(jì)的足夠靈活奥额,增刪功能都應(yīng)比較自如才是苫幢,項(xiàng)目是不太可能出現(xiàn)致命問題的。應(yīng)該在設(shè)計(jì)之時(shí)考慮到相應(yīng)的回改機(jī)制垫挨,如果在開發(fā)過程中出現(xiàn)了一些不可測的問題韩肝,數(shù)據(jù)庫、架構(gòu)九榔、程序能否方便靈活的做出相應(yīng)調(diào)整哀峻?
第六個(gè)要注意的問題是程序文檔的整理。規(guī)模較大的哲泊、比較正規(guī)的項(xiàng)目剩蟀,程序文檔不可或缺。程序文檔在中小型項(xiàng)目中的作用并不大切威,因?yàn)閳F(tuán)隊(duì)間的協(xié)作開發(fā)完全可以通過直接查看源程序及程序注釋來降低互相對接時(shí)出現(xiàn)的麻煩育特。Java中有javadoc命令,用于生成自己API文檔的先朦,.NET平臺下有工具SandCastle缰冤。用工具生成就很簡單了,所以不論具體作用有多少喳魏,最好出一份程序文檔棉浸,哪怕僅僅是為了做做表面工作、提供給項(xiàng)目驗(yàn)收者查看截酷。這里著重要說的是接口文檔涮拗,如果按自己設(shè)想的架構(gòu)乾戏,前端和后臺程序間通過ajax調(diào)用WebServcie接口進(jìn)行交互,那這個(gè)接口文檔是必須的三热。而且鼓择,打算在新架構(gòu)中將這些交互接口做成通用的,不僅提供給自己的項(xiàng)目前端使用就漾,還可以將其開放給外部平臺呐能,如此,接口文檔更是不可或缺抑堡。最好有個(gè)測試用的接口平臺摆出,比如在XX醫(yī)院時(shí)見到的那種,可以方便的在平臺上對接口進(jìn)行測試首妖,這對外部接口調(diào)用者來說是非常方便的偎漫。只是不知道,他們用的什么技術(shù)做成的那個(gè)平臺有缆。
上面提到的幾點(diǎn)有些在前面章節(jié)已經(jīng)做過介紹象踊,比如時(shí)間規(guī)劃、進(jìn)度控制棚壁、人員協(xié)作等杯矩,這些工作本應(yīng)在開發(fā)之前就已經(jīng)規(guī)劃好。但是袖外,正如上面所述史隆,很多情況下,需求分析曼验、設(shè)計(jì)并不能做到理想中的完整泌射、詳細(xì)、具體鬓照,所以開發(fā)階段還是要關(guān)注很多細(xì)節(jié)魄幕。開發(fā)前的分析設(shè)計(jì)對項(xiàng)目實(shí)際的開發(fā)工作有著決定性的影響,應(yīng)勞記這一點(diǎn)颖杏,務(wù)必在真正動(dòng)手開發(fā)前做好充分的準(zhǔn)備。設(shè)計(jì)是思坛芽,開發(fā)是行留储,務(wù)必要三思而后行。如果問題都到開發(fā)階段才被暴露出來咙轩,有些就會(huì)非常麻煩了获讳。
六 項(xiàng)目測試
從接觸技術(shù)至今,從未系統(tǒng)學(xué)習(xí)整理過軟件測試相關(guān)的理論知識活喊,也從未讀過一本和項(xiàng)目測試相關(guān)的書籍丐膝。我的技術(shù)經(jīng)驗(yàn)、思路大都來自于實(shí)實(shí)在在的開發(fā)實(shí)踐,而在自己所接觸過的項(xiàng)目中帅矗,測試又都是非常簡略的一環(huán)偎肃,沒有理論中的那般重要。為什么說“理論中的那般重要”浑此,是因?yàn)樵谒私獾降捻?xiàng)目開發(fā)理論中累颂,幾乎所有人都在講測試環(huán)節(jié)是最重要的一部分,也是最耗時(shí)凛俱、最需要耐心的紊馏。
為了整理這一章節(jié)的內(nèi)容,從網(wǎng)絡(luò)上搜索了一些軟件測試相關(guān)的文章蒲犬,卻并未看出多少端倪朱监,不過,軟件測試工程里幾個(gè)重要的概念已經(jīng)弄明白原叮。下面先把這幾個(gè)重要概念的介紹摘錄到這里赫编,這部分大都采摘于這個(gè)網(wǎng)址:黑盒測試、白盒測試篇裁、單元測試沛慢、集成測試、系統(tǒng)測試达布、驗(yàn)收測試的區(qū)別與聯(lián)系团甲。后面,會(huì)再介紹一下自己在實(shí)際開發(fā)中遇到的一些測試相關(guān)問題黍聂,并整理下自己的所思躺苦、所悟。
軟件測試從測試方式上分為黑盒測試和白盒測試产还,從測試范圍上可分為單元測試匹厘、集成測試、系統(tǒng)測試脐区、驗(yàn)收測試 愈诚。黑盒測試、白盒測試牛隅、單元測試是開發(fā)人員分在不同的開發(fā)階段要做的事情炕柔;黑盒測試、集成測試媒佣、系統(tǒng)測試是測試人員在測試周期內(nèi)級層做的工作匕累;驗(yàn)收測試一般是在用戶方做的工作。
黑盒測試:不考慮程序內(nèi)部結(jié)構(gòu)和邏輯結(jié)構(gòu)默伍,主要是用來測試系統(tǒng)的功能是否滿足需求規(guī)格說明書欢嘿。 一般會(huì)有一個(gè)輸入值衰琐,一個(gè)輸出值,和期望值做比較炼蹦。黑盒測試也稱功能測試羡宙,它是通過測試來檢測每個(gè)功能是否都能正常使用。在測試中框弛,把程序看作一個(gè)不能打開的黑盒子辛辨,在完全不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性的情況下,在程序接口進(jìn)行測試瑟枫,它只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用斗搞,程序是否能適當(dāng)?shù)亟邮蛰斎霐?shù)據(jù)而產(chǎn)生正確的輸出信息。黑盒測試著眼于程序外部結(jié)構(gòu)慷妙,不考慮內(nèi)部邏輯結(jié)構(gòu)僻焚,主要針對軟件界面和軟件功能進(jìn)行測試。
白盒測試:主要應(yīng)用在單元測試階段膝擂,是對代碼級的測試虑啤,針對程序內(nèi)部邏輯構(gòu),測試手段有:語句覆蓋架馋、判定覆蓋狞山、條件覆蓋、路徑覆蓋叉寂、條件組合覆蓋萍启。白盒測試也稱結(jié)構(gòu)測試或邏輯驅(qū)動(dòng)測試,它是按照程序內(nèi)部的結(jié)構(gòu)測試程序屏鳍,通過測試來檢測產(chǎn)品內(nèi)部動(dòng)作是否按照設(shè)計(jì)規(guī)格說明書的規(guī)定正常進(jìn)行勘纯,檢驗(yàn)程序中的每條通路是否都能按預(yù)定要求正確工作。這一方法是把測試對象看作一個(gè)打開的盒子钓瞭,測試人員依據(jù)程序內(nèi)部邏輯結(jié)構(gòu)相關(guān)信息驳遵,設(shè)計(jì)或選擇測試用例,對程序所有邏輯路徑進(jìn)行測試山涡,通過在不同點(diǎn)檢查程序的狀態(tài)堤结,確定實(shí)際的狀態(tài)是否與預(yù)期的狀態(tài)一致。
單元測試(Unit Testing)鸭丛,是指對軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證霍殴。對于單元測試中單元的含義,一般來說系吩,要根據(jù)實(shí)際情況去判定其具體含義,如C語言中單元指一個(gè)函數(shù)妒蔚,Java里單元指一個(gè)類穿挨,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等月弛。總的來說科盛,單元就是人為規(guī)定的最小的被測功能模塊帽衙。單元測試是在軟件開發(fā)過程中要進(jìn)行的最低級別的測試活動(dòng),軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測試
集成測試:是在軟件系統(tǒng)集成過程中所進(jìn)行的測試贞绵,其主要目的是檢查軟件單位之間的接口是否正確厉萝。它根據(jù)集成測試計(jì)劃,一邊將模塊或其它軟件單位組合成越來越大的系統(tǒng)榨崩,一邊運(yùn)行該系統(tǒng)谴垫,以分析所組成的系統(tǒng)是否正確,各個(gè)組成部分是否合拍母蛛。集成測試的策略主要有自頂向下和自底向上兩種翩剪。也可以理解為在軟件設(shè)計(jì)單元、功能模塊組裝彩郊、集成為系統(tǒng)時(shí)前弯,對應(yīng)用系統(tǒng)的各個(gè)部件(軟件單元、功能模塊接口秫逝、鏈接等)進(jìn)行的聯(lián)合測試恕出,以決定它們能否在一起共同工作,部件可以是代碼塊违帆、獨(dú)立的應(yīng)用浙巫、網(wǎng)絡(luò)上的客戶端或服務(wù)器端程序。
系統(tǒng)測試:系統(tǒng)測試是基于軟件需求說明書的黑盒測試前方,是對已經(jīng)集成好的軟件系統(tǒng)進(jìn)行徹底的測試狈醉,以驗(yàn)證軟件系統(tǒng)的正確性和性能等滿足其規(guī)約所指定的要求,檢查軟件的行為和輸出是否正確惠险,并非一項(xiàng)簡單的任務(wù)苗傅,被稱為測試的“先知者問題”。因此班巩,系統(tǒng)測試應(yīng)該按照測試計(jì)劃進(jìn)行渣慕,其輸入、輸出和其他的動(dòng)態(tài)運(yùn)行行為應(yīng)該與軟件規(guī)約進(jìn)行對比抱慌。軟件系統(tǒng)測試的方法很多逊桦,主要有功能測試,性能測試抑进,隨機(jī)測試等强经。
在本章的開頭提到,一方面理論說測試環(huán)節(jié)非常重要寺渗,另一方面在實(shí)踐中卻并未覺得它如理論所說的那般重要匿情,這是矛盾的地方兰迫。并不是認(rèn)為理論說的有錯(cuò),只是自己目前用的是C#語言炬称,開發(fā)的大都是WEB項(xiàng)目汁果,主要是企業(yè)內(nèi)部應(yīng)用系統(tǒng),項(xiàng)目規(guī)模都不大玲躯,可能和這些原因有關(guān)系(尤其是最后一個(gè))据德,所以測試環(huán)節(jié)在自己的項(xiàng)目中并不特別的重要。
企業(yè)內(nèi)部應(yīng)用系統(tǒng)一般都部署在專網(wǎng)跷车、內(nèi)網(wǎng)中棘利,幾乎不用考慮安全問題。小規(guī)模的項(xiàng)目姓赤,用戶量很少赡译,并發(fā)的問題、性能的問題也很少遇到瓶頸不铆。如果項(xiàng)目不是被匆忙的開發(fā)上線蝌焚,那從自己手里交出的項(xiàng)目有5%以下的可能出現(xiàn)問題。在被公司的其它人員(工程人員或其它開發(fā)者)測試之后誓斥,有4%以下的可能出現(xiàn)問題只洒。這4%以下的問題要在上線試運(yùn)行或正式運(yùn)行之后才能被逐漸發(fā)現(xiàn),再慢慢修正劳坑。
5%不是個(gè)小的數(shù)值毕谴,這還是保守的說法。這個(gè)數(shù)值受制于軟件開發(fā)前期相關(guān)設(shè)計(jì)的合理性距芬、軟件工程所使用架構(gòu)的穩(wěn)定性涝开、軟件開發(fā)過程中的細(xì)心程度及在開發(fā)過程中使用的測試技巧,等框仔。過去一直致力于在測試環(huán)節(jié)之外的設(shè)計(jì)舀武、開發(fā)階段將可能的BUG消滅掉,一直認(rèn)為如果設(shè)計(jì)足夠嚴(yán)密离斩、開發(fā)足夠謹(jǐn)慎银舱,那出現(xiàn)BUG的機(jī)率自然會(huì)減少。從來不相信公司內(nèi)部的測試流程跛梗,當(dāng)然寻馏,也沒有阻止過公司組織人員對軟件進(jìn)行測試。很清楚的知道核偿,這幫家伙只能測試些表層問題诚欠,根本刺探不到根本。一直堅(jiān)信,最好的測試人員就是產(chǎn)品的用戶轰绵,所有的問題都會(huì)在實(shí)用中被暴露家乘,但是,當(dāng)軟件的BUG暴露到了用戶那里藏澳,這個(gè)軟件產(chǎn)品還有沒有資格被稱為好的產(chǎn)品?
中小型的WEB項(xiàng)目,就自己的經(jīng)驗(yàn),在開發(fā)成型之后的測試侥啤、使用過程中主要會(huì)出現(xiàn)四類BUG:
第一類是比較明顯的錯(cuò)誤蝇率。比如出現(xiàn)錯(cuò)別字,樣式問題導(dǎo)致的頁面顯示混亂或?qū)νㄓ脼g覽器不兼容峡扩,表單字段合理性驗(yàn)證問題導(dǎo)致程序異常,頁面之間的跳轉(zhuǎn)出錯(cuò),操作過程拋出程序異常(Exception)撮抓,等。
第二類是不容易發(fā)現(xiàn)的錯(cuò)誤摇锋。比如多用戶同時(shí)操作導(dǎo)致的并發(fā)問題丹拯,程序編寫規(guī)則有誤導(dǎo)致的數(shù)據(jù)準(zhǔn)確性問題,業(yè)務(wù)處理過程中出現(xiàn)明顯過失問題荸恕,如給予某個(gè)角色不應(yīng)有的權(quán)限乖酬,等。
第三類是在稍具規(guī)模的項(xiàng)目中常會(huì)出現(xiàn)的錯(cuò)誤融求。比如由腳本咬像、樣式、程序?qū)е碌木W(wǎng)絡(luò)延遲生宛,腳本县昂、程序執(zhí)行效率導(dǎo)致的響應(yīng)速度過慢,數(shù)據(jù)量過大導(dǎo)致的數(shù)據(jù)庫查詢速度過慢陷舅,等等倒彰,大都是和性能相關(guān)的問題。
第四類是新版本發(fā)布導(dǎo)致的問題蔑赘。比如配置文件被不小心覆蓋狸驳、替換或內(nèi)容被手動(dòng)更改,WEB項(xiàng)目中的附屬安裝程序包在發(fā)布新版本時(shí)不小心被不同版本替換缩赛,根據(jù)用戶要求對功能進(jìn)行修改之后出現(xiàn)新的BUG耙箍,等。
上面并未提到可能的安全性問題酥馍,這方面不是我觸及的項(xiàng)目所考慮的問題辩昆。在列舉的這四類BUG中,第一類最為常見旨袒,這部分一旦發(fā)現(xiàn)汁针,改起來相對容易术辐,不會(huì)導(dǎo)致大的問題。第二類最為致命施无,不常見也不易被測試發(fā)現(xiàn)辉词,如若在產(chǎn)品發(fā)布使用之后才被發(fā)現(xiàn),很可能已經(jīng)釀成禍端猾骡,數(shù)據(jù)的準(zhǔn)確性或許已被破壞瑞躺。第三類在小規(guī)模項(xiàng)目中不多見,即便出現(xiàn)較大數(shù)據(jù)的表兴想,也大都在可控范圍內(nèi)幢哨。第四類是讓我最頭疼的,頻繁的又相對簡單的修改要求在項(xiàng)目發(fā)布之初是很常見的嫂便,而又很難針對每次的修改都進(jìn)行全面測試捞镰,可每個(gè)簡單字段的增刪改都有可能導(dǎo)致出現(xiàn)新的BUG,所以常會(huì)有不可測問題出現(xiàn)毙替。
再來看下發(fā)現(xiàn)項(xiàng)目BUG的人員岸售,第一類是項(xiàng)目開發(fā)者,在開發(fā)過程中發(fā)現(xiàn)并修正蔚龙。第二類是非專業(yè)測試人員冰评,比如項(xiàng)目正式發(fā)布前對項(xiàng)目進(jìn)行測試的工程人員、其它項(xiàng)目的開發(fā)者等木羹。第三類是專業(yè)測試人員甲雅,掌握系統(tǒng)性測試?yán)碚摵蛯?shí)用測試技巧的專業(yè)測試者。第四類是項(xiàng)目最終的使用者坑填,在使用項(xiàng)目的過程中發(fā)現(xiàn)并反饋新的BUG抛人。
寄希望于專業(yè)測試人員對中小型項(xiàng)目進(jìn)行系統(tǒng)化測試是不現(xiàn)實(shí)的,一來大部分小規(guī)模的軟件團(tuán)隊(duì)都沒有專門負(fù)責(zé)測試的成員脐瑰,二來即便有測試人員妖枚,也根本談不上專業(yè)。軟件測試的目的就是在其被正式使用前消除盡可能多的BUG苍在,所以到第四類人(項(xiàng)目最終使用者)那里再發(fā)現(xiàn)問題绝页,就已經(jīng)晚了。對于第二類人(非專業(yè)測試人員)又信不過寂恬,他們只能發(fā)現(xiàn)些表層問題续誉,卻很難測出與業(yè)務(wù)相關(guān)的深層次BUG。在這種情況下初肉,只能要求項(xiàng)目經(jīng)理酷鸦、開發(fā)人員在設(shè)計(jì)、開發(fā)階段做更多的工作。白盒測試臼隔、單元測試嘹裂、集成測試,都是很耗時(shí)的細(xì)節(jié)測試方式摔握,如果在設(shè)計(jì)開發(fā)階段做的足夠好寄狼,可將這幾種測試方式忽略掉,而專注于黑盒測試氨淌、系統(tǒng)測試例嘱、驗(yàn)收測試。只要機(jī)器可以正常運(yùn)作宁舰,不要問機(jī)器內(nèi)部是如何運(yùn)作的——盡管這種處理方式或許不適合大型的軟件項(xiàng)目。
在項(xiàng)目設(shè)計(jì)階段盡可能的把數(shù)據(jù)庫奢浑、架構(gòu)蛮艰、框架設(shè)計(jì)的足夠靈活、穩(wěn)定雀彼,在開發(fā)階段盡可能的用代碼生成器來完成程序的編寫壤蚜,這樣可以從根源上杜絕很多BUG。對自己寫的程序還是比較自信的徊哑,不是說不會(huì)出問題袜刷,而是說一旦出了問題能很清楚的知道問題出在哪里,可以在第一時(shí)間完成修復(fù)莺丑,這就是得益于自己對架構(gòu)著蟹、程序的把握。開發(fā)階段梢莽,每次完成一個(gè)獨(dú)立的功能模塊萧豆,都應(yīng)對這個(gè)獨(dú)立模塊進(jìn)行黑盒測試。相互之間有業(yè)務(wù)聯(lián)系的模塊昏名,對其中某個(gè)單獨(dú)模塊進(jìn)行改動(dòng)后涮雷,都應(yīng)對整個(gè)業(yè)務(wù)做完整的黑盒測試。開發(fā)者在開發(fā)階段對項(xiàng)目的測試是頻繁的轻局、模塊化的洪鸭、間歇性的、迭代的仑扑。如果做到這些览爵,項(xiàng)目從開發(fā)者手里交付后,再出現(xiàn)明顯BUG的機(jī)率就會(huì)很小了夫壁。
項(xiàng)目從開發(fā)者手里交付后拾枣,應(yīng)該部署到盡可能貼盡實(shí)際運(yùn)行環(huán)境的服務(wù)器中,然后由公司組織人員進(jìn)行測試。應(yīng)該征集盡量多的人對項(xiàng)目進(jìn)行深入測試梅肤,每個(gè)人把測試出的問題按要求整理成統(tǒng)一格式的測試文檔司蔬,交付給項(xiàng)目負(fù)責(zé)人處理。項(xiàng)目負(fù)責(zé)人把這些問題歸類后姨蝴,逐個(gè)解決俊啼,并將處理后的結(jié)果反饋到測試文檔中,之后開始進(jìn)行第二輪測試左医。如果第二輪測試出的一些問題并非是由于第一輪測試之后對項(xiàng)目進(jìn)行的修改導(dǎo)致授帕,那說明這些問題是在第一輪測試時(shí)就該被發(fā)現(xiàn)卻沒有被發(fā)現(xiàn)的,這就是測試者的失誤浮梢。在過去的測試中跛十,經(jīng)常遇到這樣的情況,重復(fù)測試發(fā)現(xiàn)的問題并非新問題秕硝,而是因?yàn)闇y試不嚴(yán)謹(jǐn)導(dǎo)致的本來在最初時(shí)該發(fā)現(xiàn)卻沒有被發(fā)現(xiàn)的問題芥映。覺得有必要讓測試者明白這個(gè)道理,讓每一次的測試盡可能的仔細(xì)远豺。
對于測試出的問題奈偏,通常會(huì)有兩類。一類是明顯的錯(cuò)誤躯护,這個(gè)無可厚非惊来,直接改正過來就是了。還有一類“似是而非”的棺滞,是測試者的主觀意見裁蚁,比如他覺得這個(gè)地方字體太小了、他覺得這個(gè)地方這樣操作不合理等等继准。前面就說過厘擂,對項(xiàng)目的最終展現(xiàn)有決定權(quán)的只能有兩個(gè)人,一個(gè)是客戶锰瘸,一個(gè)是項(xiàng)目經(jīng)理刽严。測試人員反饋的這種似是而非的問題項(xiàng)目經(jīng)理可以留意,但最終是改還是不改避凝,并不由測試人員來決定舞萄,這一點(diǎn)應(yīng)該明確給所有人。
項(xiàng)目被公司組織人員測試之后管削,正式部署到客戶要求的服務(wù)器中倒脓。正式部署之后應(yīng)該先試運(yùn)行一段時(shí)間,沒有大的問題含思,才能被正式使用崎弃。試運(yùn)行階段及正式運(yùn)行初期甘晤,客戶很可能會(huì)反饋不少新問題,有些是明顯的錯(cuò)誤饲做。不過线婚,如果前期測試嚴(yán)密的話,這時(shí)更多反饋的應(yīng)該是修改意見盆均,比如增刪改些字段塞弊,變換下操作方式,等等類似于公司測試人員的“似是而非”的問題泪姨。對于這些“似是而非”的修改要求游沿,項(xiàng)目經(jīng)理應(yīng)根據(jù)實(shí)際情況和客戶之間商討決定。每次更改之后肮砾、發(fā)布新版本之前诀黍,應(yīng)該把更改過的相關(guān)業(yè)務(wù)從頭到尾再測一遍,這的確比較耗時(shí)仗处,尤其是客戶頻繁更改的情況蔗草。為了減少頻繁的更改發(fā)布,應(yīng)該想辦法讓客戶盡可能的一次提出所有的更改要求——當(dāng)然這不容易疆柔,不要今天提一點(diǎn),明天想到了再提一點(diǎn)镶柱,頻繁的更改發(fā)布會(huì)另出現(xiàn)新問題的概率大大增加旷档。
正式部署之后的修改再發(fā)布就是版本更新了,發(fā)布時(shí)應(yīng)該先檢驗(yàn)新版本中配置文件的變化歇拆,有沒有增加鞋屈、修改或刪除的內(nèi)容,如果沒有則不發(fā)布配置文件故觅,如果有則和當(dāng)前運(yùn)行版本中的配置文件進(jìn)行校對厂庇、整合。如果當(dāng)前版本有要下載的程序包输吏,注意要發(fā)布項(xiàng)目的程序包的版本和當(dāng)前運(yùn)行項(xiàng)目的程序包的版本的異同权旷。還有,上傳的文件應(yīng)該存放在獨(dú)立于項(xiàng)目之外的虛擬目錄中贯溅,即能防止發(fā)布時(shí)不小心被覆蓋或修改拄氯,又方便后期的文件備份。發(fā)布項(xiàng)目時(shí)要注意的問題應(yīng)該整理成文檔它浅,發(fā)布操作嚴(yán)格依照文檔說明進(jìn)行译柏,可有效避免發(fā)布導(dǎo)致的不必要問題。
本章節(jié)講得并不是具體的測試技巧姐霍,甚至有好多和測試無關(guān)的內(nèi)容鄙麦,但目的都是一個(gè)——在項(xiàng)目正式運(yùn)行之前將可能的BUG數(shù)量降到最底典唇。這并非正規(guī)的測試方法,只是自己的經(jīng)驗(yàn)胯府,如果有可能在大型項(xiàng)目中做開發(fā)工作介衔,到是很有興趣了解下正規(guī)的測試如何進(jìn)行。
七 運(yùn)行維護(hù)
運(yùn)行維護(hù)本來是兩部分盟劫,但因?yàn)橐v的內(nèi)容不多夜牡,所以這里將二者合在一起。
項(xiàng)目經(jīng)過公司內(nèi)部的循環(huán)測試之后正式發(fā)布侣签,通常情況下塘装,客戶會(huì)提供給專門的服務(wù)器供我們部署。有的是現(xiàn)成的服務(wù)器影所,已經(jīng)安裝好系統(tǒng)蹦肴,有的則是空服務(wù)器,這時(shí)往往是工程實(shí)施人員負(fù)責(zé)系統(tǒng)的安裝猴娩。工程實(shí)施人員有時(shí)也會(huì)安裝好要用的數(shù)據(jù)庫阴幌,不過也有時(shí)候由開發(fā)人員自己安裝。操作系統(tǒng)卷中、數(shù)據(jù)庫安裝之后的工作大都由開發(fā)者自己來做了矛双,比如特定版本的.NETFramework的安裝、Oracle數(shù)據(jù)庫客戶端和操作工具的安裝蟆豫、IIS和FTP的部署等等议忽。
其實(shí)工程實(shí)施人員能做的工作很少,大部分運(yùn)行維護(hù)相關(guān)的工作還是要由開發(fā)者自己親自動(dòng)手十减,自己開發(fā)的項(xiàng)目當(dāng)然自己最清楚栈幸。發(fā)布項(xiàng)目到服務(wù)器時(shí),很少碰到一次性順利部署成功的情況帮辟,總會(huì)出現(xiàn)各種各樣的小問題速址,有時(shí)是系統(tǒng)、數(shù)據(jù)庫的問題由驹,有時(shí)是IIS的問題芍锚。應(yīng)該跟工程人員事先交待好,務(wù)必按要求安裝合適版本的系統(tǒng)和數(shù)據(jù)庫蔓榄,且必須是純凈版的闹炉,這可以減少很多不必要的麻煩。遇到多個(gè)項(xiàng)目部署在同一服務(wù)器中的情況润樱,注意可能產(chǎn)生沖突的部署渣触、可能產(chǎn)生沖突的軟件,比如曾經(jīng)在部署FTP服務(wù)器時(shí)怎么配置也不成功壹若,后來才發(fā)現(xiàn)是因?yàn)楹屯虏渴鸬摹癋ileZilla Server”沖突嗅钻。數(shù)據(jù)庫和項(xiàng)目在相同服務(wù)器中和在不同的服務(wù)器中皂冰,也可能會(huì)出現(xiàn)不同的問題,尤其像Oracle這種大型數(shù)據(jù)庫养篓,客戶端版本不同秃流、配置不同都會(huì)出現(xiàn)很多惱人的問題,應(yīng)該注意柳弄。
出現(xiàn)問題時(shí)也不要心急舶胀,如果在自己開發(fā)用的機(jī)器上、在公司的測試服務(wù)器上都能成功運(yùn)行碧注,而在正式服務(wù)器上卻出現(xiàn)問題嚣伐,大都還是因?yàn)檫\(yùn)行環(huán)境而致。有可能是數(shù)據(jù)庫或IIS配置有問題萍丐、也有可能是操作系統(tǒng)中有關(guān)鍵性文件缺失轩端,比如過去就遇到系統(tǒng)中缺失msvcr100.dll文件的情況,最后將文件打包到項(xiàng)目的BIN目錄才算解決逝变。遇到問題先要明確問題基茵、明確問題出現(xiàn)的原因,之后再尋求解決問題的辦法壳影,不要盲目的胡亂配置測試拱层。
一旦項(xiàng)目在正式服務(wù)器上正式部署,則通知客戶方的負(fù)責(zé)人宴咧,開始試運(yùn)行根灯。試運(yùn)行階段是必須的,即便經(jīng)過非常嚴(yán)謹(jǐn)?shù)臏y試悠汽,也不能保證項(xiàng)目絕對不會(huì)再出現(xiàn)錯(cuò)誤,試運(yùn)行也是為了進(jìn)一步保證正式運(yùn)行的穩(wěn)定芥驳。再者柿冲,試運(yùn)行階段不僅僅是為了發(fā)現(xiàn)可能的新BUG,更多的是為了解系統(tǒng)用戶對當(dāng)前系統(tǒng)的意見兆旬。其實(shí)很不喜歡客戶在系統(tǒng)運(yùn)行之后沒完沒了的提出修改要求假抄,尤其是系統(tǒng)的功能、界面在設(shè)計(jì)之處早就已經(jīng)詳細(xì)確認(rèn)好了的情況丽猬,如今剛做完卻又要變更宿饱。不過,即便如此脚祟,還是應(yīng)該聽一下意見谬以,特別是比較大、比較重要的項(xiàng)目由桌,甲乙雙方都有責(zé)任讓這個(gè)項(xiàng)目變得更好为黎。
在項(xiàng)目試運(yùn)行之前邮丰,必須有一份系統(tǒng)幫助文檔,以供工程實(shí)施人員及系統(tǒng)用戶查看铭乾。文檔可以由開發(fā)者自己編寫剪廉,也可以由負(fù)責(zé)系統(tǒng)測試或?qū)嵤┑娜藛T編寫。用Word編寫后保存成網(wǎng)頁格式炕檩,掛載到系統(tǒng)比較明顯的位置斗蒋,并提供源Word格式的下載鏈接。還應(yīng)該注意一下操作文檔的更新笛质,當(dāng)系統(tǒng)功能有修改變化時(shí)泉沾,幫助文檔也應(yīng)做出相應(yīng)的變更。
系統(tǒng)試運(yùn)行之后经瓷,開始正式運(yùn)行爆哑,隨著正式運(yùn)行時(shí)間的增長,系統(tǒng)會(huì)愈來愈趨于穩(wěn)定舆吮。系統(tǒng)用戶會(huì)逐漸的熟悉適應(yīng)當(dāng)前的系統(tǒng)揭朝,不適應(yīng)的會(huì)反饋到開發(fā)者那里,由開發(fā)者對系統(tǒng)進(jìn)行修改讓系統(tǒng)反過來去適應(yīng)用戶色冀,在這個(gè)過程中系統(tǒng)使用者和系統(tǒng)本身之間配合的也會(huì)越來越默契潭袱。一旦系統(tǒng)運(yùn)行穩(wěn)定下來,再出新問題的可能性就不大了锋恬,不過再修改的可能性還是有的屯换,因?yàn)榭蛻舻男枨鬅o限的。比如現(xiàn)實(shí)的需求或者是他們突然想起來要新增些什么功能与学、要修改些什么功能彤悔,這些新增、修改的要求都屬于對系統(tǒng)的擴(kuò)展升級索守,這部分下個(gè)章節(jié)詳細(xì)介紹晕窑。
項(xiàng)目正式運(yùn)行并趨于穩(wěn)定之后,再出現(xiàn)明顯的錯(cuò)誤就是很特殊的情況了卵佛,為了方便的查找出現(xiàn)這些錯(cuò)誤的原因杨赤,系統(tǒng)應(yīng)該有自己的日志記錄功能。在架構(gòu)截汪、程序的設(shè)計(jì)階段就應(yīng)該考慮好日志功能疾牲,登錄日志、操作日志衙解、異常日志都要做記錄阳柔,以備出現(xiàn)萬一時(shí)查看。后期設(shè)計(jì)的架構(gòu)中都有日志記錄功能蚓峦,對用戶登入系統(tǒng)后的每個(gè)動(dòng)作都進(jìn)行了詳細(xì)記錄盔沫,可以很方便的查看系統(tǒng)使用者對數(shù)據(jù)的增医咨、刪、改操作架诞。查詢操作較為頻繁拟淮,用戶在登入系統(tǒng)后的每個(gè)動(dòng)作都有可能觸發(fā)對數(shù)據(jù)庫的查詢,所以對這部分的記錄處理的不是很好谴忧。不是不好記錄很泊,而是不好對查詢記錄進(jìn)行分類。比如之前的架構(gòu)中沾谓,在偽業(yè)務(wù)邏輯層都會(huì)有增刪改查四類方法委造,同時(shí)會(huì)有四類方法的重載方法,這些重載方法會(huì)多一個(gè)是否記錄日志的參數(shù)均驶。如果要記錄日志昏兆,直接調(diào)用默認(rèn)方法即可,如果程序不要記錄日志妇穴,則調(diào)用重載方法并傳入false(不記錄日志)參數(shù)爬虱。通常情況下,增刪改這類寫操作都要記錄日志的腾它,不過有些查詢操作卻沒有記錄日志跑筝,比如當(dāng)用戶在登錄系統(tǒng)時(shí),也是調(diào)用的查詢方法瞒滴,但有登錄日志功能專門對這個(gè)操作進(jìn)行記錄曲梗,那這個(gè)查詢操作實(shí)際并無必要記錄在操作日志中,操作日志記錄的都是已經(jīng)登錄系統(tǒng)的用戶執(zhí)行的操作妓忍,每個(gè)操作都要記錄執(zhí)行這個(gè)操作的用戶的ID太闺。再比如荣瑟,用戶在新增卡片信息時(shí)跟磨,系統(tǒng)可能要先判斷一下這個(gè)卡號是否已經(jīng)存在于數(shù)據(jù)庫中茎匠,并給出相應(yīng)的提示,那這個(gè)系統(tǒng)業(yè)務(wù)自身執(zhí)行的操作還要不要記錄在操作日志中呢搁廓?過去沒有對這些查詢進(jìn)行記錄引颈,但是不是可以完整記錄耕皮,然后對操作記錄進(jìn)行分類境蜕,哪些是用戶直接解觸發(fā)的、哪些是間接觸發(fā)的由系統(tǒng)業(yè)務(wù)執(zhí)行凌停?可不可以把操作來自于哪一個(gè)頁面哪一個(gè)控件粱年、執(zhí)行的哪一個(gè)動(dòng)作都進(jìn)行分類記錄,以方便后期的查閱呢罚拟?對于異常日志台诗,是不是要單獨(dú)記錄到本地文件中呢完箩?因?yàn)橄到y(tǒng)一旦運(yùn)行穩(wěn)定,操作異常很有可能是由于數(shù)據(jù)庫失聯(lián)而導(dǎo)致的拉队,這時(shí)如果僅憑操作日志怕是查不到原因的弊知。這些都是非常具體的技術(shù)細(xì)節(jié),是在系統(tǒng)設(shè)計(jì)階段應(yīng)該考慮的問題粱快≈韧總之,為了后期的運(yùn)行維護(hù)事哭,日志功能不可或缺漫雷,且必須設(shè)計(jì)的足夠嚴(yán)謹(jǐn)靈活易用,可以藉此清楚的了解系統(tǒng)運(yùn)行情況鳍咱。
最后一個(gè)要講的問題是數(shù)據(jù)備份降盹,主要是數(shù)據(jù)庫備份和上傳文件備份。項(xiàng)目后期的維護(hù)過程中谤辜,數(shù)據(jù)備份是最重要的一個(gè)問題蓄坏。假如服務(wù)器癱瘓掉,甚至是硬盤出現(xiàn)了物理損壞每辟,你的項(xiàng)目還能否完好恢復(fù)剑辫?SQLServer數(shù)據(jù)庫有定時(shí)備份機(jī)制,但使用起來不是很好渠欺,設(shè)置好后總是莫名其妙的終止妹蔽,自己也沒有嘗試過這種備份文件是否可以成功恢復(fù)。至今不熟悉Oracle數(shù)據(jù)庫的自動(dòng)備份機(jī)制挠将,即便有像SQLServer數(shù)據(jù)庫那樣的自動(dòng)備份功能胳岂,如果僅僅是在本地硬盤上備份,還是無法應(yīng)對服務(wù)器硬件損壞的情況舔稀。一旦硬盤損壞乳丰,所有數(shù)據(jù)的恢復(fù)就都不好弄了。再就是和數(shù)據(jù)庫對應(yīng)的内贮,比如用戶上傳的一些圖片文件产园,這個(gè)之前說過,用戶上傳的文件必須存放在獨(dú)立于項(xiàng)目文件之外的虛擬目錄中夜郁,這種文件的備份又該如何處理什燕?如何建立完善的備份機(jī)制?
理想的情況竞端,一個(gè)系統(tǒng)應(yīng)該至少兩臺服務(wù)器屎即,兩臺服務(wù)器之間的數(shù)據(jù)相互同步,可利用類似于MySQL數(shù)據(jù)庫主從復(fù)制的功能來實(shí)現(xiàn)這種同步。這樣如果一臺服務(wù)器出現(xiàn)問題技俐,還有另一臺乘陪,但小型項(xiàng)目中不大可能為一個(gè)系統(tǒng)配置兩臺服務(wù)器。在過去的技術(shù)生涯中并未遇到過服務(wù)器硬件出現(xiàn)損壞的情況雕擂,但還是覺得沒遇到并不到代表沒有這種可能啡邑,一旦出現(xiàn)這種情況,如果系統(tǒng)比較重要井赌,結(jié)局就會(huì)是災(zāi)難性的谣拣。目前網(wǎng)絡(luò)上流傳的對Oracle數(shù)據(jù)庫自動(dòng)備份的方法,大都是利用批處理腳本完成族展。具體導(dǎo)出方法和自己平時(shí)用的一樣森缠,也是執(zhí)行的exp命令,不過加上批處理后隔段時(shí)間執(zhí)行一下這個(gè)導(dǎo)出命令仪缸。對于系統(tǒng)用戶上傳的文件贵涵,可以用一些定時(shí)壓縮備份工具進(jìn)行備份。利用這些方法恰画,把數(shù)據(jù)庫和上傳文件備份到一個(gè)特定的文件夾中宾茂,然后再利用FlashFXP這類FTP上傳工具,定時(shí)將備份文件上傳到FTP服務(wù)器中拴还。一般情況下跨晴,項(xiàng)目所在的服務(wù)器都可以訪問外網(wǎng),而公司也都會(huì)有多臺外網(wǎng)服務(wù)器片林,可以在上面搭建一個(gè)FTP供上傳備份端盆。也可以利用SoftEther搭建VPN,將備份數(shù)據(jù)保存到自己電腦或公司內(nèi)部的源代碼服務(wù)器费封,這是自己目前能想出的唯一可行的完美備份方案焕妙。
備份部分還有一個(gè)要提醒的問題,就是在發(fā)布新版本系統(tǒng)前弓摘,應(yīng)該先對當(dāng)前運(yùn)行的版本進(jìn)行備份焚鹊,也就是說先備份在發(fā)布。這樣做的目的是韧献,如果發(fā)布的新版本出現(xiàn)問題末患,可以及時(shí)恢復(fù)到過去的版本。對于數(shù)據(jù)庫的增刪改等手工操作锤窑,也應(yīng)該先對數(shù)據(jù)庫進(jìn)行備份璧针,以防萬一。
還有一個(gè)和項(xiàng)目的運(yùn)行維護(hù)關(guān)系不大的果复、備份相關(guān)的問題陈莽,想在這里提一下渤昌,就是源代碼管理器的備份虽抄。目前使用的源代碼管理器是TFS走搁,應(yīng)該了解下對這個(gè)TFS的備份方法。項(xiàng)目的歷史修改記錄都在源代碼管理器中迈窟,如果這個(gè)存放源代碼的服務(wù)器有個(gè)三長兩短私植,也是很要命的。
八 擴(kuò)展升級
在自己看來车酣,評價(jià)一個(gè)項(xiàng)目是否重要的核心因素只有一個(gè)曲稼,那就是項(xiàng)目被使用的頻率。如果每天都有很多人在用它湖员,它自然就很重要贫悄。項(xiàng)目在穩(wěn)定運(yùn)行之后,如果客戶和公司有比較長的合作關(guān)系娘摔,且項(xiàng)目比較重要窄坦,那后期擴(kuò)展升級的可能性就會(huì)非常大。自己負(fù)責(zé)開發(fā)的項(xiàng)目凳寺,簡單的增改些功能到也算不上難題鸭津,真正另自己覺得麻煩的是另外一種情況,擴(kuò)展升級別人開發(fā)的項(xiàng)目肠缨。
無論是別人開發(fā)的項(xiàng)目還是自己開發(fā)的項(xiàng)目逆趋,對項(xiàng)目的擴(kuò)展升級都會(huì)分兩種情況。第一種情況是晒奕,項(xiàng)目的核心業(yè)務(wù)沒有多少變動(dòng)闻书,而只是做些簡單修改或者是增加些附屬業(yè)務(wù)。前段時(shí)間XX醫(yī)院要求在現(xiàn)有會(huì)診平臺中加入轉(zhuǎn)診住院功能就屬于這種情況脑慧,項(xiàng)目原有數(shù)據(jù)庫結(jié)構(gòu)不做大的變動(dòng)惠窄,但會(huì)增加新的表結(jié)構(gòu)來實(shí)現(xiàn)新增的附屬業(yè)務(wù)。第二種情況是漾橙,項(xiàng)目的核心業(yè)務(wù)有了較大的改動(dòng)杆融,當(dāng)前的數(shù)據(jù)庫結(jié)構(gòu)已經(jīng)無法滿足新業(yè)務(wù)要求,數(shù)據(jù)庫必須重建霜运。數(shù)據(jù)庫一旦重建脾歇,程序以及前端就都要重寫,也就是說整個(gè)項(xiàng)目都要重新開發(fā)淘捡,像之前的“YQZA系統(tǒng)”藕各、“ZHJWBB系統(tǒng)”都屬于這種情況。嚴(yán)格來講焦除,這種情況已經(jīng)不算擴(kuò)展升級了激况,這和重新開發(fā)一個(gè)新項(xiàng)目沒多大區(qū)別。
針對第二種情況,無論之前的項(xiàng)目是誰開發(fā)的乌逐,到你這里都沒有區(qū)別竭讳,都要重新開發(fā)。就把它當(dāng)成一個(gè)全新的項(xiàng)目浙踢,按上面章節(jié)中所說的方法了解需求绢慢、分析、設(shè)計(jì)洛波、開發(fā)胰舆、測試。因?yàn)槭嵌伍_發(fā)蹬挤,也可以參考借鑒一下舊的項(xiàng)目缚窿。
針對第一種情況,如果是自己開發(fā)的項(xiàng)目焰扳,簡單增加些功能并非難事滨攻,因?yàn)檎麄€(gè)項(xiàng)目都是自己做的,自己對情況比較了解蓝翰」馊疲可如果這個(gè)項(xiàng)目是別人做的呢?按理應(yīng)該是誰的項(xiàng)目誰來負(fù)責(zé)擴(kuò)展升級維護(hù)畜份,那假如這個(gè)項(xiàng)目的負(fù)責(zé)人诞帐、開發(fā)者離職了呢?在中小型公司中爆雹,這種情況很常見停蕉。一個(gè)人負(fù)責(zé)一個(gè)項(xiàng)目,甚至是一個(gè)人負(fù)責(zé)多個(gè)項(xiàng)目钙态,一旦這個(gè)人撂挑子不干了慧起,他手下的項(xiàng)目就會(huì)很麻煩。管理者自然會(huì)將這樣的項(xiàng)目交付給其他人册倒,這個(gè)接手的人在維護(hù)修改一個(gè)完全不屬于自己的項(xiàng)目蚓挤,困難可想而知。接手的“遠(yuǎn)程醫(yī)學(xué)平臺項(xiàng)目”就是這樣驻子,前面幾經(jīng)人手灿意,程序早已混亂不堪、錯(cuò)誤百出崇呵,但迫于種種情況缤剧,數(shù)據(jù)庫又不能重新設(shè)計(jì),只能在原有的基礎(chǔ)上進(jìn)行修改域慷。對于這個(gè)項(xiàng)目荒辕,考慮到現(xiàn)實(shí)情況和時(shí)間限制汗销,沒有對數(shù)據(jù)庫、界面以及核心業(yè)務(wù)做大的調(diào)整抵窒,但把所有的程序弛针、樣式、腳本都進(jìn)行了重寫估脆。就是說把房子重拆后又建了一遍,但沒有改動(dòng)地基座云,建完后的房子和之前的看起來一模一樣疙赠,外面的人看不出來,其實(shí)里面用的材料已經(jīng)完全不一樣了朦拖。這是當(dāng)時(shí)能想到的唯一比較可行的方法圃阳,現(xiàn)在想來其實(shí)也不甚好,公司的很多人璧帝,尤其是管理層捍岳,只看表層的界面都以為根本沒做什么工作呢。
總結(jié)一下上面的介紹睬隶,把針對項(xiàng)目的擴(kuò)展升級重新劃分成四種類別:第一種是對自己開發(fā)的項(xiàng)目完全重寫锣夹,第二種是對自己開發(fā)的項(xiàng)目進(jìn)行部分修改,第三種是對別人開發(fā)的項(xiàng)目完全重寫苏潜,第四種是對別人開發(fā)的項(xiàng)目進(jìn)行部分修改银萍。
到了項(xiàng)目擴(kuò)展升級這一步,項(xiàng)目開發(fā)者能做的工作其實(shí)并不多恤左,我們在這一步工作中的難易很大程度上依賴于項(xiàng)目早期設(shè)計(jì)贴唇、開發(fā)、用人的合理性等等一些因素飞袋。反推一下戳气,為了項(xiàng)目后期擴(kuò)展升級的方便,項(xiàng)目開發(fā)前期應(yīng)該注意哪些問題巧鸭。
第一個(gè)要注意的問題在項(xiàng)目具體的技術(shù)實(shí)現(xiàn)上瓶您。數(shù)據(jù)庫設(shè)計(jì)、架構(gòu)設(shè)計(jì)纲仍、程序設(shè)計(jì)務(wù)必要盡可能的穩(wěn)定览闰、靈活。靈活巷折,什么是靈活压鉴?靈活就是開發(fā)者在后期可以很容易的對已經(jīng)成型的項(xiàng)目進(jìn)行修改擴(kuò)展。為什么數(shù)據(jù)庫表中一定要存外鍵锻拘、一定要存字典編碼而不是相應(yīng)的文本信息油吭?為什么數(shù)據(jù)庫表中大都有CREATETIME击蹲、UPDATETIME、CREATEUSER婉宰、UPDATEUSER四個(gè)字段歌豺?為什么要對架構(gòu)做很多不必要的分層?為什么本來可以很容易寫的程序要繞這么多彎來實(shí)現(xiàn)心包?這些很多看似不必要的工作都是為了項(xiàng)目的穩(wěn)定及后期可能的修改类咧。還有具體到用戶、單位蟹腾、字典等基本信息痕惋,角色權(quán)限等基本業(yè)務(wù),都是一個(gè)項(xiàng)目基礎(chǔ)又核心的功能娃殖,此部分的設(shè)計(jì)必須足夠靈活值戳,后期才可能方便的進(jìn)行擴(kuò)展升級,這也是我為什么要做通用權(quán)限管理系統(tǒng)的原因炉爆。
第二個(gè)要注意的問題在項(xiàng)目開發(fā)的用人上堕虹。雖然之前說在可能的情況下項(xiàng)目開發(fā)團(tuán)隊(duì)中人的質(zhì)量應(yīng)該越高越好、數(shù)量應(yīng)該越少越好芬首,但公司較為重要的赴捞、較為核心的項(xiàng)目不應(yīng)該輕易的全都交付在某個(gè)人身上,一個(gè)人主負(fù)責(zé)沒問題郁稍,但要讓多個(gè)人參與其中螟炫,以防人員流失后項(xiàng)目不穩(wěn)定。這個(gè)真正實(shí)施起來并不容易艺晴,中小型公司中的開發(fā)團(tuán)隊(duì)人手本來就緊張昼钻,在調(diào)動(dòng)人員的過程中如果強(qiáng)制讓部門中互相合不來的開發(fā)人員在一起共同開發(fā)項(xiàng)目,項(xiàng)目的質(zhì)量很難保證封寞。除非是部門的團(tuán)隊(duì)協(xié)作文化很好然评,任何的幾個(gè)人之間都能良好配合工作。即便如此狈究,管理者心中也應(yīng)該有數(shù)碗淌,把重要項(xiàng)目全部交到一個(gè)不太可靠的人手里是非常危險(xiǎn)的。
第三個(gè)要注意的問題是統(tǒng)一代碼規(guī)范抖锥。如果部門中所有開發(fā)人員使用統(tǒng)一的架構(gòu)亿眠、統(tǒng)一風(fēng)格的代碼,就無需擔(dān)心接手不是自己負(fù)責(zé)項(xiàng)目的擴(kuò)展升級工作了磅废。文乃心聲纳像,文不一,說明心不一拯勉。如果文統(tǒng)一了竟趾,所有人同心協(xié)力做項(xiàng)目憔购,溝通協(xié)調(diào)還能有什么困難,還有什么事做不成岔帽?可這個(gè)實(shí)施起來也是非常困難的玫鸟,統(tǒng)一代碼規(guī)范在某種程度上是要扼殺人的創(chuàng)造性的,沒有哪個(gè)員工希望自己被束縛起來工作犀勒,尤其是被不合理的規(guī)范束縛屎飘。所以,如果要在開發(fā)團(tuán)隊(duì)中推行統(tǒng)一的代碼規(guī)范贾费,首先要制定出一套合理的規(guī)范钦购,把大家叫到一起研究,聽取每個(gè)人的意見铸本,先在某個(gè)項(xiàng)目中試行肮雨,然后再全面推廣遵堵。同時(shí)建立代碼審查機(jī)制箱玷,用代碼審查工具考核所有人的代碼,逐步讓這一制度深入人心陌宿。代碼規(guī)范應(yīng)該在統(tǒng)一和盡可能減少對人創(chuàng)造性的扼殺間找到一個(gè)平衡點(diǎn)锡足,具體到代碼規(guī)范的制定可以參考這篇文章:軟件項(xiàng)目質(zhì)量保證——編碼規(guī)范。
第四個(gè)要注意的問題壳坪,由上兩個(gè)問題延伸而來舶得,有關(guān)團(tuán)隊(duì)的建設(shè)。把能力爽蝴、品性參差不齊的人凝聚在一起不是件容易的事情沐批,但從事實(shí)的角度來講,一個(gè)人技術(shù)能力再強(qiáng)蝎亚,能做的工作畢竟是有限的九孩。況且,一個(gè)人也不可能精通所有技術(shù)的所有細(xì)節(jié)发框,必須要依賴于團(tuán)隊(duì)的力量躺彬。從個(gè)人來講,不太喜歡和別人合作開發(fā)梅惯,尤其是在自己完全可以獨(dú)立完成的情況下宪拥。是的,因?yàn)橛腥司蜁?huì)有意見不統(tǒng)一铣减,有意見不統(tǒng)一就會(huì)有爭執(zhí)她君,有爭執(zhí)就要有磨合,磨合的過程是痛苦的葫哗。很多時(shí)候犁河,不覺得經(jīng)歷這種痛苦是必要的鳖枕。但是如果站在公司和管理者的角度,團(tuán)隊(duì)的磨合卻是非常必要桨螺。一個(gè)人的性格不好塑造宾符,但一個(gè)團(tuán)隊(duì)的性格卻可以。部門內(nèi)部一盤散沙灭翔,團(tuán)隊(duì)人員頻繁變動(dòng)魏烫,沒有統(tǒng)一的開發(fā)套路,沒有規(guī)章制度肝箱,沒有默契哄褒,這樣的團(tuán)隊(duì)怎么能做成事情?能不能成功在于兩方面煌张,第一是你選擇的方向?qū)Σ粚δ派模懿荒苓x對要做的事情。在職場骏融,具體到要做什么樣的項(xiàng)目往往由公司的大方向決定链嘀,自己能左右的不多。第二方面是能不能把選對的事情做好档玻,這一點(diǎn)是自己可以把握的怀泊,研發(fā)部門就是要有一個(gè)可以把任何項(xiàng)目都做能好的團(tuán)隊(duì)。為了訓(xùn)練出這樣一支團(tuán)隊(duì)误趴,部門管理者應(yīng)該是懂技術(shù)的霹琼、懂管理的、強(qiáng)勢的凉当。為了讓團(tuán)隊(duì)中的所有人使用統(tǒng)一的開發(fā)環(huán)境枣申、統(tǒng)一的架構(gòu)、統(tǒng)一的代碼規(guī)范看杭、統(tǒng)一的文檔規(guī)范忠藤,管理者也應(yīng)該獨(dú)裁。只是現(xiàn)在管理者和員工并非君臣關(guān)系泊窘,游戲規(guī)則是由公司熄驼、公司的管理者來決定,但玩不玩卻是由員工自己來決定的烘豹。強(qiáng)勢的領(lǐng)導(dǎo)可能會(huì)讓下屬覺得不舒服瓜贾,造成人員的流失。首先你的規(guī)則必須是合理的携悯,別人才會(huì)同意跟你玩祭芦,結(jié)合實(shí)際情況制定合理的規(guī)則,推行時(shí)講就技巧和方法憔鬼。管理者必須是強(qiáng)勢獨(dú)裁的龟劲,但管理方法應(yīng)該是民主的胃夏。再就是實(shí)戰(zhàn),成吉思汗的軍隊(duì)?wèi)?zhàn)無不勝不是因?yàn)樗麄兾淦飨冗M(jìn)昌跌,而是因?yàn)樗麄兙媒?jīng)沙場仰禀。要不停的打仗,不斷的接手新任務(wù)蚕愤,在實(shí)戰(zhàn)中鍛煉隊(duì)伍答恶。再就是中小型公司的人員本來就不多,最好不要同時(shí)招收用不同編程語言的開發(fā)人員萍诱,要Java就全都招做Java的悬嗓,要.NET就全都招做.NET的,這樣也方便通力協(xié)作裕坊。用不同編程語言的開發(fā)人員包竹,怎么好擰成一個(gè)團(tuán)隊(duì)?
上面四點(diǎn)都是在反推為了項(xiàng)目后期擴(kuò)展升級的方便籍凝,項(xiàng)目開發(fā)前期應(yīng)該注意哪些問題周瞎。在事情發(fā)生問題之后再想解決辦法,已經(jīng)輸了静浴,在發(fā)生問題之前就預(yù)料到可能要發(fā)生的問題并采取相應(yīng)的預(yù)防措施才是真正高明的堰氓,所以說“上工治未病挤渐,不治已病”苹享,與其亡羊之后再補(bǔ)牢,何不提早的未雨綢繆浴麻?項(xiàng)目到了擴(kuò)展升級環(huán)節(jié)得问,工作的難易大都依賴于之前所做的工作,不過這里還是要講一下這個(gè)環(huán)節(jié)要注意的幾個(gè)問題软免。
第一個(gè)是先做決定。在接到擴(kuò)展升級要求后,先根據(jù)實(shí)際情況來決定是對項(xiàng)目進(jìn)行重寫還是修改璃吧、是部分重寫還是部分修改饮怯,決定的依據(jù)主要有:項(xiàng)目本身的重要性如何、項(xiàng)目是自己開發(fā)的還是別人開發(fā)的榛泛、擴(kuò)展升級需求對核心業(yè)務(wù)的影響大不大蝌蹂、客戶及公司允許的時(shí)間上限是多少、重寫和修改的個(gè)人及公司的時(shí)間等成本各如何曹锨、重寫和修改的對個(gè)人及公司的收益各如何孤个、部門領(lǐng)導(dǎo)的意見如何,等等沛简。對于別人開發(fā)的項(xiàng)目齐鲤、核心業(yè)務(wù)變動(dòng)需求較大的斥废、改造時(shí)間充裕的情況,盡量直接重寫给郊;對于自己的項(xiàng)目牡肉、核心業(yè)務(wù)變動(dòng)不大、改造時(shí)間較短淆九、項(xiàng)目不是特別重要的荚板,盡量只做簡單修改。接手遠(yuǎn)程醫(yī)學(xué)平臺項(xiàng)目的修改工作時(shí)吩屹,我對所有程序做了重寫跪另,但沒變動(dòng)數(shù)據(jù)庫和最終展現(xiàn)效果,依據(jù)就是:核心業(yè)務(wù)變動(dòng)不大但程序是其它人開發(fā)已混亂不堪煤搜,沒有專業(yè)美工不好做界面變動(dòng)免绿,公司允許的時(shí)間比較緊張。不過通常情況下擦盾,不會(huì)遇到這么復(fù)雜的情況嘲驾,一般的擴(kuò)展升級就是對自己負(fù)責(zé)的項(xiàng)目增加些功能。
第二個(gè)是對項(xiàng)目做簡單修改時(shí)要注意的問題迹卢。擴(kuò)展升級如何保證當(dāng)前正運(yùn)行版本不受干擾辽故,如何不搞亂當(dāng)前系統(tǒng)的主架構(gòu)和核心業(yè)務(wù)?針對這一點(diǎn)腐碱,除了要依賴早期架構(gòu)誊垢、程序的靈活外,自己在做修改時(shí)也應(yīng)該注意症见,盡量不要?jiǎng)h改原有的程序或數(shù)據(jù)庫表喂走、字段,如果在原有數(shù)據(jù)庫表中增加字段谋作、或在原有程序中增加新程序時(shí)芋肠,務(wù)必謹(jǐn)慎,并做好測試工作遵蚜。盡可能的讓自己新增的功能和原有的功能保持獨(dú)立帖池,如果不得以要修改原有的功能,注意被修改功能相關(guān)的其它模塊可能受到的影響吭净,最重要的還是做好測試工作睡汹。像遠(yuǎn)程醫(yī)學(xué)平臺這種項(xiàng)目,不同地方的核心業(yè)務(wù)相似但細(xì)節(jié)要求常有不同攒钳,比如申請會(huì)診時(shí)有的要新增額外字段帮孔,如何處理定制部分、通用部分,另其互不影響文兢,確保整個(gè)大平臺的穩(wěn)定統(tǒng)一晤斩?這些還是要依賴數(shù)據(jù)庫、架構(gòu)姆坚、程序的早期設(shè)計(jì)澳泵,項(xiàng)目設(shè)計(jì)者在技術(shù)能力之外還要對會(huì)診業(yè)務(wù)有充分的了解,要有一定的行業(yè)經(jīng)驗(yàn)兼呵。
第三個(gè)是重寫項(xiàng)目要注意的問題兔辅。重寫項(xiàng)目的決定必須要謹(jǐn)慎,考慮好徹底推翻重做的付出和收益如何击喂,尤其是重寫通用的维苔、核心的項(xiàng)目,如果重寫后的項(xiàng)目不能比重寫前的優(yōu)秀許多懂昂,重寫意義是不大的的介时。重寫應(yīng)該借鑒原有系統(tǒng)的一些經(jīng)驗(yàn),可能的話凌彬,聽聽原有開發(fā)者及系統(tǒng)用戶的建議沸柔,看看之前的工作有無可復(fù)用部分(估計(jì)有用的不會(huì)很多),或許會(huì)減少些自己的工作量铲敛。
關(guān)于擴(kuò)展升級的介紹比較散亂褐澎,因?yàn)橐恢痹诘雇品此柬?xiàng)目流程的前幾個(gè)環(huán)節(jié),設(shè)計(jì)伐蒋、開發(fā)工三、用人,甚至是團(tuán)隊(duì)建設(shè)咽弦,覺得這些才是根本徒蟆。也就是說胁出,決定擴(kuò)展升級工作的關(guān)鍵因素在擴(kuò)展升級工作之外型型。
九 梳理總結(jié)
了解需求、需求分析全蝶、項(xiàng)目設(shè)計(jì)屬于項(xiàng)目完整流程的前期階段闹蒜,項(xiàng)目開發(fā)屬于中期階段,測試抑淫、運(yùn)行屬于項(xiàng)目的后期階段绷落,維護(hù)、擴(kuò)展升級屬于附屬階段始苇。合理的情況下砌烁,在一個(gè)項(xiàng)目調(diào)研開發(fā)的完整流程中:三分之一的時(shí)間進(jìn)行計(jì)劃分析、六分之一的時(shí)間進(jìn)行編碼、四分之一的時(shí)間進(jìn)行構(gòu)件測試和早期系統(tǒng)測試函喉、四分之一的時(shí)間進(jìn)行完整的系統(tǒng)測試避归。但是,自己過去的經(jīng)驗(yàn)管呵,接觸過的項(xiàng)目的重點(diǎn)環(huán)節(jié)并不在測試上面梳毙,而是分析設(shè)計(jì)階段和開發(fā)階段,后期階段及附屬階段工作的難易很大程度上由前期的設(shè)計(jì)開發(fā)工作所決定捐下。一方面是由于自己接手項(xiàng)目的性質(zhì)相對另類账锹,另一方面自己過去的項(xiàng)目開發(fā)流程有確實(shí)要些不甚合理。
回過頭來看文檔中描述的整套流程的各個(gè)環(huán)節(jié)坷襟,這些環(huán)節(jié)的工作最終大都要落實(shí)在文檔上奸柬。尤其是需求分析、確認(rèn)婴程、設(shè)計(jì)階段鸟缕,如果沒有文檔,所有的工作都只能停留在虛無縹緲之中排抬。整套流程中涉及到的文檔資料主要有:業(yè)務(wù)流程圖懂从、需求確認(rèn)書、界面效果圖蹲蒲、數(shù)據(jù)庫結(jié)構(gòu)圖番甩、數(shù)據(jù)庫文檔、描述人員安排和進(jìn)度跟蹤的甘特圖届搁、開發(fā)文檔缘薛、程序文檔、接口文檔卡睦、測試文檔宴胧、軟件操作說明書。其中數(shù)據(jù)庫結(jié)構(gòu)圖表锻、數(shù)據(jù)庫文檔恕齐、程序文檔、接口文檔都可以借助工具自動(dòng)生成瞬逊,項(xiàng)目接口和項(xiàng)目測試可借助相應(yīng)的平臺管理工具進(jìn)行管理显歧,相應(yīng)的文檔即可省略,總之确镊,這幾項(xiàng)都無需耗費(fèi)多少人工士骤。如果在項(xiàng)目開發(fā)文檔中描述了大致的人員安排及時(shí)間規(guī)劃,可以省略掉描述人員安排和進(jìn)度跟蹤的甘特圖蕾域,如果比較大的項(xiàng)目也可以用Project繪制出相應(yīng)的甘特圖拷肌,這一項(xiàng)是非必須的。業(yè)務(wù)流程圖、需求確認(rèn)書巨缘、界面效果圖厢绝、項(xiàng)目開發(fā)文檔、軟件操作說明文檔带猴,這幾項(xiàng)是必須的昔汉,尤其是項(xiàng)目開發(fā)文檔,不可或缺拴清。業(yè)務(wù)流程圖大都由Visio繪制靶病,但這個(gè)工具的局限性很大,自己不太喜歡口予,如果能熟練使用PotoShop繪制流程圖娄周,可表現(xiàn)形式會(huì)更豐富些,項(xiàng)目經(jīng)理應(yīng)該學(xué)習(xí)使用沪停。當(dāng)然最好的繪制方式就是紙和筆煤辨,但不好表現(xiàn)成電子文檔。界面效果圖由美工完成木张,項(xiàng)目經(jīng)理無需費(fèi)心众辨。網(wǎng)上有很多需求確認(rèn)書及開發(fā)文檔的模板,自己可以借鑒整理出一套自己的模板舷礼,每次復(fù)用即可鹃彻。項(xiàng)目操作說明文檔寫起來比較容易,可交給工程實(shí)施人員編寫妻献。
除去工具生成部分蛛株、美工負(fù)責(zé)的效果圖、工程實(shí)施人員負(fù)責(zé)的軟件操作說明書育拨,項(xiàng)目經(jīng)理要寫的文檔很少谨履,只有業(yè)務(wù)流程圖、需求確認(rèn)書和開發(fā)文檔熬丧,這些大都有模板可套笋粟。無論是工具生成的部分還是人工編寫的部分,一定要清楚的是:這些文檔不是招標(biāo)書锹引,不是為了應(yīng)付形式而做矗钟,而是有實(shí)實(shí)在在作用的,是這個(gè)項(xiàng)目嫌变、是自己、是整個(gè)團(tuán)隊(duì)后續(xù)工作的依據(jù)躬它,文檔的編寫應(yīng)該是正式的腾啥、規(guī)范的、認(rèn)真的、實(shí)用的倘待。當(dāng)你熟悉這些文檔的編寫時(shí)疮跑,也就熟悉整套軟件開發(fā)的流程了。還有凸舵,我認(rèn)為敏捷開發(fā)方式不是說不寫文檔祖娘,而是要盡可能減少不必要的文檔,并借用工具把花費(fèi)在必要文檔上的時(shí)間降到最低啊奄,以期用最少的時(shí)間和精力把腦海中的模型表現(xiàn)出來渐苏。比起文檔的編寫核定,敏捷開發(fā)更重視團(tuán)隊(duì)間面對面的協(xié)調(diào)溝通菇夸。
在最早接觸實(shí)際項(xiàng)目的開發(fā)工作時(shí)琼富,認(rèn)為一個(gè)好項(xiàng)目的評判標(biāo)準(zhǔn)主要依據(jù)這幾個(gè)方面:安全性、穩(wěn)定性庄新、兼容性鞠眉、易用性、可擴(kuò)展性和其能完成的具體功能择诈,等械蹋。好項(xiàng)目中的好程序則在于程序的健壯性、執(zhí)行效率羞芍、高內(nèi)聚低耦合不重復(fù)朝蜘、易修改升級擴(kuò)展、及規(guī)范化編寫涩金,等∑状迹現(xiàn)在看來這些評判未必全面、未必合適步做,但這著實(shí)豎立了自己早期的副渴、針對軟件的價(jià)值觀。已經(jīng)清楚的知道如何做一個(gè)好的項(xiàng)目全度,卻不知道如何在最短的時(shí)間內(nèi)花費(fèi)最少的精力完成這樣一個(gè)好的項(xiàng)目煮剧,所以才會(huì)有這篇文檔。
熟悉建站CMS的人都清楚将鸵,一旦網(wǎng)站的整體風(fēng)格設(shè)計(jì)完畢勉盅,可借助CMS在非常短的時(shí)間內(nèi)完成整個(gè)網(wǎng)站建設(shè)的具體工作。因?yàn)镃MS的開發(fā)者摸清了網(wǎng)站建設(shè)的一些通用規(guī)律顶掉,所以才會(huì)設(shè)計(jì)這樣一種工具草娜。也希望如此,把整套軟件開發(fā)的流程流水化處理痒筒,不僅要借助工具把具體開發(fā)工作花費(fèi)的時(shí)間降到最低宰闰,還要把分析茬贵、設(shè)計(jì)、測試移袍、運(yùn)行解藻、維護(hù)等環(huán)節(jié)花費(fèi)的時(shí)間進(jìn)行壓縮。
本文檔中關(guān)于軟件開發(fā)的整套流程以及各環(huán)節(jié)的關(guān)鍵點(diǎn)葡盗,已經(jīng)介紹的比較詳細(xì)螟左。表面上看這些環(huán)節(jié)比較復(fù)雜,但如果你熟悉下來觅够,實(shí)際工作花費(fèi)的時(shí)間非常少胶背。后面就是依據(jù)文檔中的介紹,將每一個(gè)環(huán)節(jié)的工作都熟練掌握蔚约、了然于胸奄妨,在實(shí)踐中摸索出一套自己的流程。大致的思路應(yīng)該是和文檔中的描述一樣苹祟,但更適合自己砸抛。一旦知道如何將項(xiàng)目開發(fā)工作流水化處理,無論是業(yè)務(wù)比較復(fù)雜的還是相對簡單的树枫,軟件開發(fā)的時(shí)間將不會(huì)有大的差別直焙。要想讓架構(gòu)穩(wěn)定靈活功能強(qiáng)大,其設(shè)計(jì)必然相對復(fù)雜砂轻,但軟件本身的功能和架構(gòu)的復(fù)雜度對開發(fā)時(shí)間的影響并不大奔誓,真正影響開發(fā)時(shí)間的是開發(fā)團(tuán)隊(duì)的技術(shù)熟練程度。如果你比較熟悉開發(fā)套路搔涝,復(fù)雜的項(xiàng)目也可以很快的開發(fā)完成厨喂,反之亦然。就像影響汽車生產(chǎn)速度的并不是汽車本身的復(fù)雜度庄呈,而是汽車生產(chǎn)流水線的先進(jìn)程度蜕煌,本篇文檔就是在告訴你如何制造一個(gè)先進(jìn)的軟件開發(fā)流水線。
本文檔中的所有記述都來自于實(shí)踐诬留,之前也說過斜纪,自己所接手的大都是中小型團(tuán)隊(duì)的中小型項(xiàng)目,大都是B/S的企業(yè)內(nèi)部應(yīng)用系統(tǒng)文兑,所以文檔中的經(jīng)驗(yàn)并不是對所有類型的軟件開發(fā)都適用盒刚。其實(shí)B/S和C/S并不重要,僅僅是表現(xiàn)層不同绿贞。自己開發(fā)過的因块、接觸過的、見過的企業(yè)內(nèi)部應(yīng)用系統(tǒng)中樟蠕,也沒有能稱得上“大型”的項(xiàng)目贮聂,在我看來靠柑,絕大部分企業(yè)內(nèi)部應(yīng)用系統(tǒng)都只能屬于中小型的范疇寨辩,而真正的大型項(xiàng)目應(yīng)該是微博吓懈、淘寶網(wǎng)、騰訊網(wǎng)易門戶網(wǎng)站這類的互聯(lián)網(wǎng)軟件靡狞。就自己過去的了解耻警,大型互聯(lián)網(wǎng)項(xiàng)目的開發(fā)是和中小型企業(yè)內(nèi)部應(yīng)用系統(tǒng)的開發(fā)有本質(zhì)區(qū)別的——在需求調(diào)研、人員分工甸怕、架構(gòu)設(shè)計(jì)甘穿、開發(fā)測試等等各個(gè)環(huán)節(jié),自己也沒有更大規(guī)模的項(xiàng)目開發(fā)經(jīng)驗(yàn)了梢杭,所以不敢對此枉談温兼。不過,我相信武契,對于絕大部分企業(yè)內(nèi)部應(yīng)用系統(tǒng)募判,本文檔中的經(jīng)驗(yàn)都是適用的,本文檔中所描繪的軟件生產(chǎn)流水線也足以應(yīng)付絕大部分企業(yè)內(nèi)部應(yīng)用系統(tǒng)咒唆。
再要講的是團(tuán)隊(duì)建設(shè)届垫。幾乎在上面的各個(gè)章節(jié)中都談到人的問題,越來越清楚的意識到全释,從領(lǐng)導(dǎo)層和公司的角度來看装处,在集體中僅僅是做好自己,遠(yuǎn)遠(yuǎn)不夠浸船。在中小型公司中妄迁,一個(gè)研發(fā)部就算是一個(gè)小的團(tuán)隊(duì)。不停的在問自己李命,如果讓你負(fù)責(zé)從零組建一個(gè)公司的研發(fā)部登淘,你會(huì)怎么做?反思自己工作之后待過的諸多團(tuán)隊(duì)项戴,認(rèn)為優(yōu)秀的團(tuán)隊(duì)?wèi)?yīng)該至少具備下面四個(gè)要素:
第一是清晰的團(tuán)隊(duì)?wèi)?zhàn)略形帮。研發(fā)部門的戰(zhàn)略是和整個(gè)公司的戰(zhàn)略密不可分的,首先是整個(gè)公司的戰(zhàn)略目標(biāo)明確周叮,其次是公司交給研發(fā)部的任務(wù)戰(zhàn)略明確辩撑。沒有明確目標(biāo)的團(tuán)隊(duì)是無法支撐下去的。
第二是優(yōu)秀的團(tuán)隊(duì)領(lǐng)導(dǎo)人仿耽。團(tuán)隊(duì)領(lǐng)導(dǎo)人是團(tuán)隊(duì)建設(shè)的中堅(jiān)力量合冀,要求比較高,要懂技術(shù)项贺、懂管理君躺、平和有凝聚力峭判、務(wù)實(shí)。只有優(yōu)秀的領(lǐng)導(dǎo)人棕叫,才可能打造出優(yōu)秀的開發(fā)團(tuán)隊(duì)林螃。
第三是務(wù)實(shí)的團(tuán)隊(duì)氛圍。氛圍就是一種文化俺泣,只有務(wù)實(shí)疗认,才能踏踏實(shí)實(shí)的做好事情。完善的制度伏钠、合理的規(guī)范横漏、優(yōu)秀的團(tuán)隊(duì)成員和團(tuán)隊(duì)領(lǐng)導(dǎo)人及公司的整體文化都在影響著團(tuán)隊(duì)的氛圍,這是一種綜合作用的結(jié)果熟掂。
第四是人才和技術(shù)的積累缎浇。優(yōu)秀的成熟的團(tuán)隊(duì)?wèi)?yīng)該具備優(yōu)秀人才和行業(yè)核心技術(shù)的積累,優(yōu)秀的人才是指在人品和技術(shù)上都過關(guān)赴肚、且在公司工作多年不會(huì)輕易流動(dòng)的員工素跺,他們是研發(fā)團(tuán)隊(duì)的核心力量,技術(shù)積累是指可復(fù)用項(xiàng)目尊蚁、可復(fù)用架構(gòu)亡笑、可復(fù)用代碼、可復(fù)用文檔横朋、技術(shù)規(guī)范等的積累仑乌。人才和技術(shù)的積累是團(tuán)隊(duì)穩(wěn)定運(yùn)行的資本。
回過頭來回答剛才的問題琴锭,如果讓自己從零組建一個(gè)開發(fā)部晰甚。首先在招聘第一批團(tuán)隊(duì)成員時(shí)應(yīng)該慎重,不僅是要技術(shù)過關(guān)决帖,更要有責(zé)任心和團(tuán)隊(duì)協(xié)作能力厕九,只是,面試時(shí)技術(shù)好考查地回,人品和能力就不好發(fā)掘了扁远。團(tuán)隊(duì)組建完畢之后,剩下的就是在項(xiàng)目實(shí)戰(zhàn)中塑造團(tuán)隊(duì)文化刻像、完成人才和技術(shù)的積累——依照上面的標(biāo)準(zhǔn)畅买。這說起來容易,做起來肯定會(huì)有各種各樣的問題细睡,但這些細(xì)節(jié)不是這里要討論的內(nèi)容谷羞,我們只要清楚的知道好的團(tuán)隊(duì)是怎樣的,然后朝著這個(gè)方向努力就可以了溜徙,至于具體的細(xì)節(jié)方法湃缎,那就要在真實(shí)的工作中摸索了犀填。
更多情況下,我們不是去從零開始組建一個(gè)團(tuán)隊(duì)嗓违,也不是進(jìn)入一個(gè)空白的團(tuán)隊(duì)九巡,而是進(jìn)入一個(gè)已存在的團(tuán)隊(duì)。進(jìn)入一個(gè)已存在的團(tuán)隊(duì)靠瞎,如何成為這個(gè)團(tuán)隊(duì)的中堅(jiān)力量比庄,如何協(xié)助這個(gè)團(tuán)隊(duì)成為公司的中堅(jiān)力量求妹,如何在團(tuán)隊(duì)和公司中施加自己的影響力乏盐?這才是自己應(yīng)該考慮的問題。在我看來制恍,問題特別多父能、一塌糊涂的團(tuán)隊(duì)和特別優(yōu)秀成熟的團(tuán)隊(duì)都不大適合自己,原因也很簡單净神,一塌糊涂的團(tuán)隊(duì)中想做事太難何吝,阻力太大,而優(yōu)秀成熟的團(tuán)隊(duì)已經(jīng)成型鹃唯,自己能做的建設(shè)性事情又太少爱榕。真正適合自己的應(yīng)該是,公司及部門戰(zhàn)略目標(biāo)都很清晰又尚未完成人才坡慌、技術(shù)積累的團(tuán)隊(duì)黔酥,這樣的團(tuán)隊(duì)既有奔頭,可做的事情又多洪橘。不過跪者,人想找個(gè)合適的團(tuán)隊(duì)同團(tuán)隊(duì)想找個(gè)合適的人一樣難,因?yàn)檎也坏浇^對合適的熄求,所以大家都湊合著過了渣玲。
之前提到,在團(tuán)隊(duì)中工作弟晚,很多項(xiàng)目都輸在跟領(lǐng)導(dǎo)的關(guān)系上忘衍。自認(rèn)為對具體工作的熟知遠(yuǎn)在領(lǐng)導(dǎo)層之上,正如領(lǐng)導(dǎo)層對整體部署的熟知遠(yuǎn)在我之上一樣卿城,但是因?yàn)榉N種原因枚钓,領(lǐng)導(dǎo)層會(huì)設(shè)法干涉我接手的具體工作,這是自己不能忍受的藻雪。就這樣秘噪,在處理和上層的關(guān)系上經(jīng)常會(huì)出現(xiàn)問題,接手的工作也會(huì)因此變黃勉耀。給自己定下的底線是指煎,無論接手的是自己喜歡的還是不喜歡的工作蹋偏,無論接到的是自己喜歡的還是不喜歡的命令,如果不能強(qiáng)迫自己全心去執(zhí)行至壤、去做好威始,至少不應(yīng)該為此和上層產(chǎn)生矛盾。理想中的領(lǐng)導(dǎo)層會(huì)關(guān)注督促工作的執(zhí)行結(jié)果像街,但不會(huì)干涉具體的工作黎棠,并能滿足員工對公司資源調(diào)動(dòng)的要求。這也是很少見的镰绎。
在工作中脓斩,從個(gè)人來講,從管理者來講畴栖,從公司領(lǐng)導(dǎo)者來講随静,關(guān)注點(diǎn)是不一樣的,看問題的角度也是不一樣的吗讶。團(tuán)隊(duì)的成員燎猛、團(tuán)隊(duì)管理者和公司的領(lǐng)導(dǎo)者之間應(yīng)該學(xué)會(huì)換位思考,站在自己的位置上做事情沒問題照皆,但應(yīng)該綜合思考問題重绷,而不要僅憑一己之見。無論是領(lǐng)導(dǎo)層還是基層員工膜毁,都應(yīng)該爭取表達(dá)的權(quán)利昭卓。即便是對個(gè)人來講,沉默寡言也是非常不好的習(xí)慣爽茴,在公眾的場合下的表達(dá)描述技巧是一個(gè)人進(jìn)取過程中的必備技能变泄,這一點(diǎn)一定要記得炉旷。應(yīng)該有比較暢通的溝通渠道,不要什么事都互相藏著,私底下互相埋怨兽泄,這對公司和個(gè)人來講都是致命的蠢琳。大家應(yīng)該很清楚的認(rèn)識到拭抬,沒有哪個(gè)公司是絕對完美的吟逝,沒有哪個(gè)團(tuán)隊(duì)是絕對完美的,沒有哪個(gè)領(lǐng)導(dǎo)是絕對完美的绒怨,沒有哪個(gè)員工是絕對完美的纯赎,沒有哪個(gè)人是絕對完美的,正因?yàn)槲覀兏饔兴L南蹂,才要在一起協(xié)作犬金,各自的、不可避免的、性格上的缺點(diǎn)不應(yīng)該成為這種協(xié)作的絆腳石晚顷。
這個(gè)世界上還有一種人峰伙,性格和專業(yè)技能上的優(yōu)勢使得他們無論在什么樣的環(huán)境中都能如魚得水。有些人就是頭上長角该默,無論在什么地方都能嶄露崢嶸瞳氓。過去自己一直有一個(gè)錯(cuò)誤的認(rèn)識,覺得要想做成些事情栓袖,要么做事情的人非常優(yōu)秀匣摘,要么做事情的人遇到的環(huán)境和機(jī)會(huì)非常好,但是人中龍鳳畢竟只是極少數(shù)裹刮,大部分人都是普通人音榜,所以環(huán)境和機(jī)會(huì)對我們來講才非常重要了。也一直篤信李斯那句“人之賢不肖譬如鼠矣必指,在所自處耳囊咏!” 鼠在所居,人固擇地塔橡,所以覺得選擇對的環(huán)境要遠(yuǎn)比個(gè)人的努力重要得多,容易得多霜第。這種認(rèn)識只對了一小半葛家,選擇對的環(huán)境是很重要,但卻并不容易泌类。選擇對的環(huán)境和等待好的機(jī)會(huì)都有太多的不確定性癞谒,里面有太多的不可測因素,與之比起來刃榨,從自身下手反而會(huì)更容易些弹砚。很清楚的知道身上阻礙進(jìn)步的壞習(xí)慣,很清楚的知道性格中的弊端枢希,改掉身上的壞毛病桌吃,把自己變得更加優(yōu)秀,這些雖然也很難但卻都是可行的苞轿。比起四處亂撞似的選擇合適環(huán)境茅诱,守株待兔似的等好的機(jī)會(huì),哪個(gè)更合算搬卒?再說瑟俭,你也不可能一天換一個(gè)工作的這樣去找、去碰吧契邀,如果自身的問題不修正摆寄,到哪里去區(qū)別是不大的,因?yàn)榻^大部分單位、絕大部分團(tuán)隊(duì)都是類似的微饥,沒有這方面的問題也會(huì)有那方面的問題锐帜,什么問題都沒有的,也未必適合你畜号。清楚的認(rèn)識到這一點(diǎn)缴阎,就不要把希望寄托在四處亂撞、守株待兔這種事上了简软,而更多的關(guān)注自身蛮拔,打造自己是第一位的,選擇環(huán)境是第二位的痹升,等待機(jī)會(huì)是第三位的建炫。選擇和等待都是不確定性的,就應(yīng)該學(xué)會(huì)去把握疼蛾、去創(chuàng)造肛跌,這些并不是沖突的,是可以并行的察郁。
不過衍慎,我覺得想在職場上求得大的發(fā)展真的不是件容易的事情,必須進(jìn)入一個(gè)合適的公司的合適的部門皮钠,在這個(gè)合適的部門中找到合適的位置稳捆,然后開始積攢人品,等到天時(shí)麦轰、人心乔夯、技能、勢位都到齊了款侵,才可能有個(gè)小小的跳躍末荐。是小小的跳躍,中小型公司的規(guī)模放在那里呢新锈,你再跳能跳到什么地方甲脏?想在職場中求鍛煉是可能的,但想在職場中求發(fā)展很難壕鹉,看看周圍的人可以很清楚的明白這一點(diǎn)剃幌。如果你的心很大,就不應(yīng)該把希望寄托在職場中晾浴,應(yīng)該嘗試其它可能的渠道成就自己负乡。
文檔編寫和團(tuán)隊(duì)建設(shè)是貫穿項(xiàng)目開發(fā)流程中的每個(gè)環(huán)節(jié)的,所以做為整篇文章的總結(jié)脊凰,本章節(jié)先講了文檔和團(tuán)隊(duì)的問題抖棘,對前面的章節(jié)做一種概括茂腥。后面講了個(gè)人在團(tuán)隊(duì)、在職場的一些感悟切省,算是對過去的自己的一種沉淀和交待最岗,對未來的自己的一種啟示和鞭策。
在寫這篇文檔的過程中朝捆,一直試圖重現(xiàn)自己在項(xiàng)目開發(fā)時(shí)的狀態(tài)般渡,卻仍有點(diǎn)書不盡言、言不盡心的感覺芙盘。既精簡又深入的總結(jié)真得很難做到驯用,所以文檔有些部分比較啰嗦。
滿紙荒唐言儒老,誰解其中味蝴乔。