即使沒(méi)有翅膀,,心,。。,。,。。,。也要飛翔,!
在新年前一天預(yù)祝大家新年好,在新的一年里工作順利,,身體健康,。
前一陣公司給我下達(dá)了任務(wù),一直在忙著打造面向SAAS的企業(yè)級(jí)微信平臺(tái),,徹底實(shí)現(xiàn)零代碼配置,,小小一個(gè)微信,當(dāng)面向企業(yè)級(jí)而且是SAAS時(shí),呵呵,,還真的有許多需要注意的地方,,非常感謝公司內(nèi)最強(qiáng)的業(yè)務(wù)架構(gòu)師我們的大姐設(shè)計(jì)出來(lái)這么優(yōu)秀的一款全動(dòng)態(tài)微信業(yè)務(wù)。所以寫完了中篇,,一直沒(méi)時(shí)間來(lái)得及寫下篇,。
下篇的開(kāi)頭,大家也看到了標(biāo)題:即使沒(méi)有翅膀,,心也要飛翔?。?!
為什么提這個(gè)標(biāo)題呢,?企業(yè)IT項(xiàng)目開(kāi)發(fā)之七宗罪上、中篇大家看后很多人都說(shuō):目前形勢(shì)就是這樣,,有什么辦法,?也有人說(shuō):道理都懂,大環(huán)境這樣,,有什么辦法,。
對(duì),對(duì),,說(shuō)得都不錯(cuò),,我們無(wú)法去改變環(huán)境,我們天生不是天使,,我們沒(méi)有“翅膀,,可這就代表我們要就此淪落嗎?
NO,!
我們的心一樣可以飛翔,!
環(huán)境落后沒(méi)有關(guān)系,可悲的是心態(tài)也落后,。
步入正題
以下我拿一個(gè)數(shù)據(jù)來(lái)說(shuō)明問(wèn)題,,2005-2011年世界上只有3家IT公司保持著每年利潤(rùn)超10億美元,利潤(rùn)超10億美元哦,,哪三家,?
NO1. IBM,拋棄了Laptop后反而更強(qiáng)了,,為什么,?
NO2. TCS, 塔塔,世界上最大軟件外包,,網(wǎng)友們要問(wèn)了,,一個(gè)外包,做這么大,對(duì)吧,!為什么,?
NO3. APPLE,那是勿庸置疑的,!
我們不說(shuō)APPLE,,只說(shuō)TCS 和 IBM。
IBM,,大家如果注意IBM的人會(huì)發(fā)覺(jué),IBM的WAS系列即Websphere系列經(jīng)歷了2次變化,。
一次是WAS7開(kāi)始IBM專門規(guī)劃出了一個(gè)SOA產(chǎn)品區(qū),里面有Websphere Process Server(ESB), Business Process Management, IBM iLog規(guī)則引擎,,TAM,,WebSeal,MQ,,然后把WAS歸在了這個(gè)區(qū),。
第二次變化是再次把WPS(Websphere Process Server),BPM,,ilog等又劃出了SOA,,歸成了中件間產(chǎn)品。
為什么IBM要對(duì)其經(jīng)典的產(chǎn)品,,去做這樣做兩次大的變動(dòng)呢,?我們放在下文中說(shuō),我們先舉例子,,因?yàn)樘嗟牡览砟憧赡芤幌伦硬荒軌蛉ソ邮?,回過(guò)頭你再來(lái)看,你就會(huì)明白了,。
歐債危機(jī)持續(xù),企業(yè)客戶沒(méi)錢啦
隨著經(jīng)濟(jì)危機(jī),,主要是歐債危機(jī)引起了金融保險(xiǎn)行業(yè)的大規(guī)模的蕭調(diào),,大家都知道,金融系統(tǒng)的IT往往都是大型的業(yè)務(wù)系統(tǒng),,當(dāng)金融業(yè)受到了影響,,IT業(yè)勢(shì)必也受到了很大的影響。
那么我們國(guó)內(nèi)很多IT公司都是怎么生存的呢,?
國(guó)內(nèi)IT公司在經(jīng)濟(jì)危機(jī)之前的生存之道
大部分都是做項(xiàng)目的,,或者是賣人頭的,對(duì)吧,!
就是我前篇講到的學(xué)好SSH,,貨賣帝王家,SSH滿天飛。
根據(jù)客戶的需求,,業(yè)務(wù)要求,,做4個(gè)月,6個(gè)月的開(kāi)發(fā)項(xiàng)目,。
有的項(xiàng)目短,,做個(gè)2個(gè)月,搞個(gè)項(xiàng)目,,然后按照人月數(shù)用UCP,,F(xiàn)P什么的estimation方法一估,然后報(bào)給客戶多少多少錢,。
在歐債危機(jī)前,,因該是2008年前,或許我們靠著公司好的名聲,,經(jīng)營(yíng)之道,,管理有方,好的PM,,好的客戶關(guān)系,,或多或少是可以不斷的接到這樣的單子的。
往往做這樣的單子的時(shí)候,,我們用最簡(jiǎn)單的“軟件開(kāi)發(fā)生命周期”,,就是我們說(shuō)的七步曲即:確定問(wèn)題、需求分析,、設(shè)計(jì),、開(kāi)發(fā)、測(cè)試,、布署上線,、維護(hù)。
項(xiàng)目管理基本分成兩種模式:瀑布式項(xiàng)目管理和敏捷項(xiàng)目管理,,對(duì)吧,,這個(gè)大家都知道。
關(guān)鍵的問(wèn)題在于這個(gè)地方,,即不管任何一個(gè)需求,,項(xiàng)目大小,你都必須要走確定問(wèn)題,、需求分析,、設(shè)計(jì)、開(kāi)發(fā),、測(cè)試,、上線,、維護(hù),如果在項(xiàng)目中或者是項(xiàng)目后期有超出需求的部分,,我們把它定為:需求變更,,一個(gè)需求變更也必須要走完這7七步。走完這七步不算完,,還要把以前開(kāi)發(fā)過(guò)的代碼和工程再重新測(cè)試,、布署、上線,。
如果有了BUG,,BUG的修改也是要走這七步的,對(duì)吧,?
因?yàn)槟愕男枨笞兓?,不代表我只完成變更后的部分就完成了任?wù)了,因?yàn)槟愕淖兏赡軙?huì)引起我已經(jīng)開(kāi)發(fā)好的功能上出現(xiàn)了BUG,,這個(gè)問(wèn)題想必大家都是碰到過(guò)的,,這樣的BUG叫Regression Bug。
在經(jīng)濟(jì)危機(jī)沒(méi)有來(lái)時(shí),,你這樣做,OK的,,客戶理應(yīng)給錢,因?yàn)槭撬约阂兏枨蟮膯?,?duì)吧,,否則的話你需求變更我也能做啊,但是沒(méi)錢因此我的質(zhì)量就不給你保證,,客戶也怕,,所以愿意掏這個(gè)錢。
現(xiàn)在經(jīng)濟(jì)危機(jī)來(lái)了,,企業(yè)怎么生存啊,,還能這樣生存嗎?
《哈佛商業(yè)評(píng)論》上面有一篇文章文章說(shuō),,IT已經(jīng)不像以前那么關(guān)鍵了,,因?yàn)镮T的普遍應(yīng)用,就像水電一樣,,成了一種基礎(chǔ)設(shè)施,,不再是企業(yè)核心競(jìng)爭(zhēng)力的來(lái)源,。
經(jīng)濟(jì)危機(jī),,就是企業(yè)沒(méi)錢啦,沒(méi)錢,,但I(xiàn)T一樣需要,,”不再是企業(yè)核心競(jìng)爭(zhēng)力的來(lái)源“不代表我就不要IT了,,不代表技術(shù)無(wú)用論,這邊的“不要了”只是代表“相關(guān)技術(shù)的普及"了,。
普及就是SSH,,J2EE, EJB,Webservice這種東西,,你會(huì)我會(huì)大家都會(huì)了,。
于是,大量的還在拿SSH做項(xiàng)目的公司面臨著比以前多2倍,,不,。。,。是10倍之多的競(jìng)爭(zhēng)對(duì)手,。
于是,你會(huì)我會(huì)大家會(huì),。
于是,,大打價(jià)格戰(zhàn),你賣40萬(wàn),,我賣30萬(wàn),,成了自由叫賣市場(chǎng)。
于是,,工程價(jià)格是下來(lái)了,,GDP上升了,平均工資上升了,,程序員的工資還是要付的,。
于是,加班不要錢,,會(huì)個(gè)SSH,,工作個(gè)5,6年還拿著一個(gè)月8K,,9K,,1萬(wàn)塊錢到頭了,沒(méi)有年終獎(jiǎng)了,,Team Building取消了。
于是,。。。。,。,。還有很多,。
最后,,于是,,程序員成了民工還不如了,,哈哈哈哈哈。
但是,,但是,,說(shuō)多了于是還有一個(gè)但是。always 有一個(gè)但是,,導(dǎo)演總是不給我們一個(gè)happy ending,呵呵,,像一些美國(guó)大片一樣有多個(gè)結(jié)局哦??!呵呵??!
但是,,還是有一部分企業(yè)在這種大環(huán)境下脫穎而出,掙足了錢
這些企業(yè)越做越好,,人頭數(shù)就是head count反而年年越來(lái)越多,,在這樣的大環(huán)境下,還能持續(xù)的掙到錢,,這些公司的IT人員反而越來(lái)越脫離業(yè)務(wù)越來(lái)越走技術(shù)路線了,,反而比原來(lái)那些天天“業(yè)務(wù)業(yè)務(wù)”掛口頭的公司掙得更多了。
為什么,?
這還是要從客戶的角度去出發(fā),。
前面說(shuō)了,經(jīng)濟(jì)危機(jī),,客戶沒(méi)錢,,項(xiàng)目一樣要做,按照以前那樣,,我的一個(gè)項(xiàng)目,,走完軟件開(kāi)發(fā)生命周期7步,如果有變更再按照瀑布或者是敏捷開(kāi)發(fā)來(lái)走一遍需求變更,,對(duì)不起,,客戶受不了。
反正以前的項(xiàng)目已經(jīng)做了差不多了,,新的項(xiàng)目客戶要求的是:
業(yè)務(wù)上的功能可以隨時(shí)變,,當(dāng)這個(gè)變更需要被提出時(shí),如果你是開(kāi)發(fā)商,,你說(shuō):我們需求都可以做,,給時(shí)間,然后我們翻代碼,,對(duì)不起啊,,客戶不會(huì)再讓你這么做了,。
如果你是開(kāi)發(fā)商,你和客戶說(shuō):你的需求我們都能做,,然后重新估算,,走變更流程的話,告訴你,,你從2008年后開(kāi)始就很難接到新的項(xiàng)目了,。
可能,以前你可以一年接1000萬(wàn)到2000萬(wàn)的單,,2008年后你可能一年不如一年,,一年能接個(gè)500萬(wàn),300萬(wàn)就了不得了,,有的連100萬(wàn)的單子都接不到了,,真的,于是你就要面臨危機(jī)啦?。,?!
喂喂喂喂,,知道了嗎,危機(jī)感?。,。?!
那有人說(shuō)了,,我業(yè)務(wù)上的需求功能都變化了,原來(lái)是a+b+c*(x/y)現(xiàn)在成了a+b*(x+c-d)了我還不變代碼???
業(yè)務(wù)徹底變了我還不改動(dòng)程序啊,改動(dòng)了程序后我還不重測(cè)試,,重布署啊,,這都是人力啊,都要給錢的啊,。
當(dāng)然不是說(shuō)全部100%能夠做到,,但至少可以說(shuō)70%以上的需求可以做到不改動(dòng)代碼,就算改動(dòng)代碼了也只需要重新測(cè)試新開(kāi)發(fā)的功能就可以了,。
這就是SOA提倡的東西,,這邊不是說(shuō)SOA的原則,我們說(shuō)SOA可以做到什么,。
SOA可以做到什么,?我們粗看一下,有的人覺(jué)得很空洞,有的人覺(jué)得“很深?yuàn)W,,看不懂寫點(diǎn)什么”,,那就先來(lái)看一段SOA架構(gòu)理念吧:
1. 模塊和模塊之間耦合度降到最低!
2. 業(yè)務(wù)間的規(guī)則可以由客戶自由定義,!
3. SOA不是一種軟件,,它是一種設(shè)計(jì)、實(shí)現(xiàn)的思想,,它幫助一家企業(yè)建立起一個(gè)業(yè)務(wù)的infrastructure,!
4. 它可以迅速實(shí)現(xiàn)客戶的需求,為客戶提供垂直的業(yè)務(wù)需求,,可以快速的把客戶的業(yè)務(wù)從需求直接變成IT實(shí)現(xiàn),!
當(dāng)然還有很多,我先就舉上面幾條市面上見(jiàn)得最多的”行話“,,怎么去理解上面4句話呢,?我們用大水詞來(lái)理解吧,上面這4句說(shuō)的就是:
1. 我新做的東西,,應(yīng)該按照模塊化開(kāi)發(fā)思想,,就是你原來(lái)的系統(tǒng)給新接入的模塊將來(lái)的接口要預(yù)留好(有人說(shuō)了,我2011年開(kāi)發(fā)的東西怎么知道你2012年的模塊是什么樣的,,怎么給你預(yù)留接口啊,,對(duì)的,可以預(yù)留看,,你看下去),。
2. 由于我接口已經(jīng)予留好了,新的模塊就像搭積木一樣,,就是樂(lè)高積木啊,,把新的東西”插“上原有的模塊就可以用啦,如果這個(gè)模塊不好了,,舊了,,我拿掉它,再換一個(gè)模塊,。甚至可以做到本來(lái)一個(gè)項(xiàng)目,,10個(gè)模塊,每個(gè)模塊都由一個(gè)開(kāi)發(fā)商去實(shí)現(xiàn),,然后再找第十一個(gè)開(kāi)發(fā)商來(lái)搭積木一樣的去完成前10個(gè)模塊的集成啊,。
3. 然后就是諸如:a+b+c*(x/y)現(xiàn)在成了a+b*(x+c-d)這樣的業(yè)務(wù)變換,我不需要去用個(gè)eclipse打開(kāi)工程然后改動(dòng)里面的代碼,,一改就是改jsp, action, service層,,dao層對(duì)吧,,改完后急著上線,然后BUG又是一堆,,改不完的BUG,,加不完的班,不要,,程序員不要走這種路了,。
4. 像這樣的業(yè)務(wù)改變,你有一個(gè)界面,,讓業(yè)務(wù)人員就可以自己去通過(guò)拖拖拽拽自己去實(shí)現(xiàn)需求的變化了啊,,這邊的業(yè)務(wù)人員指的是企業(yè)里面用你開(kāi)發(fā)的這套系統(tǒng)的最終用戶,他們自己經(jīng)過(guò)簡(jiǎn)單的培訓(xùn)就可以用你的系統(tǒng)自己去定義自己的業(yè)務(wù)變更啦,。
如果你的系統(tǒng)能夠滿足客戶這樣的需求,,啊呀,在現(xiàn)在這個(gè)大環(huán)境下,,當(dāng)人家公司接不到項(xiàng)目時(shí),,你一定能夠接到項(xiàng)目。
那又有人說(shuō)了,,客戶都可以自定義化了,,我這個(gè)項(xiàng)目結(jié)束后不就沒(méi)有后期維護(hù),后期開(kāi)發(fā)任務(wù)了嗎,,我就不能夠長(zhǎng)期的穩(wěn)定的去獲得一個(gè)客戶這邊的項(xiàng)目來(lái)源了嗎,?
錯(cuò)?。,。?/p>
你錯(cuò)了,,客戶的需求是不斷的在變的,,由其是業(yè)務(wù)系統(tǒng),那個(gè)業(yè)務(wù)變化太大量了,,就說(shuō)一個(gè)CRM系統(tǒng),,一個(gè)CRM系統(tǒng)它面臨的是每個(gè)月都在變的業(yè)務(wù),為什么,?促 銷,,打折,雙11,,雙12,,圣誕打折,這些業(yè)務(wù)都在變啊,。
我的系統(tǒng)因?yàn)轳詈系椎?,可以做到模塊間的任意互換,,然后我又有這種業(yè)務(wù)人員自定義規(guī)則的界面,所以我新做的模塊可以0影響到原有的已經(jīng)布署的代碼,,而且我新做的模塊的布署是不需要原有的服務(wù)器在某天的零晨停一下,,然后我重去布署一下這種做法的,取而代之的是24*7的一種模式,,所以我管你客戶需求怎么變,,新的需求拿來(lái),我都是只需要重新估算新的功能的工作是量,,可能新的功能里面有70%的業(yè)務(wù)是可以由客戶中的業(yè)務(wù)人員去自定義完成的,,因此這70%我留給客戶,30%這個(gè)人工費(fèi)我會(huì)收,,客戶也覺(jué)得應(yīng)該給你,。
因?yàn)槟阕龅臇|西不影響原有系統(tǒng)的功能,不影響原有的系統(tǒng)運(yùn)行,,不會(huì)有太多或者就算有regression bug也是降到最底的度,,因此客戶才會(huì)源源不斷的每個(gè)月,給你個(gè)20%,,30%,,10%,然后過(guò)幾年系統(tǒng)大升級(jí),,軟硬件中間件一起換也找你,,就算客戶新的模塊是找另一個(gè)開(kāi)發(fā)商做的,但是在集成時(shí)碰到問(wèn)題還是要咨詢你啊,。
于是,,項(xiàng)目錢,這個(gè)大頭是可以掙到了,。
于是,,維護(hù)費(fèi),每個(gè)月定期的,,而且這種維護(hù)因?yàn)椴皇莻鹘y(tǒng)的那種翻寫原來(lái)的工程,,改動(dòng)原有的系統(tǒng),而只是搭積木一樣的,,你可以雇用相對(duì)便宜的年紀(jì)輕的程序員,,利潤(rùn)也有了。 于是,,你還可以收咨詢費(fèi),。
從原來(lái)的幾個(gè)悲慘的“于是”,變成了多條腿走路,,多方位收錢的于是啦,,呵呵,!
關(guān)鍵是這樣的項(xiàng)目是怎么做的,說(shuō)了這么多,,這樣的項(xiàng)目是長(zhǎng)個(gè)什么樣的呢,?
記得我當(dāng)年在公司里面臨第一次升職選擇時(shí),公司給了我兩條路:PM道路和技術(shù)道路,。我選擇了技術(shù)道路,。于是我第二天接到了美國(guó)總部一個(gè)Chief Architect,就是主任架構(gòu)師的第一輪考核電話,。
老外,,很牛B,你們知道他是怎么考核的嗎,?相當(dāng)?shù)目鋸垼?/p>
嘿,,你,看看公司的員工內(nèi)部系統(tǒng),,里面有考勤,,在線學(xué)習(xí)資料,請(qǐng)假,,報(bào)銷,,你在公司這些年一直用這個(gè)系統(tǒng)吧,現(xiàn)在請(qǐng)給我寫一下,,如果讓你設(shè)計(jì)這個(gè)系統(tǒng),,你會(huì)怎么去設(shè)計(jì)?給你30分鐘,,嗯,。。,。,。,。,。對(duì),就30分鐘,,現(xiàn)在是4:10分,,請(qǐng)你在4:40分把你寫的東西通過(guò)email發(fā)給我,as much more as you can think,。
我花了25分鐘,,最后他用了一個(gè)excellent把我給錄取到了公司的架構(gòu)師隊(duì)伍,從而我成為了中國(guó)這邊唯一一個(gè)能夠進(jìn)入到美國(guó)核心技術(shù)隊(duì)伍的成員,。
那我是怎么寫的呢,,當(dāng)然,,我也只是給大家參考。 我是這樣寫的:
首先,,這個(gè)系統(tǒng)不管是考勤,、請(qǐng)假、報(bào)銷都有一個(gè)”流程“性的東西,,因?yàn)槊孔鲆徊?,系統(tǒng)都會(huì)有相應(yīng)的EMAIL告訴你或者是某個(gè)環(huán)節(jié)的審批人:你目前有一個(gè)什么什么樣的任務(wù),還經(jīng)常會(huì)收收到系統(tǒng)的EMAIL要求我上傳這個(gè)附件,,那個(gè)附件,,駁回,拒絕,,通過(guò)啦等等等,,因此我會(huì)采用工作流,如果客戶是大型企事業(yè)客戶我會(huì)推薦他們?nèi)ビ靡恍┥逃密浖纾篒BM Lombardi,,或者是Oracle的Pega Rulz,。如果是中小型客戶我會(huì)推薦一些開(kāi)源的工作流如:jbpm, aris或者是activity。
其次,,該系統(tǒng)中存在大量的”上傳單據(jù)“,,”發(fā)票復(fù)印件“,”病歷掃描件“,,”會(huì)議文件“,,”PPT“等文件上傳文檔的接口,因此,,我不會(huì)自己去拿個(gè)common upload去做這么多的界面,。
首先,如果我自己做,,如果時(shí)間允許,,我會(huì)去做,但是我自己做這些上傳文件的界面和系統(tǒng),,我還面臨著上傳完后根據(jù)我的上級(jí),,上上級(jí),上上上級(jí)這樣的一個(gè)”按照權(quán)限“查看附件的一個(gè)權(quán)限系統(tǒng)問(wèn)題,。
那我自己做了上傳系統(tǒng)后,,除了解決按照權(quán)限查看調(diào)閱這些文件系統(tǒng)外我還需要面臨著去做,我上傳了第一次,,傳了不夠,,加點(diǎn)東西,傳錯(cuò)了撤銷重上傳這么一個(gè)版本控制的問(wèn)題,。因此我會(huì)選用CMS即Content Management System,。
比較適中的好的CMS系統(tǒng)如:Microsoft Soft Share Point Server即MOSS系統(tǒng),,或者是純免費(fèi)開(kāi)源的OPENCMS進(jìn)行二次開(kāi)發(fā)來(lái)幫助我做到上述這些事情。
然后,,這個(gè)系統(tǒng)有考勤,,有報(bào)銷,有請(qǐng)假,,有在線學(xué)習(xí)資料課程管理,,我肯定會(huì)按照模塊一個(gè)個(gè)開(kāi)發(fā),然后模塊與模塊間的集成怎么辦,?對(duì)吧,?這個(gè)系統(tǒng)是單點(diǎn)登錄的,這個(gè)勿庸置疑,,你登錄了企業(yè)公司內(nèi)的AD域就可以登錄這樣的一個(gè)系統(tǒng),,模塊和模塊間又要低耦合,那就是按照模塊分離開(kāi)發(fā)和布署原則,,那只有上PORTAL了,,所以Websphere Portal Server或者是liferay portal純開(kāi)源免費(fèi)的這個(gè)是。如果不用portal那就是模塊和模塊間用web service接口,,即組件合開(kāi)發(fā)SCA概念,。但是組件開(kāi)發(fā)如果按照Webservice來(lái)對(duì)接,就意味著如果我新做一個(gè)模塊,,需要和原有模塊的webservice間的連調(diào)問(wèn)題,,因此我們可以考慮采用esb統(tǒng)一webservice路由后所有的新做模塊按照這個(gè)統(tǒng)一的接口,然后像搭積木一樣把新的模塊“搭”上去,。
還有就是這個(gè)系統(tǒng),,同時(shí)還連接著公司的財(cái)務(wù),進(jìn)銷存等其它系統(tǒng),,它們之間肯定會(huì)有類似自動(dòng)”定單“的東西或者是數(shù)據(jù)交換存在,,那就存在著異步調(diào)用,那我肯定會(huì)用JMS,但是JMS里隊(duì)列我要自己去實(shí)現(xiàn),,你有那個(gè)能力那個(gè)精力自己去實(shí)現(xiàn)一個(gè)企業(yè)級(jí)的隊(duì)列,? 給我時(shí)間,又說(shuō)給我時(shí)間,。 人家企業(yè)開(kāi)發(fā)集成4個(gè)月,,6個(gè)月哪有這么多時(shí)間給你去自己光開(kāi)發(fā)一個(gè)隊(duì)列系統(tǒng),你當(dāng)人家企業(yè)是小白鼠啊,,經(jīng)濟(jì)危機(jī),沒(méi)錢沒(méi)時(shí)間,,OK,,所以我會(huì)上MQ,,開(kāi)源的我有activeMQ給企業(yè)選擇,如果是商業(yè)級(jí)的我推薦用IBM Websphere MQ,。 前面剛才說(shuō)到了單點(diǎn)登錄,,這個(gè)單點(diǎn)登錄是逃不掉的,而且你光單點(diǎn)登錄是不夠的,,還要去集成企業(yè)內(nèi)的權(quán)限系統(tǒng),,你自己去重頭寫一個(gè)?當(dāng)然如果現(xiàn)在是一個(gè)新產(chǎn)品開(kāi)發(fā),,你可以花2-3個(gè)月甚至更長(zhǎng)時(shí)間把個(gè)權(quán)限系統(tǒng)做完美了,,現(xiàn)在是企業(yè)級(jí)開(kāi)發(fā),業(yè)務(wù)系統(tǒng),,我肯定會(huì)去想,,如何拿靈活的,組件化的模塊,,成熟的組件去實(shí)現(xiàn)我這個(gè)需求,,因此我會(huì)選SSO組件和企業(yè)權(quán)限組件如:IBM TAM,或者是WebSeal或者是YALE CAS去集成這個(gè)SSO和權(quán)限,,這樣,,利用這些組件本身強(qiáng)大的訪問(wèn)LDAP即AD的能力我可以把精力專注在如何去組成這個(gè)系統(tǒng)上而不是拿個(gè)SSH,天世界的天天敲代碼把這些東西重頭到尾做一遍,。
然后是安全上的考慮,,我會(huì)考慮: 1. 我要從應(yīng)用層面上來(lái)說(shuō)防止跨站式入侵,SQL入侵,,腳本注入入侵,,中間人攻擊入侵等 2. 我要從系統(tǒng)層面上來(lái)考慮病毒的入侵,惡意的DDOS攻擊等 3. 數(shù)據(jù)的傳輸安全層面我要考慮數(shù)據(jù)如何保護(hù),,哪些層面,,哪些傳輸是需要加密需要保護(hù)的 4. 硬件層面的時(shí)間同步 5. 由于系統(tǒng)中很多層面上用到了加解密認(rèn)證等東西,我肯定要考慮一個(gè)證書,、口令管理系統(tǒng),,不可能我只把個(gè)證書放在WEB-INF目錄下就完了,什么certificate.bin這樣的東西就可以整個(gè)項(xiàng)目都拿來(lái)用了,,這是不對(duì)的,,不能這么干,肯定要有自己的證書和加解密管理庫(kù)的,。
擴(kuò)展性上的考慮:哪些層面我是可以集群的,,由于是組件化設(shè)計(jì)和開(kāi)發(fā),因此哪些面可能面臨數(shù)據(jù)集中訪問(wèn),訪問(wèn)量大,,可以集群擴(kuò)展,,一上集群后你原有的開(kāi)發(fā)的程序會(huì)有很多東西需要做同步,和改動(dòng),這些我是怎么考慮的,。
兼容性上的考慮,,有些客戶有錢,有些客戶沒(méi)錢,,有錢的上WAS, WEBLOGIC,,沒(méi)錢的上TOMCAT, JBOSS,那我的系統(tǒng)不可能做4套,,對(duì)WAS一套,,WEBLOGIC一套,對(duì)TOMCAT一套然后對(duì)JBOSS一套,。我系統(tǒng)肯定只有一套,,在WAS, WEBLOGIC, TOMCAT, JBOSS上都可以運(yùn)行或者只需要裝相當(dāng)有限的擴(kuò)展LIB庫(kù)就可以運(yùn)行起來(lái)對(duì)吧?
數(shù)據(jù)庫(kù)層面,,JAVA跨數(shù)據(jù)庫(kù),,我肯定要最起碼支持主流的ORACLE, DB2, MSSQLSERVER吧,不可能會(huì)為這幾個(gè)數(shù)據(jù)庫(kù)各做一個(gè)版本,,我肯定是只有一個(gè)版本,,然后我的SQL語(yǔ)句就可以在DB2時(shí)支持DB2, ORACLE時(shí)支持ORACLE, MSSQLSERVER時(shí)支持MSSQLSERVER吧?(提示:當(dāng)碰到繞不過(guò)去的必須使用到某個(gè)數(shù)據(jù)庫(kù)的特性來(lái)寫SQL時(shí),,請(qǐng)參照hibernate dialect的原碼即實(shí)現(xiàn)原理去寫你的SQL)
基本寫了上述這些,,然后后面幾天的面試與考核當(dāng)然就是圍繞著我第一天寫的這篇文章里的技術(shù)點(diǎn)進(jìn)行詳細(xì)考核了。
大家不知道看出來(lái)沒(méi)有,,出現(xiàn)了一堆的新東西,,由其是最后3項(xiàng),安全性,,擴(kuò)展性和兼容性,。
這里不是說(shuō)我列一下這些名詞就可以了,你必須把這些列出的名詞都玩一把吧,。
而且我說(shuō)了”商業(yè)的我會(huì)選用哪款產(chǎn)品,,為什么,開(kāi)源的我又會(huì)選用什么產(chǎn)品,,為什么“,。
所以,要成為架構(gòu)師不是說(shuō)嘴上能夠列出一些名詞就可以了,,你必須都玩過(guò),,就拿個(gè)Webservice來(lái)說(shuō),,你說(shuō)你會(huì)Webservice,OK,,用Axis2怎么實(shí)現(xiàn),,JAXWS怎么實(shí)現(xiàn),,XFIRE怎么實(shí)現(xiàn),,SPRING-WS怎么實(shí)現(xiàn),QOS是什么,,這些你都必須學(xué)過(guò)用過(guò)才能夠說(shuō)得出一個(gè)所以然?。。,?!不是說(shuō)我光會(huì)個(gè)jaxws就說(shuō):我精通webservice了!??!
對(duì)于實(shí)現(xiàn)上述這樣的一個(gè)系統(tǒng)錯(cuò)誤的做法是什么樣的呢?
自己設(shè)計(jì)一套數(shù)據(jù)庫(kù)去做權(quán)限,,很多公司這么做,,就是基于RBAC原則,當(dāng)然,,我們可以這么做,,前提是:你做的是核心系統(tǒng),就是一家企業(yè)的系統(tǒng)從沒(méi)有到有都是讓你來(lái)做的,,那么我們先會(huì)從權(quán)限系統(tǒng)下手,,可以重新設(shè)計(jì)一套。
但是當(dāng)你觸及到的是業(yè)務(wù)系統(tǒng)時(shí),,你大多時(shí)間面臨的是去集成客戶的權(quán)限系統(tǒng)和你自己的系統(tǒng),,因此你要想清楚如何去拿你模塊自身帶有的權(quán)限系統(tǒng)去集成客戶已有的權(quán)限系統(tǒng),而不是試圖去用你已有的權(quán)限系統(tǒng)去勸說(shuō)客戶走你的權(quán)限模型,。
碰到審批流程化的東西時(shí),,如大量的用VISIO畫出來(lái)的邏輯去寫一堆的IF, ELSE,SWITCH CASE語(yǔ)句,,HOHO,,千萬(wàn)不要這么做,。
如果有一個(gè)流程的分支改變了,,先不說(shuō)你自己用IF ELSE實(shí)現(xiàn)的艱巨與復(fù)雜,如果一旦你改變了,,可能你能夠通過(guò)分析以前一堆的IF ELSE代碼找到你將要新加的IF ELSE的地方,,也可能因?yàn)槟愣嗉恿艘粋€(gè)IF ELSE而讓原先跑得通的流程全部作廢,,壞掉,。用引擎吧。
如果有一個(gè)諸如:原來(lái)是a+b+c*(x/y)現(xiàn)在成了a+b*(x+c-d),,請(qǐng)考慮使用規(guī)則引擎,,而不是去寫一堆的store procedure,因?yàn)橐?guī)則引擎提供了客戶自定義規(guī)則流,,規(guī)則描述的圖形化界面從而可以讓客戶去自己修改規(guī)則,。 逆波蘭表達(dá)式不是讓你用在這邊來(lái)做復(fù)雜的企業(yè)規(guī)則的實(shí)現(xiàn)的,編譯器原理學(xué)了不是讓你自己去開(kāi)發(fā)引擎的,,除非你做的是科學(xué)計(jì)算機(jī),,企業(yè)級(jí)開(kāi)發(fā)里請(qǐng)盡量使用規(guī)則引擎吧。 因?yàn)橛辛艘?guī)則,,你可以任意去改變客戶的業(yè)務(wù)規(guī)則,,因?yàn)橛辛艘?guī)則,你可以把DAO, SERVICE打包成規(guī)則上傳后規(guī)則會(huì)通過(guò)CLASS LOADER自動(dòng)加載而運(yùn)用到客戶現(xiàn)有的系統(tǒng)中從而實(shí)現(xiàn)不重啟機(jī)器又能達(dá)到改動(dòng)規(guī)則的目的,,因?yàn)橛辛艘?guī)則引擎,,改變規(guī)則的事情可以交由客戶的業(yè)務(wù)人員去做,因?yàn)樗麄冏约旱臉I(yè)務(wù)是經(jīng)常的在變的,,而我們程序員要做的就是給客戶提供這些A,B,C,D,,E,F,G的元素,,然后讓客戶自己去組合。
我還看到過(guò)有用”偽規(guī)則“的開(kāi)發(fā)商,,這樣的開(kāi)發(fā)商真的要被人罵了,,就是他已經(jīng)有了規(guī)則這樣的思想了,把規(guī)則的組織去交由客戶,,但是他沒(méi)有用規(guī)則引擎而是做了一堆的STORE PROCEDURE,,差不多有2百個(gè)之多。然后客戶如果要改規(guī)則了,,只要改其中的20幾個(gè)STORE PROCEDURE,,然后他們還會(huì)教客戶如何拿個(gè)ORACLE的PLSQL/DEVELOPE客戶端去讓客戶自己寫CASE WHEN。,。,。天哪,把客戶的業(yè)務(wù)人員也變成了IT開(kāi)發(fā)人員,,你夠牛B,,不多評(píng)價(jià)了。
請(qǐng)考慮PORTAL,,或者是基于WEBSERVICE的SCA編程模型,,而不是自己做一堆的WAR包,然后WAR包間互相用api調(diào)用的方式來(lái)依賴,,本來(lái)你已經(jīng)把模塊分離了,,這下好,,模塊又依賴到了一起,偽耦合,。
有時(shí)在面對(duì)大量上傳,,文檔管理模塊時(shí)請(qǐng)考慮使用CMS系統(tǒng)或者理念,而不要自己去用記數(shù)據(jù)庫(kù)的方式去實(shí)現(xiàn)版本控制,,更不用提CMS所具有的權(quán)限整合能力了,。
做一個(gè)工程,涉及到工作流,,規(guī)則引擎,,CMS,,SSO,,PORTAL,本來(lái)這個(gè)工程已經(jīng)挺大了,,你除了把要實(shí)現(xiàn)的業(yè)務(wù)代碼實(shí)現(xiàn)一遍,,你還要自己拿個(gè)SSH,去實(shí)現(xiàn)工作流,,規(guī)則,,CMS, SSO, PORTAL本已經(jīng)有的那些底層功能,那我問(wèn)你,,到底是在做項(xiàng)目還是在做這些產(chǎn)品,,你說(shuō)我都自己實(shí)現(xiàn),HOHO,,你牛B,,等你做出來(lái)后,客戶早就飛走了,,項(xiàng)目早結(jié)束了,。
回過(guò)頭來(lái)看IBM與TCS為什么成功
所以回過(guò)頭來(lái),我們說(shuō)因?yàn)镮BM把它的精力集中在了開(kāi)發(fā)這些BPM, CMS, SSO, BUSINESS RULZ ENGINE中間件上面了,,同時(shí),,許多企業(yè)也認(rèn)清了目前的大環(huán)境以及現(xiàn)在的客戶對(duì)于項(xiàng)目的這一系列快,變更不觸及到原有,,任意替換,,分析模塊等要求,因此這些開(kāi)發(fā)商需要有相應(yīng)的,,成熟的,,穩(wěn)定的組件拿來(lái)用啊。
所以IBM專做這些組件,,靠這些組件它發(fā)了財(cái)了,。
IT界有句笑話嗎,,說(shuō):有人說(shuō)山上有黃金,于是來(lái)了許多人去挖黃金,,結(jié)果誰(shuí)都沒(méi)發(fā)財(cái),!那誰(shuí)最后發(fā)了財(cái)呢?山底下那個(gè)賣鏟子的老頭發(fā)了財(cái)了,。
那TCS呢,,TCS憑借著他第一個(gè)是印度人廉價(jià)的優(yōu)勢(shì),第二個(gè)它及時(shí)的把從原來(lái)的做外包,,變成了”方案外包“,,就是我不只,不光光只有人頭給了你,,而是我能夠?yàn)槟愕捻?xiàng)目,,你的需求,從軟硬件上提出一個(gè)整體的solution,,就像我在回答我們的那個(gè)美國(guó)的chief architect的問(wèn)題時(shí)所說(shuō)的那些,,數(shù)據(jù)庫(kù)層我怎么樣做,安全層我怎么樣做,,擴(kuò)展性怎么樣做,,對(duì)于上傳文檔管理我是怎么去解決的,對(duì)于流程化的東西我是怎么去解決的,。
他能夠提出大量的這樣的solution,,然后它把咨詢顧問(wèn)人員派到你客戶這邊,然后開(kāi)發(fā)人員在印度,、在China這邊的這種“offshore(離岸式)”方式來(lái)進(jìn)行開(kāi)發(fā),。
然后這樣的一個(gè)系統(tǒng)一旦上線,我們說(shuō)了,,因?yàn)樗且粋€(gè)”解決方案“級(jí)別的,,那圍繞著這樣的系統(tǒng)會(huì)有一堆的需求變更,后續(xù)開(kāi)發(fā),,集成,,甚至和第三方集成,那都是會(huì)被TCS吃下來(lái)的,。
這就叫”斬首行動(dòng)“,,就是我吃掉了你的”大頭“后面的零碎的其它的外圍系統(tǒng)就都是我的了。我要吃時(shí),,隨時(shí)可以吃,,我不想吃時(shí),分點(diǎn)羹給你啊,,對(duì)吧,!
所以國(guó)內(nèi)的一些企業(yè),,由其是傳統(tǒng)外包,巨頭外包或者是一些一直做項(xiàng)目而現(xiàn)在發(fā)覺(jué)項(xiàng)目越來(lái)越難接的公司,,你們需要轉(zhuǎn)形了,。
對(duì)這些企業(yè)我想引用我前公司的的一位領(lǐng)導(dǎo),他同時(shí)也是我的技術(shù)人生第一導(dǎo)師的話來(lái)說(shuō):外面其實(shí)有很多項(xiàng)目,,但是它們不來(lái)找你,,而你,找不到項(xiàng)目適合你來(lái)做,。
結(jié)束語(yǔ)
基本我先總結(jié)這些吧,,所以,程序員們,,你們看看,,你們要學(xué)的東西還有哪些?
SSH不是沒(méi)有用,,SSH是基礎(chǔ),,是1+1=2,是九九算數(shù)表,,因?yàn)槟阍谧鼋涌跁r(shí),在開(kāi)發(fā)一些底層的東西時(shí)還是需要用到SSH的,,而對(duì)于一些只有“組件”才能做的事,,留給組件去做吧。
SSH不是沒(méi)有用,,SSH更重要了,,因?yàn)樗呀?jīng)成了你邁向更高階的一個(gè)踏板,沒(méi)有了這個(gè)踏板,,你很難上車,,就算上了車你也是騎不穩(wěn)的。
如果你還還處在迷茫中,,那么就是說(shuō)你還沒(méi)有翅膀,,但你也想飛翔,那么這些東西夠你學(xué)一輩子的了,,相信擁有一雙翅膀絕對(duì)是值得你去追求的吧,?
SOA是一個(gè)理念,現(xiàn)在的SOA又包括了云計(jì)算,,社交網(wǎng)絡(luò),,企業(yè)級(jí)MOBIE應(yīng)用的混合應(yīng)用,SOA+云,,SOA+MOBILE, SOA+云等等等是近20年可能僅有的掙錢的機(jī)會(huì)了,。
因?yàn)镾OA把原有的企業(yè)級(jí)開(kāi)發(fā)人員,,再次變成了真正的IT開(kāi)發(fā)人員,在SOA理念的指導(dǎo)下去開(kāi)發(fā)系統(tǒng),,IT開(kāi)發(fā)人員更需要去關(guān)注于技術(shù)和業(yè)務(wù)的infrastructure即業(yè)務(wù)組合的架構(gòu)和技術(shù)框架上去,,而不是去實(shí)現(xiàn)業(yè)務(wù);實(shí)現(xiàn)業(yè)務(wù)交給了業(yè)務(wù)人員,,這是一種返璞歸真即重新回到了IT人員做技術(shù),,業(yè)務(wù)人員做業(yè)務(wù)的時(shí)代中去了。
我當(dāng)然這邊也只是發(fā)表一下自己的意見(jiàn),。
我自己總結(jié)了一下,,由其是還處在迷茫期的程序員,有人說(shuō):到底我干了4年,,5年我還能干技術(shù)嗎,?還要學(xué)點(diǎn)什么,還差點(diǎn)什么,,那我總結(jié)出來(lái)下面這么一張圖,,從上往下看:
這張圖我把它分為3層。
從上面第一層來(lái)看,,我列舉出了一些行業(yè)界的優(yōu)秀組件,,這些組件都是和業(yè)務(wù)無(wú)關(guān)的,但又都是用來(lái)組合和集成大型業(yè)務(wù)系統(tǒng)時(shí)所需要用到的,。因此我覺(jué)得是有必要都去熟悉,,學(xué)習(xí),運(yùn)行一下的,,如果有志向,,應(yīng)該每一個(gè)都會(huì)用并且知道分別可以在哪種場(chǎng)景下運(yùn)用以及它們?cè)谶\(yùn)用和集成到你的框架時(shí)的優(yōu)缺點(diǎn)、注意項(xiàng),。
當(dāng)中這一層,,我覺(jué)得是一個(gè)準(zhǔn)備走技術(shù)道路的J2EE開(kāi)發(fā)人員所必須具備的,要不然你無(wú)從去了解和設(shè)計(jì)出一個(gè)跨數(shù)據(jù)庫(kù),,跨平臺(tái),,擴(kuò)展性,安全性的J2EE系統(tǒng)了,。
最底下一層,,是為了去滿足當(dāng)中這一層和最上面這一層所要具備的”基本功“,這就和1+1=2一樣,,這個(gè)不會(huì),,你也不要去談四則運(yùn)算了。
要學(xué)的東西還有很多。
你如果要來(lái)問(wèn)我:還學(xué)點(diǎn)什么,,相信此文可以回答你的問(wèn)題,。
誰(shuí)說(shuō)技術(shù)道路走不到底?誰(shuí)說(shuō)30歲左右就要換PM的角色,?
技術(shù)道路也可以走下去?。?/span> software engineer, senior software engineer, team leader, architect, senior architect, chief architect, principal architect,。
嗯,,principal architect,差不多到了這層我應(yīng)該是vice president的待遇了,,哈哈哈哈,,估計(jì)那時(shí)我已經(jīng)50歲了吧,可我依然走技術(shù),,嘿嘿,!
而我今后的篇章在前面有了SSH,性能調(diào)優(yōu),,幾個(gè)主要的APP SERVER的使用和調(diào)優(yōu),,以及為面試準(zhǔn)備的基礎(chǔ)技術(shù)重溫后,也將逐漸引入一個(gè)個(gè)組件化的應(yīng)用,,并且會(huì)在相關(guān)的例子中來(lái)向大家展現(xiàn)一個(gè)靈活的業(yè)務(wù)架構(gòu)是怎么去設(shè)計(jì),、實(shí)現(xiàn)和搭建的。
|