應(yīng)用開(kāi)發(fā)的思考
??? 一 生活燦爛,望君多珍重??? 寫(xiě)下這篇牢騷小文之前,先簡(jiǎn)略描述一番在下目前的生存狀態(tài):上班時(shí)間:基本沒(méi)事情做,在看各種自己感興趣的技術(shù),理論,寫(xiě)一些實(shí)踐的代碼,每天下午4點(diǎn),必到樓下溜達(dá)15分鐘,順便喝杯咖啡;晚上,讀書(shū),寫(xiě)程序;周末,游玩,唱K,足球.
??? 很開(kāi)心的日子,對(duì)不?
??? 美好和悲慘通常不分家.作為我們公司的軟件程序員,我體會(huì)更深.更多的時(shí)候我在出差,那時(shí)候我不可能還在這個(gè)匆忙的城市度過(guò)自己的悠閑時(shí)光.我會(huì)深入祖國(guó)大后方,老老實(shí)實(shí)的蹲在某個(gè)小城市政府部門(mén)某棟小樓的某個(gè)辦公室(有時(shí)候是機(jī)房),每天像銷售/商務(wù)人員一樣向官員了解他們需要的軟件功能,然后快速開(kāi)發(fā)部署以供他們使用,然后等待他們的詰責(zé)再要求,然后蹲回機(jī)房老老實(shí)實(shí)再改程序再部署再接受審判......循環(huán)周而復(fù)始.沒(méi)有周末,沒(méi)有閑暇,沒(méi)有陽(yáng)光,沒(méi)有足球.
??? 在一個(gè)備受對(duì)方刁難的項(xiàng)目實(shí)施過(guò)程中,我在某地過(guò)了四個(gè)月這樣的日子.連續(xù)120天啊!???
??? 所以,在沒(méi)有出差的日子(不出差也意味著我在公司會(huì)無(wú)所事事),我要盡情的享受生活!
???
??? 二
??? 這兩年大家對(duì)spring的贊美之聲一直不絕于耳,囿于工作性質(zhì)和時(shí)間,我不能太深入的實(shí)踐這個(gè)框架,去年只是買那本<j2ee development without ejb>來(lái)翻翻.Johnson 的論點(diǎn)確實(shí)深得我心,很多時(shí)候,用戶其實(shí)不需要分布式,不需要更改數(shù)據(jù)庫(kù),不需要太過(guò)笨重的事務(wù)管理...(這些對(duì)用戶來(lái)說(shuō)都是透明的),他們關(guān)心的只是軟件如何滿足他們的需要,讓他們能盡快的展開(kāi)工作.為此,我們?cè)O(shè)計(jì)的系統(tǒng)就要開(kāi)發(fā)周期短,易維護(hù),靈活易增加功能,還要足夠健壯......
??? 什么?高靈活性,高可靠性,高健壯性?不是我們一直追求的目標(biāo)么?你也許會(huì)這么反駁我.
??? 問(wèn)題是我們所鼓吹的跟我們所實(shí)際做的完全兩樣.在下早年曾對(duì)sun的pet store模型很感興趣,把相關(guān)文獻(xiàn)源碼基本看了幾遍.并以開(kāi)發(fā)人員的身份實(shí)際參與了一個(gè)應(yīng)用該模型進(jìn)行開(kāi)發(fā)的大型項(xiàng)目.該項(xiàng)目80-100人的規(guī)模,總歷時(shí)5年.我在項(xiàng)目快要接近成功的時(shí)候離開(kāi)了這個(gè)公司,回首這段開(kāi)發(fā)經(jīng)歷,不勝其苦.應(yīng)用這類模型進(jìn)行開(kāi)發(fā),根本不可能做到所謂的高靈活性,易于維護(hù)性,易于提高生產(chǎn)力.每測(cè)試一個(gè)ejb就要等待15-20分鐘啟動(dòng)ejb容器的滋味,你嘗過(guò)嗎?
??? 這段時(shí)間寫(xiě)了一些spring的代碼,很為spring的簡(jiǎn)略而驚奇.但spring就是銀彈嗎?在我正要在公司內(nèi)部寫(xiě)一系列小文鼓吹spring之前,我這么問(wèn)自己.我悲哀的回憶起,我的悲慘經(jīng)歷完全和技術(shù)無(wú)關(guān).對(duì),spring采用ioc,程序易于測(cè)試;spring包裝了rmi,很方便的完成ejb的功能;spring提供了各著名持久框架的膠水,讓ibatis,hibernate,jdo都能輕易集成到其中...
??? 但是,我們?cè)瓉?lái)的框架也不算太差啊?雖然由于前期規(guī)劃不好,代碼風(fēng)格混亂不堪,水平參差不齊,但從架構(gòu)組成,開(kāi)發(fā)周期和運(yùn)行性能而言,足以滿足用戶的實(shí)際需求了(系統(tǒng)的實(shí)際運(yùn)行也證明了這點(diǎn)).那么,問(wèn)題究竟在哪里?
???
??? 三
??? 我問(wèn)自己.問(wèn)題在于技術(shù)嗎?也許是,銷售和市場(chǎng)人員是這么抱怨的.但如果按照經(jīng)典的軟件工程過(guò)程來(lái)分析,是誰(shuí)在獲取需求?誰(shuí)在編寫(xiě)需求說(shuō)明書(shū)?回答:可能是銷售人員和項(xiàng)目經(jīng)理進(jìn)行調(diào)研進(jìn)而編寫(xiě)需求.誰(shuí)在編寫(xiě)概要設(shè)計(jì)說(shuō)明書(shū)?回答:沒(méi)有,時(shí)間很緊,來(lái)不及寫(xiě).誰(shuí)在編寫(xiě)詳細(xì)設(shè)計(jì)說(shuō)明書(shū)?回答:沒(méi)有...誰(shuí)在寫(xiě)測(cè)試報(bào)告?回答:來(lái)不及寫(xiě)...誰(shuí)負(fù)責(zé)部署,反饋信息?回答:具體到每個(gè)程序員......
??? 別笑我.你也許認(rèn)為,像我目前公司的這種情況,是很極端的例子,不可能公司不寫(xiě)任何文檔,不進(jìn)行任何測(cè)試的.好的,我告訴你,我們也有文檔.我從公司服務(wù)器雜亂無(wú)章的文檔中翻出了最初的需求文檔,它的內(nèi)容證明了它是不折不扣的垃圾.我也翻出了某一兩個(gè)功能模塊的文檔(這還是我堅(jiān)持要他們寫(xiě)的),內(nèi)容和實(shí)際程序設(shè)計(jì)不止差了十萬(wàn)八千里.我找不到測(cè)試報(bào)告,也許這個(gè)系統(tǒng)真的沒(méi)有測(cè)試.就這么拿出去部署應(yīng)用了.程序員又怎能不辛苦?
??? 一句老生常談的話概括:管理問(wèn)題.這是小公司屢見(jiàn)不鮮的毛病.
???
??? 四
??? 如果說(shuō)這個(gè)例子過(guò)于極端,那么看看管理良好的公司所開(kāi)發(fā)的項(xiàng)目?前文所述應(yīng)用pet store進(jìn)行開(kāi)發(fā)的公司,是某大公司在本地的子公司(簡(jiǎn)稱S).S的項(xiàng)目開(kāi)發(fā)流程非常規(guī)范.專門(mén)的需求分析員,專門(mén)的系統(tǒng)設(shè)計(jì)師,專門(mén)的開(kāi)發(fā)人員,專門(mén)的測(cè)試小組,測(cè)試人員,測(cè)試流程.....可以說(shuō)一切資源人員配置都按照大軟件工程的標(biāo)準(zhǔn)進(jìn)行配置.結(jié)果呢?在開(kāi)發(fā)那個(gè)80 * 5 * 12 人月的項(xiàng)目中,眾人一樣累得死去活來(lái),晚上加班到12點(diǎn)是常有的事.
??? <人月神話>強(qiáng)調(diào)了一個(gè)問(wèn)題:開(kāi)發(fā)人員之間的交流成本非常昂貴.<人件>旗幟鮮明的論證(或憧憬):在軟件開(kāi)發(fā)中,人是最重要的.然而這兩本書(shū)我認(rèn)為理論性過(guò)強(qiáng)了,似乎也不符合我國(guó)的現(xiàn)實(shí).我更喜歡這本小書(shū):<軟件工藝> 它說(shuō):做軟件如打鐵,就是手藝.將系統(tǒng)交給好的程序員,他自然能做出好的軟件.好的程序員,應(yīng)該需求分析,架構(gòu)設(shè)計(jì),編碼各方面都有很深的造詣.... 這本小書(shū)真讓我愛(ài)不釋手.
??? 我想,即使有銀彈,槍法不同的人使用,恐怕效果也不一樣.最好的小說(shuō),通常都反映了人本性最深邃的一面.同樣,要設(shè)計(jì)最好的程序,必須要由最好的程序員來(lái)進(jìn)行.這里程序員的范疇很廣,在我的概念里,是把需求分析師,架構(gòu)師,開(kāi)發(fā)人員,測(cè)試人員都包含進(jìn)去的.
??? 一個(gè)好的程序員應(yīng)該善于與人溝通交流,邏輯思維能力要強(qiáng).有一定的文史哲基礎(chǔ),能將枯燥的事物用形象的比喻介紹給用戶.有一定的文筆,能簡(jiǎn)潔流暢的編寫(xiě)需求分析書(shū).
??? 一個(gè)好的程序員應(yīng)該精通系統(tǒng)架構(gòu).在了解需求之后能迅速將抽象的需求實(shí)際轉(zhuǎn)換為相對(duì)具體的東西(如程序原型,uml用例圖,甚至一些能說(shuō)明情況的草圖),以充當(dāng)需求和程序架構(gòu)的橋梁.用戶根據(jù)這些成果表達(dá)/修改他們的需求,設(shè)計(jì)師根據(jù)這些成果進(jìn)行框架的設(shè)計(jì).
??? 一個(gè)好的程序員應(yīng)該精通各種框架技術(shù),熟悉相應(yīng)數(shù)據(jù)庫(kù)(指應(yīng)用開(kāi)發(fā)而言),這樣他才能有選擇,有比較的確定用戶的功能如何做,如何做得好.
??? 一個(gè)好的程序員應(yīng)該有一定的編碼水平.起碼不能寫(xiě)出太離譜的代碼.
??? 一個(gè)好的程序員還要懂得如何去測(cè)試,如何發(fā)現(xiàn)系統(tǒng)漏洞,甚至如何去攻擊之.
??? ......
???
??? 我的水平也就到這里了,其他的我寫(xiě)不出.雖然不能孤立的撇開(kāi)管理談技術(shù),但我覺(jué)得,假如一群好的程序員能夠做到了自己的最好,最后卻在公司窩囊的領(lǐng)導(dǎo)下搞砸了一個(gè)項(xiàng)目,那他們也足以問(wèn)心無(wú)愧.
???
??? 五
??? 以下一系列小文是我在公司的無(wú)聊之作.剛開(kāi)始我為了實(shí)際應(yīng)用spring做了個(gè)小小的源碼缺陷跟蹤系統(tǒng)(Bug Tracking System),后來(lái)我發(fā)現(xiàn)這個(gè)程序雖然寫(xiě)出來(lái)了,但我根本無(wú)從評(píng)估它是否易用,是否易維護(hù),是否符合別人的使用準(zhǔn)則.我不得不啟動(dòng)界面讓別人實(shí)際的看程序,最后獲得"哦,這東西不適合我使用"的評(píng)價(jià).老實(shí)說(shuō)花了這么多時(shí)間獲得這樣的評(píng)價(jià)真讓人沮喪.于是我想寫(xiě)幾篇需求和設(shè)計(jì)文檔,以使我和別人易于溝通,易于交流,而不用每次都要實(shí)際的啟動(dòng)程序.
??? 原來(lái),在經(jīng)歷整年的出差/開(kāi)發(fā)/部署生涯中,我極端懷疑文檔的意義.我想不可能在環(huán)境很緊迫的時(shí)候能做到一邊更改代碼一邊更改文檔.但我現(xiàn)在意識(shí)到,這是自己的認(rèn)識(shí)偏差所導(dǎo)致,假如不把文檔作為程序開(kāi)發(fā)的約束,而作為需求溝通,設(shè)計(jì)思想交流的橋梁,恐怕它的意義會(huì)大大提高.
??? 我很喜歡<理想國(guó)>,于是把下列小文盡量寫(xiě)成對(duì)話的形式.并且借用了司馬相如作品的主人公,力求寫(xiě)得生動(dòng)有趣.
??? 我想和你交流的想法如下:
???
??? 1)需求分析師如何和用戶聊天以提煉需求.真實(shí)模擬國(guó)內(nèi)調(diào)研時(shí)間短,需求難以明確的特點(diǎn),并盡量少的在獲取需求過(guò)程中使用計(jì)算機(jī)術(shù)語(yǔ).
??? 2)系統(tǒng)設(shè)計(jì)師如何和需求分析師分析需求,編寫(xiě)需求說(shuō)明書(shū).
??? 3)系統(tǒng)設(shè)計(jì)師如何根據(jù)需求說(shuō)明書(shū)撰寫(xiě)概要設(shè)計(jì),確立程序開(kāi)發(fā)所采用的框架.
??? 4)實(shí)際開(kāi)發(fā)的過(guò)程
??? 5)測(cè)試(也許會(huì)省略,^_^)
??? 6)其他......
???
??? 希望大家不吝賜教,我正在急需反省的時(shí)期,呵呵.謝了!
???
posted on 2007-03-28 18:02 Diego 閱讀(1711) 評(píng)論(3) 編輯 收藏