菜鸟要做架构师(一)——如何快速开发中小型系统
俗話(huà)說(shuō):不想當(dāng)項(xiàng)目經(jīng)理的程序員不是好的架構(gòu)師。相信每一個(gè)有上進(jìn)心的程序員,都有一個(gè)架構(gòu)師的夢(mèng)。最近完成了一個(gè)中小型的項(xiàng)目,讓我有了一些感受和想法,于是決定新開(kāi)一個(gè)系列——《菜鳥(niǎo)要做架構(gòu)師》。
經(jīng)常看我博客的人應(yīng)該了解,我寫(xiě)了好幾個(gè)“菜鳥(niǎo)”系列了。有很多人問(wèn)我,你都是大牛了,怎么寫(xiě)博客還叫菜鳥(niǎo)?有人覺(jué)得太過(guò)低調(diào)了,也有人覺(jué)得這是在裝B。其實(shí)呢,我是覺(jué)得自己真的還只是個(gè)菜鳥(niǎo)。就光拿計(jì)算機(jī)行業(yè)來(lái)說(shuō)吧,就有太多太多的知識(shí)我不懂,甚至連聽(tīng)都沒(méi)聽(tīng)過(guò)。記得高中有位老師說(shuō)的話(huà)讓我印象特別深刻,大概意思是:越是一知半解的人,往往越是喜歡高談闊論;越是知識(shí)淵博的人,往往越覺(jué)得自己欠缺很多(哎呀,現(xiàn)在說(shuō)這句話(huà),有點(diǎn)裝B的嫌疑,罪過(guò)罪過(guò)....)。所以我覺(jué)得要保持一顆謙卑的心,才能夠不斷的學(xué)習(xí)并提高自己,所以用“菜鳥(niǎo)”二字來(lái)自勉。好了,好像扯的有點(diǎn)遠(yuǎn),下面咱們進(jìn)入正題。
項(xiàng)目背景:
這個(gè)項(xiàng)目是給廊坊市政府做的,本來(lái)這個(gè)項(xiàng)目是別的公司做的,后來(lái)由于種種原因,不做了,留下一個(gè)半成品。我接手的時(shí)候,他們給了源碼和數(shù)據(jù)庫(kù),還有一些簡(jiǎn)單說(shuō)明。幾乎沒(méi)有任何需求和設(shè)計(jì)文檔,經(jīng)過(guò)多方聯(lián)系和溝通,他們給出的答復(fù)是:沒(méi)有文檔!最后經(jīng)過(guò)大家討論覺(jué)得在他們的基礎(chǔ)上繼續(xù)開(kāi)發(fā),成本較高(需要弄清楚他們的代碼以及數(shù)據(jù)庫(kù),他們給的庫(kù)總共有四百多張表),所以最后決定重新開(kāi)發(fā)。
重構(gòu):
雖然文檔一無(wú)所有,好在利用他們給的源碼和數(shù)據(jù)庫(kù),他們的項(xiàng)目還是搭起來(lái)的。可以簡(jiǎn)單的看看頁(yè)面,也對(duì)一些需求有了大致的了解。也發(fā)現(xiàn)了一些他們前端框架存在的問(wèn)題,最嚴(yán)重的問(wèn)題就是瀏覽器的兼容性。經(jīng)測(cè)試發(fā)現(xiàn),頁(yè)面顯示只有在IE7和部分國(guó)產(chǎn)瀏覽器下正常顯示。在其他IE版本或者其他內(nèi)核瀏覽器,甚至是很多雙核瀏覽器下都是那種根本沒(méi)法用的程度。
技術(shù)選型:
前端框架
前面已經(jīng)提到了,之前的項(xiàng)目在瀏覽器兼容性上存在著嚴(yán)重的問(wèn)題,所以我們?cè)谶x擇的時(shí)候要考慮到這個(gè)因素。結(jié)合手底下開(kāi)發(fā)人員的技術(shù)水平以及用戶(hù)的需求,我們最終確定用dwz作為我們的前端框架。可能會(huì)有人覺(jué)得dwz不好,Ext更好怎樣怎樣,還是那句話(huà)合適就是最好的,殺雞焉用牛刀。個(gè)人覺(jué)得dwz在應(yīng)對(duì)中小型的項(xiàng)目時(shí),還是非常不錯(cuò)的。首先,瀏覽器兼容性不錯(cuò),經(jīng)過(guò)我的不完全統(tǒng)計(jì),dwz無(wú)論是在IE、Chrome還是FireFox的各個(gè)主流版本,都可以正常工作,各大國(guó)產(chǎn)瀏覽器也都完美兼容;還有,就是它上手比較容易,對(duì)于快速開(kāi)發(fā)小型項(xiàng)目非常合適;當(dāng)然,選擇它還有一個(gè)很重要的原因,項(xiàng)目組的人對(duì)于dwz相對(duì)熟悉,可以快速投入戰(zhàn)斗。
核心框架
目前最常用的也就是下面幾位了:Spring、Struts/SpringMVC、Hibernate/Mybatis。一般說(shuō)來(lái)Spring的入選沒(méi)有什么爭(zhēng)議,主要就是MVC框架用Struts還是SpringMVC,ORM框架用Hibernate還是Mybatis。這四個(gè)都是非常優(yōu)秀的開(kāi)源框架,技術(shù)上都很成熟,無(wú)論怎么組合都可以很好的完成我們需要的功能。具體怎么選擇,還是的回歸實(shí)際。結(jié)合開(kāi)發(fā)人員的技術(shù)特長(zhǎng),以及相關(guān)資料的豐富程度,和遇到問(wèn)題解決的成本來(lái)看,Struts和Hibernate更加適合。首先,組員對(duì)于Struts和Hibernate更加熟悉;Struts和Hibernate相比SpringMVC和Mybatis也有著更多的用戶(hù),相關(guān)社區(qū)也更加的活躍,有什么問(wèn)題當(dāng)然解決起來(lái)也就更容易一些。
綜上所述,基礎(chǔ)框架為:Spring + Struts+ Hibernate 。
其他
數(shù)據(jù)庫(kù)方面很簡(jiǎn)單,對(duì)于中小型的項(xiàng)目MySQL足以,Oracle太笨重了。IDE方面,Eclipse沒(méi)什么好說(shuō)的。構(gòu)建工具,Maven管理項(xiàng)目很好用,跟Ant相比,Maven也是好處多多,關(guān)于它們兩個(gè)的比較就不細(xì)說(shuō)了,百度一大堆。版本控制,SVN功能完善、簡(jiǎn)單易用,在局域網(wǎng)內(nèi)做版本控制,要比Git更有優(yōu)勢(shì)。Web容器選擇Tomcat+Jetty,Jetty主要是用于開(kāi)發(fā)的時(shí)候,最終部署到服務(wù)器用的是Tomcat。部署用Tomcat一是因?yàn)樗映墒?#xff0c;二是因?yàn)槭姓沁叺姆?wù)器環(huán)境就是Tomcat,沒(méi)必要再換。而用Jetty呢,是因?yàn)樗圆寮男问礁鶰aven配合起來(lái),可以很大程度的提高開(kāi)發(fā)的效率。在pom.xml文件里配好,直接“Run?As”運(yùn)行,修改代碼也能動(dòng)態(tài)加載,很方便。
基礎(chǔ)架構(gòu)的設(shè)計(jì):
基礎(chǔ)的結(jié)構(gòu)就是Action+Service+Dao+Entity。整體的結(jié)構(gòu)圖如下:
上圖是最基本的骨架,當(dāng)然還會(huì)用到一些工具類(lèi)什么的,那些可以統(tǒng)一放到tool里面。大家都知道面向?qū)ο笥袔讉€(gè)很重要的特性——抽象、封裝、繼承、多態(tài)。我們?cè)O(shè)計(jì)的時(shí)候當(dāng)然也要遵循面向?qū)ο蟮乃枷?#xff0c;下面先來(lái)看一下每一層內(nèi)部的聯(lián)系吧!
Action:Action這一層,抽象出一個(gè)BaseAction,由它統(tǒng)一繼承ActionSupport,然后把一些公共的東西封裝到里面。例如分頁(yè)信息、result的返回值常量等等;
Service:Service這一層,抽象出一個(gè)BaseService,有它處理最基本的增刪改查業(yè)務(wù),其他具體的Service來(lái)繼承它,比如UserService,繼承BaseService以后,默認(rèn)就具有了基本的增刪改查,因此,它不需要再自己實(shí)現(xiàn)一遍。它的任務(wù)就是關(guān)注自己特有的業(yè)務(wù),比如登錄、退出,這些是UserService自己獨(dú)有的業(yè)務(wù)。這樣不必管共有業(yè)務(wù),只關(guān)注自己特有業(yè)務(wù)的方式提高了代碼復(fù)用,提高了開(kāi)發(fā)效率。
Dao:Dao這一層,抽象出一個(gè)BaseDao,它跟上面BaseService的作用很相似,負(fù)責(zé)處理對(duì)實(shí)體基本增刪改查的工作,就不多說(shuō)啦。
Entity:Entity這一層,其實(shí)也是可以抽象出一個(gè)BaseEntity的,可以讓它來(lái)實(shí)現(xiàn)序列化,這樣就不用每個(gè)實(shí)體類(lèi)都實(shí)現(xiàn)一遍了。還可以把Id等公共屬性拿出來(lái)。總之,原則就是把大家都需要的統(tǒng)一放到一個(gè)地方,自己只管自己特有的。
開(kāi)發(fā)管理:
我們的開(kāi)發(fā)團(tuán)隊(duì)開(kāi)始是四個(gè)人,后來(lái)一個(gè)開(kāi)發(fā)人員轉(zhuǎn)到其他項(xiàng)目組,我們有轉(zhuǎn)過(guò)兩個(gè)人來(lái)。所以我們組屬于四五個(gè)人的規(guī)模,管理模式采用的是敏捷開(kāi)發(fā)的模式。每天上午來(lái)了,九點(diǎn)開(kāi)立會(huì),每個(gè)人說(shuō)一下昨天任務(wù)的完成情況,有沒(méi)有遇到什么困難之類(lèi)的。如果沒(méi)有什么特殊情況,就給每個(gè)人分配一下接下來(lái)的任務(wù),如果有人遇到什么難題,就找人幫他解決一下,或者我?guī)退鉀Q一下。然后把進(jìn)度跟情況匯報(bào)給項(xiàng)目經(jīng)理。
OK,上面說(shuō)了那么多項(xiàng)目的情況,下面該呼應(yīng)一下本文的標(biāo)題了,談?wù)勛鐾赀@個(gè)項(xiàng)目我的一些感受。好了,那么問(wèn)題來(lái)了:挖掘機(jī)技術(shù)...?咳咳...?不好意思,說(shuō)順口了。今天要說(shuō)的是快速開(kāi)發(fā)中小型系統(tǒng)我們應(yīng)該怎么做。
快速確定需求
中小型系統(tǒng)通常業(yè)務(wù)不是很復(fù)雜,因此要確定需求并不難,快速畫(huà)出原型,積極和客戶(hù)溝通,以便快速的確定需求。需求不定后面的事情都是白扯。
合理的技術(shù)選型
需求定了,那么接下來(lái)就要考慮怎么做了。首先要確定用什么技術(shù),選擇什么框架等等。技術(shù)選型首先要看這種技術(shù)適不適合項(xiàng)目,即能不能滿(mǎn)足我們的需求,通常這一點(diǎn)比較容易確定;第二就要考慮這種技術(shù)適不適合我們的團(tuán)隊(duì),什么意思呢?就是說(shuō)要看開(kāi)發(fā)人員對(duì)于這項(xiàng)技術(shù)的熟悉程度,是不是能馬上上手,或者需要一段時(shí)間的學(xué)習(xí),再或者需要投入比較高的學(xué)習(xí)成本。如果需要比較高的學(xué)習(xí)成本,那么或許你該考慮一下是不是有其他的技術(shù)可以代替它。當(dāng)然,如果你們項(xiàng)目不急或者你們公司是土豪那就另當(dāng)別論了;再有不要一味追求最新的技術(shù),因?yàn)樾碌陌姹就殡S著新的bug,出了問(wèn)題也不好解決,同樣也不要選擇太老的版本,推薦選擇比最新版本低一到兩個(gè)版本的正式穩(wěn)定版。
優(yōu)秀的基礎(chǔ)架構(gòu)
什么是優(yōu)秀的代碼?很多人都知道:易擴(kuò)展、易維護(hù)、復(fù)用性強(qiáng)....?那么如何做到這些呢?說(shuō)實(shí)話(huà),小弟水平一般說(shuō)不太好,大抵可以概括如下:層之間加入接口,來(lái)降低耦合度、增加靈活性,方法與類(lèi)的職責(zé)單一,提高內(nèi)聚性,從而達(dá)到易擴(kuò)展的目的;制定完善的代碼規(guī)范,模塊與關(guān)鍵代碼語(yǔ)句要有較詳細(xì)的注釋,完善的文檔,從而提高易維護(hù)性;抽象封裝公共模塊,提煉與業(yè)務(wù)無(wú)關(guān)的部分,如:分頁(yè)、樹(shù)形菜單、上傳、下載、基本的數(shù)據(jù)維護(hù)等。從而提高代碼的復(fù)用性。
項(xiàng)目管理
項(xiàng)目管理可以分為項(xiàng)目進(jìn)度的掌控以及人員的管理安排。這兩者是密不可分的,只有把人管好,才能讓項(xiàng)目平穩(wěn)的向前推進(jìn)。人與人之間的交往,遠(yuǎn)比跟電腦打交道要復(fù)雜的多。這次輸入個(gè)“A”,他給你輸出個(gè)“B”,下次你同樣輸入個(gè)“A”,沒(méi)準(zhǔn)他就給你輸出個(gè)“C”,或者給你輸出一堆亂碼,甚至直接死機(jī)藍(lán)屏了。這個(gè)事情三言?xún)烧Z(yǔ)說(shuō)不清,總之就是對(duì)待不同的人用不同的方法。對(duì)于踏實(shí)沉穩(wěn)的人要時(shí)不時(shí)的鼓勵(lì),換發(fā)他的激情;對(duì)于活潑外向的人就要偶爾打擊一下,安撫一下他的浮躁。任務(wù)的安排也要根據(jù)每個(gè)人的能力以及特長(zhǎng)合理分配,當(dāng)組員沒(méi)有很好的完成任務(wù)時(shí)也不要急于責(zé)備、質(zhì)問(wèn),先耐心的傾聽(tīng),看看究竟是哪些原因所導(dǎo)致的,然后客觀分析,找出解決方案,共同克服困難。
回頭一看,發(fā)現(xiàn)自己竟然寫(xiě)了這么多,說(shuō)實(shí)話(huà)寫(xiě)這篇博客著實(shí)花了我不少功夫,這應(yīng)該是我寫(xiě)的最長(zhǎng)同時(shí)也是感受最多的一篇博客了吧。總之能夠順利的完成這個(gè)項(xiàng)目離不開(kāi)大家的支持,離不開(kāi)組員的努力,在此我就不一一感謝了。最后不得不單獨(dú)感謝一下巨同學(xué),如果不是他一次次的鼓勵(lì),不可能完成的這么順利,遇到困難時(shí)彼此的鼓勵(lì)很重要。加油!你行的!
from:?http://www.cnblogs.com/liushuijinger/p/4086371.html
總結(jié)
以上是生活随笔為你收集整理的菜鸟要做架构师(一)——如何快速开发中小型系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring容器中Bean的作用域
- 下一篇: 菜鸟要做架构师(二)——java性能优化