如何取得好的软件设计
生活随笔
收集整理的這篇文章主要介紹了
如何取得好的软件设计
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
[轉(zhuǎn)貼] 段先德 ?2006-5-20
似乎作為一個(gè)軟件開發(fā)者,就注定要背著沉重的行囊,穿行在茂密的熱帶叢林里,酷熱,沒有風(fēng),只有腐爛的植被、濃濃的瘴氣、不時(shí)從肩膀上爬過的毒蜘蛛和從腳背上“嗖”地竄過的毒蛇。汗流浹背,疲憊不堪,卻不能休息片刻——因?yàn)檫@是一個(gè)軟件開發(fā)的混亂的時(shí)代!
充分的前期需求分析?嚴(yán)格的開發(fā)流程控制?嚴(yán)密的后期測試?這些都做到了啊,可是為什么軟件還是有bug?特別是用戶頻繁地提出新的要求,軟件要不斷地修改,每一次修改都膽戰(zhàn)心驚幾近崩潰,這到底是為什么?神啊,到底要怎么做才能獲得好的軟件設(shè)計(jì)啊?
人們一直都沒有停止思考如何能夠獲得好的軟件設(shè)計(jì)。軟件工程風(fēng)行了幾十年,“沒有銀彈”的咒語還沒有解除。人們不禁要拋棄所有的“軟件工程”帶來的規(guī)制,回到軟件開發(fā)的源頭尋找答案。如下就是筆者看到的火燒云的形狀,像貓像虎任憑端詳。
1、要有技藝高超的開發(fā)者
軟件是人的思維活動(dòng)的產(chǎn)物,軟件開發(fā)首先需要的是人的創(chuàng)造性。就如同其他一切人類創(chuàng)作一樣,人是占據(jù)核心地位的。恐怕再過一百年,也沒有哪個(gè)自動(dòng)化的工序可以代替金庸先生的妙筆寫出《笑傲江湖》這樣經(jīng)典的小說。所以,當(dāng)前軟件工程企圖用其眼花繚亂的流程控制來達(dá)到“軟件工廠”的目的,是方向性的錯(cuò)誤。人,只有人,技藝高超的開發(fā)者,才是產(chǎn)生好的軟件設(shè)計(jì)的核心因素。
技藝高超的開發(fā)者,應(yīng)當(dāng)有豐富的軟件開發(fā)經(jīng)驗(yàn)。有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)培養(yǎng)出對(duì)軟件設(shè)計(jì)中的各種“壞味道”的敏銳的嗅覺,才能熟練地繞過軟件設(shè)計(jì)中的種種陷阱;有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)對(duì)各種軟件體系結(jié)構(gòu)模式爛熟于胸,才能運(yùn)用成熟的設(shè)計(jì)模式解決那些普遍的設(shè)計(jì)問題;有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)對(duì)各種語言、工具的特長和限制了如指掌,才能選擇針對(duì)當(dāng)前問題的最合適的編程語言和設(shè)計(jì)工具;有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)對(duì)各種平臺(tái)和環(huán)境的特性和差異有所了解,才能在設(shè)計(jì)的過程中最大程度地利用平臺(tái)和環(huán)境的特性,并可充分考慮到程序的可移植性。
技藝高超的開發(fā)者,應(yīng)當(dāng)有專業(yè)的領(lǐng)域知識(shí)。軟件總是服務(wù)于某一領(lǐng)域的應(yīng)用,各個(gè)領(lǐng)域的專業(yè)特性不同,使得軟件開發(fā)也產(chǎn)生了許多分支。從事某一專業(yè)領(lǐng)域的軟件開發(fā),必然要對(duì)該領(lǐng)域的專業(yè)知識(shí)有深入的了解,才能在軟件設(shè)計(jì)中正確地把握對(duì)概念的抽象。隨著軟件的復(fù)雜性的轉(zhuǎn)移,領(lǐng)域建模越來越受到重視。在此強(qiáng)烈推薦《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)——軟件核心復(fù)雜性應(yīng)對(duì)之道》(Eric Evans著,陳大峰等譯,清華大學(xué)出版社出版)一書。
技藝高超的開發(fā)者,應(yīng)當(dāng)有求真務(wù)實(shí)的技術(shù)作風(fēng)。在這個(gè)浮躁、虛華、官僚化的社會(huì)里,“求真務(wù)實(shí)”顯得太可貴!這也是對(duì)開發(fā)者提出的很高的要求。求真務(wù)實(shí)的技術(shù)作風(fēng),就要求開發(fā)者不要盲從技術(shù)風(fēng)潮,軟件開發(fā)的技術(shù)發(fā)展飛快,也產(chǎn)生了不同技術(shù)流派,各個(gè)流派都想擴(kuò)大自己的影響,這時(shí)候就需要開發(fā)者自己去識(shí)破各種幌子,吸收真正對(duì)軟件開發(fā)有所助益的好方法;求真務(wù)實(shí)的技術(shù)作風(fēng),還要求開發(fā)者實(shí)事求是地看待各種非技術(shù)機(jī)制對(duì)軟件開發(fā)的影響,看看這些機(jī)制是否對(duì)軟件設(shè)計(jì)質(zhì)量的提高有幫助,有則批判地采納,無則無情地拋棄,不要抱有“這個(gè)流程是某某認(rèn)證所必須的,且其他很多公司都這樣做了,所以它一定有它的道理”的想法,這些目前看不到好處的東西,不要指望將來給你帶來什么好處;求真務(wù)實(shí)的技術(shù)作風(fēng),更要求開發(fā)者拋棄官僚主義作風(fēng)和自大的姿態(tài),在技術(shù)面前人人平等,以開闊的胸襟對(duì)待不同技術(shù)觀點(diǎn)和反對(duì)者,友好地同其他人合作,以把軟件設(shè)計(jì)做好為要旨。
技藝高超的開發(fā)者的成長需要長期的磨練,代價(jià)很大。且人的因素確實(shí)是一個(gè)很不確定(流動(dòng)性很大)的因素,軟件工程減少不確定因素的初衷是好的,但是人的地位畢竟不可替代。“軟件藍(lán)領(lǐng)”是又一個(gè)軟件工程產(chǎn)生的畸形兒,軟件工程宣稱,只要幾個(gè)月的短期訓(xùn)練,就可以勝任軟件開發(fā)的工作。真是可悲!
2、要有合理的軟件過程
軟件開發(fā)早已不是單兵作戰(zhàn),而是一項(xiàng)有組織的集體活動(dòng),但是跟修水庫和建筑施工等“工程活動(dòng)”不同,軟件開發(fā)需要集中團(tuán)隊(duì)中每個(gè)人的智慧。軟件開發(fā)的過程中,最終要達(dá)到的目標(biāo)在最初往往并不十分清楚,所以需要不斷地去探索。軟件開發(fā)的核心復(fù)雜性在于對(duì)應(yīng)用領(lǐng)域的抽象與建模,很多時(shí)候,軟件開發(fā)也是一個(gè)建立模型、驗(yàn)證模型、改進(jìn)模型的一個(gè)不斷迭代的過程,所以一個(gè)合理的軟件過程至關(guān)重要。
一個(gè)合理的軟件過程,應(yīng)該能獲取準(zhǔn)確的需求。軟件需求據(jù)行業(yè)領(lǐng)域和客戶的要求不同而差異很大,沒有一個(gè)通行的模板可以套用,那么就需要對(duì)行業(yè)領(lǐng)域的充分研究以及與客戶的充分溝通來獲取到真實(shí)的需求。客戶把自己的需求表達(dá)清楚本身就是一件困難的事,開發(fā)者理解用戶的表達(dá)又增添了困難,語言會(huì)產(chǎn)生偏差,我們注重點(diǎn)的不同也會(huì)產(chǎn)生偏差所以往往我們“按照”客戶的需求做出來的東西并不是客戶真正想要的東西。再者,很多用戶的需求隨著時(shí)勢的變化會(huì)發(fā)生改變,這都是很正常的。因此,我們不能“苛求”一開始就能全盤獲得準(zhǔn)確的需求,要想獲得準(zhǔn)確的需求,就要保持一直與客戶的溝通,允許在我們的開發(fā)的過程中客戶提出變化,隨時(shí)表達(dá)和強(qiáng)調(diào)他們真正想要的“軟件”,只有這樣,我們的開發(fā)才不會(huì)偏離客戶的初衷,一切設(shè)計(jì)才有意義。
因此,合理的軟件過程應(yīng)該將客戶需求的表達(dá)穿插在軟件過程的全部環(huán)節(jié)中,而不是指望在開始設(shè)計(jì)之前跟客戶訂好需求的“契約”就以為萬事大吉。
一個(gè)合理的軟件過程,應(yīng)該快速的反饋軟件構(gòu)思。軟件設(shè)計(jì)是開發(fā)者思維活動(dòng)的產(chǎn)物,這種思維是建立在領(lǐng)域建模和軟件構(gòu)建的基礎(chǔ)上的。建模的過程中,需要開發(fā)者極大地發(fā)揮自主性和創(chuàng)造性,不同的人,在不同的知識(shí)背景下思考的方式會(huì)不一樣,所以設(shè)計(jì)過程迫切需要驗(yàn)證當(dāng)前的思路是否正確,需要一些反饋信息來證明當(dāng)前的模型是準(zhǔn)確地滿足了某一需求。并且,構(gòu)思是一個(gè)不確定、不嚴(yán)密的腦力活動(dòng),對(duì)開發(fā)者的經(jīng)驗(yàn)有很強(qiáng)的依賴性,而經(jīng)驗(yàn)的運(yùn)用往往會(huì)產(chǎn)生不知不覺的錯(cuò)誤或疏漏,所以需要及時(shí)的反饋來驗(yàn)證構(gòu)思的正確性,從而避免“錯(cuò)之毫厘,謬以千里”。
快速的反饋是保證設(shè)計(jì)構(gòu)思不會(huì)“離題”的必要手段,所以合理的軟件過程需要提供一個(gè)快速反饋的機(jī)制,而不是一味地想象,直到如夢(mèng)初醒。
一個(gè)合理的軟件過程,應(yīng)該保障團(tuán)隊(duì)成員的溝通順暢。團(tuán)隊(duì)成員合作開發(fā),共同完成一個(gè)軟件系統(tǒng),成員各自的思路之間是有“縫隙”的,要將每個(gè)人的設(shè)計(jì)聯(lián)結(jié)成一個(gè)整體的設(shè)計(jì),就需要充分的溝通來填補(bǔ)這些“縫隙”只有充分的溝通,才能保證各個(gè)成員各自完成的部分組合起來的協(xié)調(diào)性,才能避免牛頭對(duì)個(gè)馬嘴。Brooks在其《人月神話》中曾描述過一種情況:往一個(gè)效率低下的軟件開發(fā)團(tuán)隊(duì)中增加人員,不但不能提升其開發(fā)效率,反而會(huì)降低其開發(fā)效率。這說明團(tuán)隊(duì)成員越少越好,同時(shí)也說明團(tuán)隊(duì)成員之間溝通的時(shí)間耗費(fèi)是巨大的。團(tuán)隊(duì)成員交流的主要是對(duì)系統(tǒng)的理解和自己對(duì)模塊接口的劃分,因此需要的是直接的“對(duì)話”,是隨時(shí)展開的是“辯論”,是立竿見影的對(duì)設(shè)計(jì)者思路的沖擊,這樣才高效。而多余的文檔、圖表、流程或任何其他形式的溝通媒介,不僅耗費(fèi)了開發(fā)者寶貴的時(shí)間,更可能引起傳遞“信號(hào)”的失真,帶來歧義。
一個(gè)合理的軟件過程,應(yīng)該提倡“Work smart, not just hard.”(筆者借用這種說法,其本義可以參考http://www.jorydesjardins.com/pause/2006/05/what_does_that__1.html),軟件設(shè)計(jì)是一項(xiàng)智力勞動(dòng),其核心成果來自開發(fā)者發(fā)揮自己的聰明才智和創(chuàng)造性。(google就是一個(gè)很好的例子。)開發(fā)者的創(chuàng)造性來自對(duì)行業(yè)領(lǐng)域的鉆研和領(lǐng)域以外的借鑒,所以,開發(fā)者應(yīng)當(dāng)有豐富的領(lǐng)域外的知識(shí)的涉獵,在行業(yè)領(lǐng)域之外也有多姿多彩的閱歷和思考素材,發(fā)展自己的個(gè)性。這樣思路才不會(huì)呆板,思維才更活躍。
合理的軟件過程,應(yīng)該給開發(fā)者營造一個(gè)輕松的工作氛圍,允許開發(fā)者的個(gè)性化,才能讓開發(fā)者身心愉悅地投入到軟件設(shè)計(jì)的虛空間中去,激發(fā)設(shè)計(jì)創(chuàng)意。
回頭審視一下傳統(tǒng)的“軟件工程”過程。在軟件工程中,十分強(qiáng)調(diào)“流程”和紀(jì)律,追求軟件過程越是“自動(dòng)化”越好。希望需求是被穩(wěn)固下來,事先就做好,可以作為“原料”輸入到一連貫相互獨(dú)立“工序”中,通過控制開發(fā)人員在每個(gè)工序中的作為,使得產(chǎn)品嚴(yán)格按照預(yù)先期望的模子生產(chǎn)出來;希望開發(fā)者都安分守己地努力,所有的溝通和交流最好都文檔化,以分清責(zé)任減少爭論,同時(shí)以文檔為驅(qū)動(dòng),規(guī)規(guī)矩矩按部就班地做上一個(gè)流程的文檔給自己規(guī)定好的事情。嗚嗚,正在焦油坑里掙扎的猛犸象還少么?
3、要面向代碼
再強(qiáng)調(diào)一遍:源代碼就是設(shè)計(jì)!
即使在軟件工程中,這一點(diǎn)也是不可否認(rèn)的(雖然不被承認(rèn))。很多人認(rèn)為,軟件設(shè)計(jì)是指編碼之前的“概要設(shè)計(jì)”和“詳細(xì)設(shè)計(jì)”,代碼只是“實(shí)現(xiàn)”,只是個(gè)體力活兒。但是,代碼卻是軟件設(shè)計(jì)最真實(shí)、準(zhǔn)確、有價(jià)值的表現(xiàn)。在編碼前,再好的構(gòu)思也只是“預(yù)設(shè)計(jì)”,是沒有被驗(yàn)證、沒有被認(rèn)可、沒有被賦予現(xiàn)實(shí)意義的空想。“預(yù)設(shè)計(jì)”再好也并不是設(shè)計(jì),在所謂“概要設(shè)計(jì)”和“詳細(xì)設(shè)計(jì)”階段通常不乏玲瓏的構(gòu)思,但是由于輕視了代碼(而去重視那些只是臨時(shí)使用一下的設(shè)計(jì)文檔),往往能“化神奇為腐朽”,況且沒有在代碼中被驗(yàn)證與整個(gè)系統(tǒng)的協(xié)調(diào)性的神奇構(gòu)思,又有什么值得稱道的呢?
所以,我們的設(shè)計(jì)應(yīng)該面向代碼,而不是輕視它。有什么好的設(shè)計(jì)構(gòu)思,最好趕緊在代碼上表達(dá)出來,并很快地驗(yàn)證這個(gè)構(gòu)思是正確的,是與整個(gè)系統(tǒng)相容的,而不是把很多構(gòu)思都堆積在“設(shè)計(jì)文檔”中,掩蓋了矛盾和錯(cuò)誤,并在編碼的時(shí)候把它們放大。
設(shè)計(jì)面向代碼,應(yīng)該從測試用例出發(fā)。比較好的方法是采用“測試驅(qū)動(dòng)開發(fā)”(TDD)(源自《測試驅(qū)動(dòng)開發(fā)》,Kent Beck著)的方法,直接面對(duì)需求,把需求用測試用例準(zhǔn)確地表達(dá)出來,所有的設(shè)計(jì)都從測試用例出發(fā),這樣我們的設(shè)計(jì)就能夠更貼近真實(shí)的需求,直接將需求和代碼聯(lián)系起來,減少了中間所有的不確定的環(huán)節(jié)。明確的需求都是可以測試的,編寫測試用例的過程其實(shí)是一個(gè)促使開發(fā)者對(duì)需求真正認(rèn)識(shí)的過程,這也是尋找好的軟件設(shè)計(jì)的出發(fā)點(diǎn),實(shí)在不應(yīng)該忽略或輕視。并且有了準(zhǔn)確的測試用例做保障,我們?cè)诟倪M(jìn)過程中隨時(shí)都可以驗(yàn)證所做的修改的正確性。
設(shè)計(jì)面向代碼,要求在變化中保持代碼“健康”。代碼是在開發(fā)的過程中不停地被改變的,但是隨時(shí)要保持代碼的“健康”。這種改變不是往舊墻上刷新粉,整個(gè)過程也不是“code and fix”,特別是軟件開發(fā)的后期,最好不要有顯眼的“補(bǔ)丁”,而應(yīng)該針對(duì)任何變化,最好把所做的修改或加強(qiáng)融入到現(xiàn)有的設(shè)計(jì)中,使之和諧不留痕跡。至于什么樣的代碼才是“健康”的,我想這是一個(gè)值得展開討論的話題。
設(shè)計(jì)面向代碼,切忌盲目復(fù)用。軟件開發(fā)為了提高資源利用率和開發(fā)效率,希望能夠在新的應(yīng)用中運(yùn)用已有的設(shè)計(jì)成果,最大限度地實(shí)現(xiàn)軟件復(fù)用,這種愿望可以理解,但復(fù)用一定是有條件有限度的。復(fù)用別人現(xiàn)成的代碼,天然受到別人設(shè)計(jì)的制約,要想復(fù)用,首先要充分了解別人的設(shè)計(jì),特別考察它的“通用性”,由于不是為我們的應(yīng)用定制的,所以我們的設(shè)計(jì)要遷就這種“通用性”,這種遷就是相當(dāng)有風(fēng)險(xiǎn)的,很可能使我們的設(shè)計(jì)變得僵硬。不記得哪位高人曾經(jīng)說過“復(fù)用只是神話”,我覺得是很有道理的,采用別人的代碼的當(dāng)時(shí)是省心省力,但是后期的維護(hù)似乎還有漫長的痛苦等著你。再者,應(yīng)用是有差異的,哪怕相同的應(yīng)用,削足適履而不是根據(jù)腳的尺寸去做鞋,是不可取的。
4、要重構(gòu)
不知道有沒有特別厲害的軟件設(shè)計(jì)高手,可以將好的設(shè)計(jì)一步到位地呈現(xiàn)出來?不過我想對(duì)于大多數(shù)人來說,設(shè)計(jì)并不是一蹴而就,而是循序漸進(jìn)的。最初的設(shè)計(jì)可能與最終的設(shè)計(jì)相差巨大,這是再正常不過的事情。重要的是軟件設(shè)計(jì)要朝一個(gè)好的方向演進(jìn),重構(gòu)的過程就是演進(jìn)的過程。重構(gòu)是對(duì)現(xiàn)有代碼的設(shè)計(jì)進(jìn)行優(yōu)化和改良,《重構(gòu):改善既有代碼的設(shè)計(jì)》(候捷等譯,中國電力出版社出版)一書指出了存在于代碼中的常見的22種“壞味道”,并針對(duì)性地提供了一些很中肯實(shí)用的重構(gòu)手法,很值得借鑒。其實(shí)重構(gòu)應(yīng)該是軟件開發(fā)者的一種自覺習(xí)慣,重構(gòu)手法也是經(jīng)過長期實(shí)踐經(jīng)驗(yàn)已經(jīng)潛移默化了的。
最初的設(shè)計(jì)總是丑陋的,重構(gòu)是使“丑小鴨”變“白天鵝”的必要手段。哪怕再巧妙的構(gòu)思,也會(huì)有制肘,哪怕再謹(jǐn)慎的防備,也會(huì)有疏漏,所以設(shè)計(jì)的雛形總會(huì)有這樣那樣的不足,或多或少地脫離現(xiàn)實(shí)問題。這些不足的地方都是可以改進(jìn)的,關(guān)鍵是有意識(shí)地去尋找出這些不足,并糾正它們。因此,我們可以為了更緊密地貼合需求,放心地讓我們最初的設(shè)計(jì)粗糙一些,我們總可以用重構(gòu)的方法改造它。
好的設(shè)計(jì)是不斷地重構(gòu)才顯露出來的。設(shè)計(jì)應(yīng)當(dāng)是從需求出發(fā),做出一些“粗糙”的解決問題的方案,然后根據(jù)經(jīng)驗(yàn)對(duì)該方案不斷進(jìn)行改進(jìn)、完善,使其越來越靈活,越來越趨于穩(wěn)定,得到的,自然就是好的設(shè)計(jì)。而不是從經(jīng)驗(yàn)出發(fā),先想象出一些“玲瓏”的構(gòu)思,然后修修補(bǔ)補(bǔ),使其符合我們的需求。前一種方式是借鑒經(jīng)驗(yàn),后一種方式是強(qiáng)求經(jīng)驗(yàn);前一種方式是慢慢演化水到渠成,后一種方式是急于求成生拉硬拽;前一種方式靈活,有更進(jìn)一步優(yōu)化的空間,后一種方式呆板,越修補(bǔ)越走樣。優(yōu)劣自現(xiàn)。
設(shè)計(jì)過程中要“兩頂帽子”輪流戴。“兩頂帽子”是Kent Beck為了形象地描述重構(gòu)過程中的兩項(xiàng)任務(wù)而引入一種比方。一頂帽子是改善現(xiàn)有設(shè)計(jì),另一定帽子是增加新功能。提醒我們,任何時(shí)候應(yīng)該只做一件事(除非你喜歡把兩頂帽子摞起來戴):改善現(xiàn)有設(shè)計(jì)的時(shí)候,就立足于現(xiàn)有設(shè)計(jì),用現(xiàn)有的測試用例可以很方便地驗(yàn)證改善的正確性;在增加新功能的時(shí)候(容納一種新的需求),就充分信任現(xiàn)有代碼的正確性,而立足于該功能,關(guān)注在新增功能的測試用例上以保證測試用例的正確,同時(shí)修改或增加代碼使得所有測試用例(包括新增的)通過。如果覺得新增了功能設(shè)計(jì)被污染了,別急,測試用例通過后可以換戴另一頂帽子。
5、要新陳代謝
軟件設(shè)計(jì)不是一勞永逸的,技術(shù)更新很快,軟件設(shè)計(jì)要為應(yīng)用服務(wù),就要適應(yīng)新的技術(shù)條件,新陳代謝。軟件設(shè)計(jì)本身要有開放、靈活的架構(gòu),而開發(fā)者也要有與時(shí)俱進(jìn)、開拓創(chuàng)新的精神。
軟件設(shè)計(jì)要吸納需求的變化,不斷適應(yīng)新的環(huán)境。軟件是服務(wù)于應(yīng)用的,應(yīng)用的背景發(fā)生了變化,軟件必然要跟著變化,所以好的軟件設(shè)計(jì)要有在變化中存活和發(fā)展的生命力,這就要求軟件本身的架構(gòu)是開放、靈活的。軟件架構(gòu)是在軟件在開發(fā)的過程中,不斷納入新的需求,軟件設(shè)計(jì)自身不斷地進(jìn)行調(diào)整,到最后穩(wěn)定下來的部分。所以軟件架構(gòu)是在需求不斷變化的打磨下進(jìn)化而來的,是軟件設(shè)計(jì)的骨架。只有來自于實(shí)際應(yīng)用的動(dòng)態(tài)的軟件架構(gòu),才方便改變自己以適應(yīng)應(yīng)用環(huán)境的改變。
開發(fā)者要不斷學(xué)習(xí),提升自己的眼界。軟件應(yīng)用的領(lǐng)域范圍廣泛,軟件技術(shù)的發(fā)展也朝不同的方向在不斷地提升;軟件開發(fā)的本質(zhì)規(guī)律還沒有完全大白于世,軟件業(yè)界存在著眾多的思想流派,不同流派正對(duì)一些技術(shù)方法會(huì)有一些爭議。而開發(fā)者往往只能集中精力于某一特定的方向,而對(duì)其他方向的發(fā)展比較生疏;或者開發(fā)者只信奉一個(gè)思想流派,對(duì)其他不同的意見不屑一顧——這些都是眼界受局限的表現(xiàn)。開發(fā)者應(yīng)當(dāng)了解其他領(lǐng)域的一些基本情況,其他流派的一些基本主張,這有益于反思自己開發(fā)中的一些困惑,啟發(fā)自己的思路。
開發(fā)者還要保持開放的心態(tài),要革故鼎新。好的軟件設(shè)計(jì),要經(jīng)受住時(shí)代變遷的考驗(yàn)和用戶的挑剔。所以設(shè)計(jì)者要有開放的心態(tài),虛心接受用戶的批評(píng)和建議,并積極改進(jìn)軟件的設(shè)計(jì)以滿足用戶的要求。特別是對(duì)于新的有用的技術(shù)元素(如新的軟件架構(gòu)理念、新的網(wǎng)絡(luò)技術(shù)、新的數(shù)據(jù)庫技術(shù)、新興的編程語言等),要有一定的敏感度,要從中吸取積極的啟發(fā),來加強(qiáng)軟件設(shè)計(jì)的技術(shù)跟進(jìn)。對(duì)于一些不合時(shí)宜的設(shè)計(jì),要更新?lián)Q代,始終保持軟件設(shè)計(jì)與時(shí)代同步。
開發(fā)者還要有一點(diǎn)完美主義情節(jié)。軟件設(shè)計(jì)是軟件開發(fā)者心血的結(jié)晶,是開發(fā)者思想的表白,所以開發(fā)者往往對(duì)自己成功的作品愛不釋手。就像母親總覺得自己的孩子最棒一樣,開發(fā)者會(huì)覺得自己的設(shè)計(jì)是最好的。應(yīng)該對(duì)那些傾心盡力做出軟件設(shè)計(jì)的開發(fā)者致以崇高的敬意!但是也有必要提醒他們,要理性客觀地對(duì)待自己作品的不足,還有不完美的地方。這些話,特別需要善意地對(duì)那些對(duì)現(xiàn)在的“設(shè)計(jì)”自我感覺良好的人說。相當(dāng)多的開發(fā)者,長期在設(shè)計(jì)的荒原,已經(jīng)習(xí)慣了在蕭瑟的秋風(fēng)和飛砂走石中緝拿隱藏在荊棘中的bug,還從來沒有想象過軟件設(shè)計(jì)其實(shí)可以做得更好,沒奢望過還有鳥語花香的春天。該醒醒了,不要安于在黑暗的屋子里窒息的命運(yùn)!
似乎作為一個(gè)軟件開發(fā)者,就注定要背著沉重的行囊,穿行在茂密的熱帶叢林里,酷熱,沒有風(fēng),只有腐爛的植被、濃濃的瘴氣、不時(shí)從肩膀上爬過的毒蜘蛛和從腳背上“嗖”地竄過的毒蛇。汗流浹背,疲憊不堪,卻不能休息片刻——因?yàn)檫@是一個(gè)軟件開發(fā)的混亂的時(shí)代!
充分的前期需求分析?嚴(yán)格的開發(fā)流程控制?嚴(yán)密的后期測試?這些都做到了啊,可是為什么軟件還是有bug?特別是用戶頻繁地提出新的要求,軟件要不斷地修改,每一次修改都膽戰(zhàn)心驚幾近崩潰,這到底是為什么?神啊,到底要怎么做才能獲得好的軟件設(shè)計(jì)啊?
人們一直都沒有停止思考如何能夠獲得好的軟件設(shè)計(jì)。軟件工程風(fēng)行了幾十年,“沒有銀彈”的咒語還沒有解除。人們不禁要拋棄所有的“軟件工程”帶來的規(guī)制,回到軟件開發(fā)的源頭尋找答案。如下就是筆者看到的火燒云的形狀,像貓像虎任憑端詳。
1、要有技藝高超的開發(fā)者
軟件是人的思維活動(dòng)的產(chǎn)物,軟件開發(fā)首先需要的是人的創(chuàng)造性。就如同其他一切人類創(chuàng)作一樣,人是占據(jù)核心地位的。恐怕再過一百年,也沒有哪個(gè)自動(dòng)化的工序可以代替金庸先生的妙筆寫出《笑傲江湖》這樣經(jīng)典的小說。所以,當(dāng)前軟件工程企圖用其眼花繚亂的流程控制來達(dá)到“軟件工廠”的目的,是方向性的錯(cuò)誤。人,只有人,技藝高超的開發(fā)者,才是產(chǎn)生好的軟件設(shè)計(jì)的核心因素。
技藝高超的開發(fā)者,應(yīng)當(dāng)有豐富的軟件開發(fā)經(jīng)驗(yàn)。有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)培養(yǎng)出對(duì)軟件設(shè)計(jì)中的各種“壞味道”的敏銳的嗅覺,才能熟練地繞過軟件設(shè)計(jì)中的種種陷阱;有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)對(duì)各種軟件體系結(jié)構(gòu)模式爛熟于胸,才能運(yùn)用成熟的設(shè)計(jì)模式解決那些普遍的設(shè)計(jì)問題;有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)對(duì)各種語言、工具的特長和限制了如指掌,才能選擇針對(duì)當(dāng)前問題的最合適的編程語言和設(shè)計(jì)工具;有了豐富的軟件開發(fā)經(jīng)驗(yàn),才會(huì)對(duì)各種平臺(tái)和環(huán)境的特性和差異有所了解,才能在設(shè)計(jì)的過程中最大程度地利用平臺(tái)和環(huán)境的特性,并可充分考慮到程序的可移植性。
技藝高超的開發(fā)者,應(yīng)當(dāng)有專業(yè)的領(lǐng)域知識(shí)。軟件總是服務(wù)于某一領(lǐng)域的應(yīng)用,各個(gè)領(lǐng)域的專業(yè)特性不同,使得軟件開發(fā)也產(chǎn)生了許多分支。從事某一專業(yè)領(lǐng)域的軟件開發(fā),必然要對(duì)該領(lǐng)域的專業(yè)知識(shí)有深入的了解,才能在軟件設(shè)計(jì)中正確地把握對(duì)概念的抽象。隨著軟件的復(fù)雜性的轉(zhuǎn)移,領(lǐng)域建模越來越受到重視。在此強(qiáng)烈推薦《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)——軟件核心復(fù)雜性應(yīng)對(duì)之道》(Eric Evans著,陳大峰等譯,清華大學(xué)出版社出版)一書。
技藝高超的開發(fā)者,應(yīng)當(dāng)有求真務(wù)實(shí)的技術(shù)作風(fēng)。在這個(gè)浮躁、虛華、官僚化的社會(huì)里,“求真務(wù)實(shí)”顯得太可貴!這也是對(duì)開發(fā)者提出的很高的要求。求真務(wù)實(shí)的技術(shù)作風(fēng),就要求開發(fā)者不要盲從技術(shù)風(fēng)潮,軟件開發(fā)的技術(shù)發(fā)展飛快,也產(chǎn)生了不同技術(shù)流派,各個(gè)流派都想擴(kuò)大自己的影響,這時(shí)候就需要開發(fā)者自己去識(shí)破各種幌子,吸收真正對(duì)軟件開發(fā)有所助益的好方法;求真務(wù)實(shí)的技術(shù)作風(fēng),還要求開發(fā)者實(shí)事求是地看待各種非技術(shù)機(jī)制對(duì)軟件開發(fā)的影響,看看這些機(jī)制是否對(duì)軟件設(shè)計(jì)質(zhì)量的提高有幫助,有則批判地采納,無則無情地拋棄,不要抱有“這個(gè)流程是某某認(rèn)證所必須的,且其他很多公司都這樣做了,所以它一定有它的道理”的想法,這些目前看不到好處的東西,不要指望將來給你帶來什么好處;求真務(wù)實(shí)的技術(shù)作風(fēng),更要求開發(fā)者拋棄官僚主義作風(fēng)和自大的姿態(tài),在技術(shù)面前人人平等,以開闊的胸襟對(duì)待不同技術(shù)觀點(diǎn)和反對(duì)者,友好地同其他人合作,以把軟件設(shè)計(jì)做好為要旨。
技藝高超的開發(fā)者的成長需要長期的磨練,代價(jià)很大。且人的因素確實(shí)是一個(gè)很不確定(流動(dòng)性很大)的因素,軟件工程減少不確定因素的初衷是好的,但是人的地位畢竟不可替代。“軟件藍(lán)領(lǐng)”是又一個(gè)軟件工程產(chǎn)生的畸形兒,軟件工程宣稱,只要幾個(gè)月的短期訓(xùn)練,就可以勝任軟件開發(fā)的工作。真是可悲!
2、要有合理的軟件過程
軟件開發(fā)早已不是單兵作戰(zhàn),而是一項(xiàng)有組織的集體活動(dòng),但是跟修水庫和建筑施工等“工程活動(dòng)”不同,軟件開發(fā)需要集中團(tuán)隊(duì)中每個(gè)人的智慧。軟件開發(fā)的過程中,最終要達(dá)到的目標(biāo)在最初往往并不十分清楚,所以需要不斷地去探索。軟件開發(fā)的核心復(fù)雜性在于對(duì)應(yīng)用領(lǐng)域的抽象與建模,很多時(shí)候,軟件開發(fā)也是一個(gè)建立模型、驗(yàn)證模型、改進(jìn)模型的一個(gè)不斷迭代的過程,所以一個(gè)合理的軟件過程至關(guān)重要。
一個(gè)合理的軟件過程,應(yīng)該能獲取準(zhǔn)確的需求。軟件需求據(jù)行業(yè)領(lǐng)域和客戶的要求不同而差異很大,沒有一個(gè)通行的模板可以套用,那么就需要對(duì)行業(yè)領(lǐng)域的充分研究以及與客戶的充分溝通來獲取到真實(shí)的需求。客戶把自己的需求表達(dá)清楚本身就是一件困難的事,開發(fā)者理解用戶的表達(dá)又增添了困難,語言會(huì)產(chǎn)生偏差,我們注重點(diǎn)的不同也會(huì)產(chǎn)生偏差所以往往我們“按照”客戶的需求做出來的東西并不是客戶真正想要的東西。再者,很多用戶的需求隨著時(shí)勢的變化會(huì)發(fā)生改變,這都是很正常的。因此,我們不能“苛求”一開始就能全盤獲得準(zhǔn)確的需求,要想獲得準(zhǔn)確的需求,就要保持一直與客戶的溝通,允許在我們的開發(fā)的過程中客戶提出變化,隨時(shí)表達(dá)和強(qiáng)調(diào)他們真正想要的“軟件”,只有這樣,我們的開發(fā)才不會(huì)偏離客戶的初衷,一切設(shè)計(jì)才有意義。
因此,合理的軟件過程應(yīng)該將客戶需求的表達(dá)穿插在軟件過程的全部環(huán)節(jié)中,而不是指望在開始設(shè)計(jì)之前跟客戶訂好需求的“契約”就以為萬事大吉。
一個(gè)合理的軟件過程,應(yīng)該快速的反饋軟件構(gòu)思。軟件設(shè)計(jì)是開發(fā)者思維活動(dòng)的產(chǎn)物,這種思維是建立在領(lǐng)域建模和軟件構(gòu)建的基礎(chǔ)上的。建模的過程中,需要開發(fā)者極大地發(fā)揮自主性和創(chuàng)造性,不同的人,在不同的知識(shí)背景下思考的方式會(huì)不一樣,所以設(shè)計(jì)過程迫切需要驗(yàn)證當(dāng)前的思路是否正確,需要一些反饋信息來證明當(dāng)前的模型是準(zhǔn)確地滿足了某一需求。并且,構(gòu)思是一個(gè)不確定、不嚴(yán)密的腦力活動(dòng),對(duì)開發(fā)者的經(jīng)驗(yàn)有很強(qiáng)的依賴性,而經(jīng)驗(yàn)的運(yùn)用往往會(huì)產(chǎn)生不知不覺的錯(cuò)誤或疏漏,所以需要及時(shí)的反饋來驗(yàn)證構(gòu)思的正確性,從而避免“錯(cuò)之毫厘,謬以千里”。
快速的反饋是保證設(shè)計(jì)構(gòu)思不會(huì)“離題”的必要手段,所以合理的軟件過程需要提供一個(gè)快速反饋的機(jī)制,而不是一味地想象,直到如夢(mèng)初醒。
一個(gè)合理的軟件過程,應(yīng)該保障團(tuán)隊(duì)成員的溝通順暢。團(tuán)隊(duì)成員合作開發(fā),共同完成一個(gè)軟件系統(tǒng),成員各自的思路之間是有“縫隙”的,要將每個(gè)人的設(shè)計(jì)聯(lián)結(jié)成一個(gè)整體的設(shè)計(jì),就需要充分的溝通來填補(bǔ)這些“縫隙”只有充分的溝通,才能保證各個(gè)成員各自完成的部分組合起來的協(xié)調(diào)性,才能避免牛頭對(duì)個(gè)馬嘴。Brooks在其《人月神話》中曾描述過一種情況:往一個(gè)效率低下的軟件開發(fā)團(tuán)隊(duì)中增加人員,不但不能提升其開發(fā)效率,反而會(huì)降低其開發(fā)效率。這說明團(tuán)隊(duì)成員越少越好,同時(shí)也說明團(tuán)隊(duì)成員之間溝通的時(shí)間耗費(fèi)是巨大的。團(tuán)隊(duì)成員交流的主要是對(duì)系統(tǒng)的理解和自己對(duì)模塊接口的劃分,因此需要的是直接的“對(duì)話”,是隨時(shí)展開的是“辯論”,是立竿見影的對(duì)設(shè)計(jì)者思路的沖擊,這樣才高效。而多余的文檔、圖表、流程或任何其他形式的溝通媒介,不僅耗費(fèi)了開發(fā)者寶貴的時(shí)間,更可能引起傳遞“信號(hào)”的失真,帶來歧義。
一個(gè)合理的軟件過程,應(yīng)該提倡“Work smart, not just hard.”(筆者借用這種說法,其本義可以參考http://www.jorydesjardins.com/pause/2006/05/what_does_that__1.html),軟件設(shè)計(jì)是一項(xiàng)智力勞動(dòng),其核心成果來自開發(fā)者發(fā)揮自己的聰明才智和創(chuàng)造性。(google就是一個(gè)很好的例子。)開發(fā)者的創(chuàng)造性來自對(duì)行業(yè)領(lǐng)域的鉆研和領(lǐng)域以外的借鑒,所以,開發(fā)者應(yīng)當(dāng)有豐富的領(lǐng)域外的知識(shí)的涉獵,在行業(yè)領(lǐng)域之外也有多姿多彩的閱歷和思考素材,發(fā)展自己的個(gè)性。這樣思路才不會(huì)呆板,思維才更活躍。
合理的軟件過程,應(yīng)該給開發(fā)者營造一個(gè)輕松的工作氛圍,允許開發(fā)者的個(gè)性化,才能讓開發(fā)者身心愉悅地投入到軟件設(shè)計(jì)的虛空間中去,激發(fā)設(shè)計(jì)創(chuàng)意。
回頭審視一下傳統(tǒng)的“軟件工程”過程。在軟件工程中,十分強(qiáng)調(diào)“流程”和紀(jì)律,追求軟件過程越是“自動(dòng)化”越好。希望需求是被穩(wěn)固下來,事先就做好,可以作為“原料”輸入到一連貫相互獨(dú)立“工序”中,通過控制開發(fā)人員在每個(gè)工序中的作為,使得產(chǎn)品嚴(yán)格按照預(yù)先期望的模子生產(chǎn)出來;希望開發(fā)者都安分守己地努力,所有的溝通和交流最好都文檔化,以分清責(zé)任減少爭論,同時(shí)以文檔為驅(qū)動(dòng),規(guī)規(guī)矩矩按部就班地做上一個(gè)流程的文檔給自己規(guī)定好的事情。嗚嗚,正在焦油坑里掙扎的猛犸象還少么?
3、要面向代碼
再強(qiáng)調(diào)一遍:源代碼就是設(shè)計(jì)!
即使在軟件工程中,這一點(diǎn)也是不可否認(rèn)的(雖然不被承認(rèn))。很多人認(rèn)為,軟件設(shè)計(jì)是指編碼之前的“概要設(shè)計(jì)”和“詳細(xì)設(shè)計(jì)”,代碼只是“實(shí)現(xiàn)”,只是個(gè)體力活兒。但是,代碼卻是軟件設(shè)計(jì)最真實(shí)、準(zhǔn)確、有價(jià)值的表現(xiàn)。在編碼前,再好的構(gòu)思也只是“預(yù)設(shè)計(jì)”,是沒有被驗(yàn)證、沒有被認(rèn)可、沒有被賦予現(xiàn)實(shí)意義的空想。“預(yù)設(shè)計(jì)”再好也并不是設(shè)計(jì),在所謂“概要設(shè)計(jì)”和“詳細(xì)設(shè)計(jì)”階段通常不乏玲瓏的構(gòu)思,但是由于輕視了代碼(而去重視那些只是臨時(shí)使用一下的設(shè)計(jì)文檔),往往能“化神奇為腐朽”,況且沒有在代碼中被驗(yàn)證與整個(gè)系統(tǒng)的協(xié)調(diào)性的神奇構(gòu)思,又有什么值得稱道的呢?
所以,我們的設(shè)計(jì)應(yīng)該面向代碼,而不是輕視它。有什么好的設(shè)計(jì)構(gòu)思,最好趕緊在代碼上表達(dá)出來,并很快地驗(yàn)證這個(gè)構(gòu)思是正確的,是與整個(gè)系統(tǒng)相容的,而不是把很多構(gòu)思都堆積在“設(shè)計(jì)文檔”中,掩蓋了矛盾和錯(cuò)誤,并在編碼的時(shí)候把它們放大。
設(shè)計(jì)面向代碼,應(yīng)該從測試用例出發(fā)。比較好的方法是采用“測試驅(qū)動(dòng)開發(fā)”(TDD)(源自《測試驅(qū)動(dòng)開發(fā)》,Kent Beck著)的方法,直接面對(duì)需求,把需求用測試用例準(zhǔn)確地表達(dá)出來,所有的設(shè)計(jì)都從測試用例出發(fā),這樣我們的設(shè)計(jì)就能夠更貼近真實(shí)的需求,直接將需求和代碼聯(lián)系起來,減少了中間所有的不確定的環(huán)節(jié)。明確的需求都是可以測試的,編寫測試用例的過程其實(shí)是一個(gè)促使開發(fā)者對(duì)需求真正認(rèn)識(shí)的過程,這也是尋找好的軟件設(shè)計(jì)的出發(fā)點(diǎn),實(shí)在不應(yīng)該忽略或輕視。并且有了準(zhǔn)確的測試用例做保障,我們?cè)诟倪M(jìn)過程中隨時(shí)都可以驗(yàn)證所做的修改的正確性。
設(shè)計(jì)面向代碼,要求在變化中保持代碼“健康”。代碼是在開發(fā)的過程中不停地被改變的,但是隨時(shí)要保持代碼的“健康”。這種改變不是往舊墻上刷新粉,整個(gè)過程也不是“code and fix”,特別是軟件開發(fā)的后期,最好不要有顯眼的“補(bǔ)丁”,而應(yīng)該針對(duì)任何變化,最好把所做的修改或加強(qiáng)融入到現(xiàn)有的設(shè)計(jì)中,使之和諧不留痕跡。至于什么樣的代碼才是“健康”的,我想這是一個(gè)值得展開討論的話題。
設(shè)計(jì)面向代碼,切忌盲目復(fù)用。軟件開發(fā)為了提高資源利用率和開發(fā)效率,希望能夠在新的應(yīng)用中運(yùn)用已有的設(shè)計(jì)成果,最大限度地實(shí)現(xiàn)軟件復(fù)用,這種愿望可以理解,但復(fù)用一定是有條件有限度的。復(fù)用別人現(xiàn)成的代碼,天然受到別人設(shè)計(jì)的制約,要想復(fù)用,首先要充分了解別人的設(shè)計(jì),特別考察它的“通用性”,由于不是為我們的應(yīng)用定制的,所以我們的設(shè)計(jì)要遷就這種“通用性”,這種遷就是相當(dāng)有風(fēng)險(xiǎn)的,很可能使我們的設(shè)計(jì)變得僵硬。不記得哪位高人曾經(jīng)說過“復(fù)用只是神話”,我覺得是很有道理的,采用別人的代碼的當(dāng)時(shí)是省心省力,但是后期的維護(hù)似乎還有漫長的痛苦等著你。再者,應(yīng)用是有差異的,哪怕相同的應(yīng)用,削足適履而不是根據(jù)腳的尺寸去做鞋,是不可取的。
4、要重構(gòu)
不知道有沒有特別厲害的軟件設(shè)計(jì)高手,可以將好的設(shè)計(jì)一步到位地呈現(xiàn)出來?不過我想對(duì)于大多數(shù)人來說,設(shè)計(jì)并不是一蹴而就,而是循序漸進(jìn)的。最初的設(shè)計(jì)可能與最終的設(shè)計(jì)相差巨大,這是再正常不過的事情。重要的是軟件設(shè)計(jì)要朝一個(gè)好的方向演進(jìn),重構(gòu)的過程就是演進(jìn)的過程。重構(gòu)是對(duì)現(xiàn)有代碼的設(shè)計(jì)進(jìn)行優(yōu)化和改良,《重構(gòu):改善既有代碼的設(shè)計(jì)》(候捷等譯,中國電力出版社出版)一書指出了存在于代碼中的常見的22種“壞味道”,并針對(duì)性地提供了一些很中肯實(shí)用的重構(gòu)手法,很值得借鑒。其實(shí)重構(gòu)應(yīng)該是軟件開發(fā)者的一種自覺習(xí)慣,重構(gòu)手法也是經(jīng)過長期實(shí)踐經(jīng)驗(yàn)已經(jīng)潛移默化了的。
最初的設(shè)計(jì)總是丑陋的,重構(gòu)是使“丑小鴨”變“白天鵝”的必要手段。哪怕再巧妙的構(gòu)思,也會(huì)有制肘,哪怕再謹(jǐn)慎的防備,也會(huì)有疏漏,所以設(shè)計(jì)的雛形總會(huì)有這樣那樣的不足,或多或少地脫離現(xiàn)實(shí)問題。這些不足的地方都是可以改進(jìn)的,關(guān)鍵是有意識(shí)地去尋找出這些不足,并糾正它們。因此,我們可以為了更緊密地貼合需求,放心地讓我們最初的設(shè)計(jì)粗糙一些,我們總可以用重構(gòu)的方法改造它。
好的設(shè)計(jì)是不斷地重構(gòu)才顯露出來的。設(shè)計(jì)應(yīng)當(dāng)是從需求出發(fā),做出一些“粗糙”的解決問題的方案,然后根據(jù)經(jīng)驗(yàn)對(duì)該方案不斷進(jìn)行改進(jìn)、完善,使其越來越靈活,越來越趨于穩(wěn)定,得到的,自然就是好的設(shè)計(jì)。而不是從經(jīng)驗(yàn)出發(fā),先想象出一些“玲瓏”的構(gòu)思,然后修修補(bǔ)補(bǔ),使其符合我們的需求。前一種方式是借鑒經(jīng)驗(yàn),后一種方式是強(qiáng)求經(jīng)驗(yàn);前一種方式是慢慢演化水到渠成,后一種方式是急于求成生拉硬拽;前一種方式靈活,有更進(jìn)一步優(yōu)化的空間,后一種方式呆板,越修補(bǔ)越走樣。優(yōu)劣自現(xiàn)。
設(shè)計(jì)過程中要“兩頂帽子”輪流戴。“兩頂帽子”是Kent Beck為了形象地描述重構(gòu)過程中的兩項(xiàng)任務(wù)而引入一種比方。一頂帽子是改善現(xiàn)有設(shè)計(jì),另一定帽子是增加新功能。提醒我們,任何時(shí)候應(yīng)該只做一件事(除非你喜歡把兩頂帽子摞起來戴):改善現(xiàn)有設(shè)計(jì)的時(shí)候,就立足于現(xiàn)有設(shè)計(jì),用現(xiàn)有的測試用例可以很方便地驗(yàn)證改善的正確性;在增加新功能的時(shí)候(容納一種新的需求),就充分信任現(xiàn)有代碼的正確性,而立足于該功能,關(guān)注在新增功能的測試用例上以保證測試用例的正確,同時(shí)修改或增加代碼使得所有測試用例(包括新增的)通過。如果覺得新增了功能設(shè)計(jì)被污染了,別急,測試用例通過后可以換戴另一頂帽子。
5、要新陳代謝
軟件設(shè)計(jì)不是一勞永逸的,技術(shù)更新很快,軟件設(shè)計(jì)要為應(yīng)用服務(wù),就要適應(yīng)新的技術(shù)條件,新陳代謝。軟件設(shè)計(jì)本身要有開放、靈活的架構(gòu),而開發(fā)者也要有與時(shí)俱進(jìn)、開拓創(chuàng)新的精神。
軟件設(shè)計(jì)要吸納需求的變化,不斷適應(yīng)新的環(huán)境。軟件是服務(wù)于應(yīng)用的,應(yīng)用的背景發(fā)生了變化,軟件必然要跟著變化,所以好的軟件設(shè)計(jì)要有在變化中存活和發(fā)展的生命力,這就要求軟件本身的架構(gòu)是開放、靈活的。軟件架構(gòu)是在軟件在開發(fā)的過程中,不斷納入新的需求,軟件設(shè)計(jì)自身不斷地進(jìn)行調(diào)整,到最后穩(wěn)定下來的部分。所以軟件架構(gòu)是在需求不斷變化的打磨下進(jìn)化而來的,是軟件設(shè)計(jì)的骨架。只有來自于實(shí)際應(yīng)用的動(dòng)態(tài)的軟件架構(gòu),才方便改變自己以適應(yīng)應(yīng)用環(huán)境的改變。
開發(fā)者要不斷學(xué)習(xí),提升自己的眼界。軟件應(yīng)用的領(lǐng)域范圍廣泛,軟件技術(shù)的發(fā)展也朝不同的方向在不斷地提升;軟件開發(fā)的本質(zhì)規(guī)律還沒有完全大白于世,軟件業(yè)界存在著眾多的思想流派,不同流派正對(duì)一些技術(shù)方法會(huì)有一些爭議。而開發(fā)者往往只能集中精力于某一特定的方向,而對(duì)其他方向的發(fā)展比較生疏;或者開發(fā)者只信奉一個(gè)思想流派,對(duì)其他不同的意見不屑一顧——這些都是眼界受局限的表現(xiàn)。開發(fā)者應(yīng)當(dāng)了解其他領(lǐng)域的一些基本情況,其他流派的一些基本主張,這有益于反思自己開發(fā)中的一些困惑,啟發(fā)自己的思路。
開發(fā)者還要保持開放的心態(tài),要革故鼎新。好的軟件設(shè)計(jì),要經(jīng)受住時(shí)代變遷的考驗(yàn)和用戶的挑剔。所以設(shè)計(jì)者要有開放的心態(tài),虛心接受用戶的批評(píng)和建議,并積極改進(jìn)軟件的設(shè)計(jì)以滿足用戶的要求。特別是對(duì)于新的有用的技術(shù)元素(如新的軟件架構(gòu)理念、新的網(wǎng)絡(luò)技術(shù)、新的數(shù)據(jù)庫技術(shù)、新興的編程語言等),要有一定的敏感度,要從中吸取積極的啟發(fā),來加強(qiáng)軟件設(shè)計(jì)的技術(shù)跟進(jìn)。對(duì)于一些不合時(shí)宜的設(shè)計(jì),要更新?lián)Q代,始終保持軟件設(shè)計(jì)與時(shí)代同步。
開發(fā)者還要有一點(diǎn)完美主義情節(jié)。軟件設(shè)計(jì)是軟件開發(fā)者心血的結(jié)晶,是開發(fā)者思想的表白,所以開發(fā)者往往對(duì)自己成功的作品愛不釋手。就像母親總覺得自己的孩子最棒一樣,開發(fā)者會(huì)覺得自己的設(shè)計(jì)是最好的。應(yīng)該對(duì)那些傾心盡力做出軟件設(shè)計(jì)的開發(fā)者致以崇高的敬意!但是也有必要提醒他們,要理性客觀地對(duì)待自己作品的不足,還有不完美的地方。這些話,特別需要善意地對(duì)那些對(duì)現(xiàn)在的“設(shè)計(jì)”自我感覺良好的人說。相當(dāng)多的開發(fā)者,長期在設(shè)計(jì)的荒原,已經(jīng)習(xí)慣了在蕭瑟的秋風(fēng)和飛砂走石中緝拿隱藏在荊棘中的bug,還從來沒有想象過軟件設(shè)計(jì)其實(shí)可以做得更好,沒奢望過還有鳥語花香的春天。該醒醒了,不要安于在黑暗的屋子里窒息的命運(yùn)!
轉(zhuǎn)載于:https://www.cnblogs.com/8942/archive/2006/08/04/467680.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的如何取得好的软件设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JOURNAL】好久了啊
- 下一篇: 阅读《Google成功七堂课》