架構(gòu)師是個很神圣的詞。蓋茨,世界首富。微軟,世界最大最富有的軟件公司。蓋茨是微軟的首席架構(gòu)師。
好多程序員流口水,一聽某人是架構(gòu)師,就兩眼發(fā)亮,比技術(shù)總監(jiān)的頭銜還要厲害。
一想起架構(gòu)師,大家就想起那些UML設(shè)計工具、類圖、時序圖,想起那些水泥大樓的框架和地基,想起了那些
如百變金剛的開發(fā)平臺,想起了那些讓人眩目的反射、元數(shù)據(jù)、FrameWork、設(shè)計模式、面向?qū)ο?、重?gòu)。
很多人想當(dāng)架構(gòu)師,感覺架構(gòu)師是技術(shù)職業(yè)發(fā)展的最高境界,在往上走就有管理職能了,如技術(shù)總監(jiān)和CTO或
研發(fā)總裁之類的頭銜。
李維先生曾經(jīng)有過一次演講,講到了一個架構(gòu)師應(yīng)該具備的特性:
1核心軟件技術(shù)。要攻克數(shù)據(jù)庫設(shè)計問題,必須深入了解數(shù)據(jù)庫的工作原理,而不是會寫復(fù)雜的SQL會管理個
備份會設(shè)計個表結(jié)構(gòu)就算精通數(shù)據(jù)庫。有人甚至把會用hibernate\structs\spring當(dāng)作自己會核心軟件技術(shù)
。
2產(chǎn)品特性。你學(xué)了那么多核心技術(shù),到底要干嗎?我一直在商業(yè)軟件公司工作,沒有在研究所工作過。我各
種技術(shù)要做到的就是幫助企業(yè)軟件生產(chǎn),如何更快更省力氣質(zhì)量更好市場競爭力更強(qiáng)。我總是以這個原則來
驗證一項技術(shù)是否對于我的工作來說而實用?,F(xiàn)在技術(shù)多如牛毛,在各個層次各個領(lǐng)域解決著各個環(huán)節(jié)的問
題。如果不以解決自己工作中的問題為圓心,很容易陷于到大量學(xué)習(xí)卻越來越茫然找不到出路的境地。
3軟件趨勢。在企業(yè)管理軟件開發(fā)領(lǐng)域,往往會見到這樣的現(xiàn)象:不少開發(fā)人員精通客戶業(yè)務(wù)需求,深入第一
線做客戶實施。他們學(xué)習(xí)技術(shù)也是為了解決現(xiàn)有手頭的問題。尤其企業(yè)管理軟件開發(fā)領(lǐng)域,技術(shù)要求并不高
,而如果不了解客戶需求,開發(fā)的軟件實用性就不強(qiáng),即使你的功能開發(fā)的又性能好又安全性好也沒實用意
義。所以,不少在企業(yè)管理軟件開發(fā)領(lǐng)域工作多年的開發(fā)人員,形成了技術(shù)輕視觀,甚至有種核心技術(shù)學(xué)習(xí)
無用論的思想。但企業(yè)管理軟件開發(fā)領(lǐng)域,經(jīng)過十多年的發(fā)展,已經(jīng)面臨了不少挑戰(zhàn)。但是很多人覺得那是
大環(huán)境的事情,大環(huán)境不是一個人一個公司能改變能影響的。大環(huán)境變,咱們就跟著變。大環(huán)境不變,咱也
照舊。但是,我已經(jīng)經(jīng)歷過了很多時代,見證了很多遺憾,大環(huán)境發(fā)生改變了,自己卻跟不上了。
DOS\WINDOWS時代、單機(jī)\局域網(wǎng)時代、互聯(lián)網(wǎng)時代、移動增值時代。每一個時代都出了黑馬,賺取的金錢突
然高出傳統(tǒng)模式數(shù)倍,而傳統(tǒng)模式者還是在繼續(xù)走傳統(tǒng)模式,辛苦的賺錢,而且隨著價格戰(zhàn)的加劇,越來越
辛苦,但還不思改變者并且還認(rèn)為不可改變者大有人在。
4創(chuàng)新技巧。我們往往會遇到這樣的情況:要解決手頭的問題,擺在面前的有N種技術(shù)方案。選擇哪個都有缺
點,綜合來用又感覺牛刀殺雞了。有時候,我們還會遇到另一種技術(shù)選擇,未來的軟件趨勢一定是那樣那樣
的,但現(xiàn)在還沒有達(dá)到,現(xiàn)在的技術(shù)方案都是過渡期的,所以我們還要等。否則利用現(xiàn)在的過渡期技術(shù),開
發(fā)出來就被淘汰了。如果是這種以現(xiàn)狀看技術(shù)的思路,不管技術(shù)發(fā)展到什么階段,都有遺憾,都在向未來的
未來過渡。所以,作為一個架構(gòu)師,比別人厲害就厲害在,總是能把手里這些技術(shù)巧妙的利用,以解決自己
的問題。當(dāng)然,你想把你手中的技術(shù)能用活,你必然是理解這項技術(shù)的來龍去脈和這項技術(shù)的適用領(lǐng)域,還
要深入理解這項技術(shù)的工作原理,還要清楚的認(rèn)識到你要解決的問題領(lǐng)域,否則,你無法把你的技術(shù)和你要
解決的問題結(jié)合在一起。
我對李維先生的這四點講述頗為贊許。架構(gòu)師總是游走在技術(shù)和業(yè)務(wù)之間,既要兼容軟件歷史不能割裂又要
面向未來發(fā)展,所以我老把架構(gòu)師稱為走鋼索的人。
很多人也想成為具有這樣特性的架構(gòu)師,但就是不知道該怎么走這條路。我就講講我的經(jīng)歷。
我剛出道的時候,很快成為公司技術(shù)出眾的程序員。有人跟蹤調(diào)試了一下午也找不到錯誤的,找我;有人不
知道這個錯誤是怎么引起的,找我;有人不知道某個需求怎么實現(xiàn)代碼方便,找我;有人要優(yōu)化數(shù)據(jù)庫性能
,但怎么都速度提不上去,找我;有人要修改一段超復(fù)雜的代碼,怎么也理不出來,N多判斷和函數(shù)嵌套,腦
袋思考不過來了,對代碼的復(fù)雜度掌控不了了,找我;
我就跟一個活雷鋒一樣,大家也好像覺得我就是個活字典,有技術(shù)問題找我總沒有錯。就這樣,我在研發(fā)部
有了很好的技術(shù)信任,也有了很好的人緣。
而架構(gòu)師要做的工作,是許多人工作的基礎(chǔ)。如果沒有很好的技術(shù)信任,大家怎么敢把他們的工作搭建在你
的基礎(chǔ)之上。如果沒有很好的人緣,大家怎么愿意把他們的工作搭建在你的基礎(chǔ)之上。
就是由于我解決了很多業(yè)務(wù)開發(fā)的問題,我了解了很多業(yè)務(wù)開發(fā)的現(xiàn)實狀況,并且還能提出簡潔有效的解決
方法,而且解決方法不死板不鐵板一塊能保持獨立靈活通用性,給其他人的工作帶來了很好的工作效率,所
以領(lǐng)導(dǎo)才信任我能做好這一塊,并且適合做這一職位。不是隨隨便便一個人深刻學(xué)習(xí)了核心技術(shù),然后申請
領(lǐng)導(dǎo)要當(dāng)架構(gòu)師。
其實,我開始做的也僅僅是公共代碼員。但是,很快面臨了一個尷尬。
簡單的,雖然可能每個開發(fā)組都重復(fù)寫同樣類似的代碼,但是由于簡單,所以每個業(yè)務(wù)開發(fā)組都自己寫了。
復(fù)雜的,往往業(yè)務(wù)開發(fā)組組長都認(rèn)為這個功能是自己這個組的個性功能,所以還是自己寫。
所以,只有人們解決不了來找我時,我才能上場。
這干坐著不是回事。我得自己想轍。
于是,我在忙“公益事務(wù)”做活雷鋒之余,看到他們在扎堆開會我就主動去旁聽。每次我都能提出很獨到的
見解。并且能幫助他們寫公共抽象代碼,能幫助他們提高不少工作效率。所以他們非常愿意讓我旁聽,并且
聽取我的意見。我也能很快寫完讓他們用。他們一用,發(fā)現(xiàn)果然好用,而且不用他們自己寫代碼了,功能實
現(xiàn)的還非常巧妙公用,性能也好穩(wěn)定性也好擴(kuò)展性也好。到后來,每次開會都主動叫我。這樣,我的工作就
越來越多了。
隨著各個業(yè)務(wù)組不同差異的需求都希望我來幫他們抽象出公共的,我就在思考我手里的這部分代碼。我不能
今天他們提一個我寫一個。他們倒是輕松了,但我手里就好似一盤散沙一樣。于是,我不斷重構(gòu)我的公共代
碼,架構(gòu)體系框架就這樣慢慢成型了。各種各樣公共工具,調(diào)試工具、優(yōu)化工具、動態(tài)設(shè)計工具,凡是能幫
助業(yè)務(wù)開發(fā)組人員加快效率的,我都做了工具或?qū)懥斯埠瘮?shù)DLL。盡量簡單易用,不讓他們覺得麻煩或不順
手。
過去,各個業(yè)務(wù)開發(fā)組過去是開發(fā)人員素質(zhì)不齊,有人責(zé)任心強(qiáng),有人隨意;有人細(xì)心,有人粗心;有人理
解客戶業(yè)務(wù)深刻,有人理解不深刻。所以開發(fā)出來的質(zhì)量良莠不齊。自從這樣做了以后,各個組寫的代碼少
,很多都是我寫的公共代碼。我的技術(shù)好,寫的代碼質(zhì)量高,而且是公共的,有錯誤,一改,大家都沒有問
題了。所以我們整體的軟件產(chǎn)品的產(chǎn)品質(zhì)量、生產(chǎn)速度都提高了不少。
我發(fā)現(xiàn),大家越找我,各種需求交織在一起,越復(fù)雜,我就越需要更深入的學(xué)習(xí)技術(shù),深刻理解各種技術(shù)的
差異性和適用領(lǐng)域,去思考各項技術(shù)的發(fā)展歷史、未來趨勢,并且自己做DEMO,看能不能更好的解決大家的
問題。因此,我的技術(shù)能力也越來越高。如果我不去解決這些不去第一線想也想不到的客戶需求,我根本就
想像不出我某項技術(shù)還能這樣用。
這就是我的螺旋上升之路。
我那天重翻上個月的《程序員》雜志,看到了我朋友周愛民寫的一篇《做人、做事、做架構(gòu)師-架構(gòu)師能力模
型解析》,他也提到四點,技術(shù)能力、業(yè)務(wù)能力、人際關(guān)系、個人內(nèi)在素質(zhì)。和我的情況很類似。
有一部分所謂的架構(gòu)師,技術(shù)超深厚,框架堪比Spring之類,但自己一個人悶頭寫框架不斷優(yōu)化,力竭使用
最先進(jìn)的技術(shù)思想,希望把最豪華的設(shè)計模式融進(jìn)去,希望把OSGi融進(jìn)去,希望把AOP融進(jìn)去,全無視那些想
利用框架減輕自己工作量提高自己工作效率的應(yīng)用功能開發(fā)同事。這是在用公司工資玩技術(shù)呢,還是在滿足
個人技術(shù)幻想呢,還是在實驗?zāi)兀康降自诟蓡??價值在哪里?
還有的人不會推廣自己的框架。不善言辭,就幻想著技術(shù)總監(jiān)能夠通過行政命令讓大家必須用框架,能不自
己寫代碼就不自己寫代碼,能交給框架做的就交給框架做。但技術(shù)總監(jiān)號召完了,大家仍然我行我素,各自
開發(fā)為政,讓框架開發(fā)者很孤單。
還有的人也不會推廣自己的框架,沉迷在自己的理想世界。好不容易技術(shù)總監(jiān)召集大家讓大家來聽聽框架如
何應(yīng)用,但自說自話,滿口自己最得意的詞匯,聽得業(yè)務(wù)功能開發(fā)人員云山霧罩。大家問些問題,如這樣的
業(yè)務(wù)開發(fā)難題,框架怎么解決?于是,框架開發(fā)員就和業(yè)務(wù)開發(fā)員爭論了起來??蚣荛_發(fā)員覺得這根本就不
能答應(yīng)客戶這種變態(tài)的需求,而業(yè)務(wù)開發(fā)員說這就是現(xiàn)狀??蚣荛_發(fā)員說你可以這樣這樣,業(yè)務(wù)開發(fā)員說這
樣太麻煩,框架開發(fā)員立刻還口這還麻煩?于是雙方各執(zhí)一詞,框架也沒推廣成功。
我手底下有個框架開發(fā)員。他的技術(shù)渴望很強(qiáng)烈,為了技術(shù)難題攻克,可以不吃不睡。并且技術(shù)敏感度很強(qiáng)
,學(xué)習(xí)也快。所以當(dāng)時我感覺他是個程序員的料,就把他拉到我的手下。
但是有個問題,他寫出的框架代碼,在平時開發(fā)業(yè)務(wù)功能的時候挺麻煩。大家可能需要的是一把鐵鍬,但是
他卻給大家N根不同長度不同粗細(xì)不同材質(zhì)的木棍,N個不同形狀不同用途的鐵鍬頭。大家會有N種組合。不僅
導(dǎo)致他寫代碼老超任務(wù)期,而且也讓使用人感覺沒多大幫助。使用起來復(fù)雜,而且還得配置這個配置哪個,
需要注意的地方太多。業(yè)務(wù)開發(fā)組的同事就不愿意用,還不如把代碼自己直接寫死了得了。
超期還會影響業(yè)務(wù)功能開發(fā)組的使用。本來人家是為了想加快自己的工作效率。你答應(yīng)好這個星期給業(yè)務(wù)開
發(fā)組提供一個功能,但你沒有拿出來。就耽誤人家進(jìn)度。你多次拿不出來,人家業(yè)務(wù)開發(fā)組還不如自己開發(fā)
一個呢,求人不如求己。
我最后警告他:如果你認(rèn)為自己技術(shù)夠牛,那么你必須證明你能很快做出來。如果你認(rèn)為自己技術(shù)夠牛,最
好能牛到,只提供一個函數(shù)就解決了他們的問題。別這個代理類,那個聚合類,這個唯一實例類。最好連參
數(shù)也沒有,大家調(diào)用一下寫一句代碼就OK。甚至你做的好,大家都不用調(diào)用你的代碼,你可以包含在基礎(chǔ)框
架中,你自己去判斷什么時候什么應(yīng)用需要執(zhí)行這個動作。如果你認(rèn)為自己技術(shù)夠牛,那么在業(yè)務(wù)功能需求
發(fā)生變化的時候,你能夠保證接口不變的情況下還能適合變化,這才你夠牛。別讓業(yè)務(wù)開發(fā)組的人跟著你也
得改他們自己的代碼,那樣的設(shè)計就很爛了。
小伙聽了我的話。進(jìn)度保證,代碼接口簡潔。
他說,你真高。我感覺現(xiàn)在我的技術(shù)比過去進(jìn)展飛快??磥砣瞬槐疲遣粫约簞?chuàng)新更好更快的方法的,老
認(rèn)為自己現(xiàn)有的方法已經(jīng)不能優(yōu)化了。我現(xiàn)在發(fā)現(xiàn),很多我過去寫的東西還可以做的更好,我準(zhǔn)備在開發(fā)任
務(wù)之余優(yōu)化代碼,但肯定保證不影響大家,接口還跟過去一樣,我要重構(gòu)一下。
我對小伙的成長感到欣慰。
但是,小伙還有一個沒有逾越的鴻溝。這個問題不解決,我知道,他不會成為一個真正的獨立的架構(gòu)師。
我復(fù)查過他的代碼,由于他對業(yè)務(wù)沒有深刻理解,所以考慮了N多種情況,給自己以后的修改留下了后路。但
也因此代碼量大,開發(fā)周期長無法適應(yīng)越來越短的客戶需求響應(yīng)時間,可閱讀性不強(qiáng),功能復(fù)雜,穩(wěn)定性困
難。但我從客戶行業(yè)出發(fā),很多情況他其實都是自己假想的,而且想錯了。
我指出了他的問題。他問我該怎么學(xué)習(xí)業(yè)務(wù),他又沒有機(jī)會到客戶一線去實施,也不接聽客戶電話,客戶需
求都是業(yè)務(wù)開發(fā)組的人跟他說的。
最了解客戶業(yè)務(wù)的,是在一線做客戶咨詢、做客戶實施的人員。其次是做客戶定制化、客戶服務(wù)支持的人員
。最不了解客戶的,就是架構(gòu)組的人員。但恰恰要命的是,架構(gòu)組的人員做的功能是大家的工作基礎(chǔ),如果
基礎(chǔ)設(shè)計錯誤,那傳遞的“牛鞭效應(yīng)”破壞力就很大。所以,架構(gòu)必須了解業(yè)務(wù)。
我了解業(yè)務(wù)的思路,和我了解技術(shù)是一個思路,都是來龍去脈法,研究一項事情的過去、現(xiàn)在、未來,以及
和這件事情關(guān)聯(lián)的其他事情,研究方法也如法炮制。
你要制造的是卡車還是轎車,你得明確好。你是要造100萬的轎車,還是5萬塊錢的轎車,也得定好。你是要
制造一輛可以自由改裝的轎車呢,還是一輛只可以大致改裝一些的轎車的,也得定好。這些疑問,都是和咱
們面臨的客戶有關(guān)。而我們能面臨什么層次的客戶,和咱們公司的實力、品牌、組織規(guī)模、盈利要求有關(guān)。
你如果是一個小公司,想做百萬大單只能做的一蹋糊涂。你如果是個大公司,你老去競爭那些5萬塊的小單,
做一個賠一個。所以一個公司的出身就決定了它的競爭地位和它的目標(biāo)群。我們要為這個目標(biāo)群服務(wù),所以
我們就不要做一個百變金剛的架構(gòu)。公司有公司的目標(biāo),公司招了你給你付工資,就是為了讓你為目標(biāo)客戶
群服務(wù)。如何更快更好更有質(zhì)量的服務(wù),就是公司的目標(biāo)。我們就是為了幫助公司實現(xiàn)這個目標(biāo)。
我一般都是把我們這個產(chǎn)業(yè)的競爭格局現(xiàn)狀了解清楚,我們的過去現(xiàn)在,競爭對手的過去現(xiàn)在都了解清楚。然后我去研究我們的客戶行業(yè)的競爭格局、層次現(xiàn)狀。看看這個客戶行業(yè)盤子,三教九流到底多大多復(fù)雜,
我們現(xiàn)在是占了多大,我們還能占領(lǐng)哪些客戶群。
然后我就研究客戶行業(yè)目前的挑戰(zhàn)、機(jī)遇、困境。能解決其中一兩個問題,就是咱們的競爭亮點。如果作為
軟件一點都解決不了這些業(yè)務(wù)困境,我就思考如何讓產(chǎn)品做的更易用。微軟不就靠著易用發(fā)家的么?
最后我會去研究我們公司現(xiàn)有的研發(fā)優(yōu)勢和弱勢、實施服務(wù)銷售的優(yōu)勢和弱勢,找到適合我們突破的地方,
具體歸研發(fā)能承擔(dān)能起作用的事情,我就會去動員做。脫離現(xiàn)實資源現(xiàn)實矛盾現(xiàn)實包袱的改良,是無法做到
改良的。
我還關(guān)心各種新的技術(shù)應(yīng)用??赡苓@項技術(shù)很久了,但大家都沒有想過還能這樣用。所以,我常常在媒體上
關(guān)注這些、思考這些、在論壇上和業(yè)界交流這些。對于新的技術(shù),要研究原理,要嘗試,但不要沖動引入到
商品生產(chǎn)中。我們不是自己在創(chuàng)業(yè)在玩在實現(xiàn)自己的夢想。我們承擔(dān)的是公司所有人都要吃飯的產(chǎn)品。如果
有閃失,這么多人以及他們的家庭都要受到影響。這不是鬧著玩。
當(dāng)我研究完業(yè)務(wù)領(lǐng)域的這些大的框框以后,每逢有業(yè)務(wù)同事跟我交流客戶需求,我總能把這個需求和我的業(yè)
務(wù)框架聯(lián)系在一起,把這個需求歸好類。并且能判斷出這個需求是個反趨勢的需求,還是個短期眼光的需求
,還是個長遠(yuǎn)發(fā)展的需求。
很多人都在抱怨說需求老變化。其實,不是客戶需求在變,而是你對客戶的需求老是不同思路去理解。我心
中有業(yè)務(wù)框架,有過去,現(xiàn)在,未來,所以能識別出一個需求是穩(wěn)定的還是臨時拍腦門想出來的。有時候,
有人向我提一個需求,我會眼睛一亮,對,這個需求符合未來發(fā)展,我就會很快加入。所以,我曾經(jīng)在做實
施經(jīng)理的時候,老是能很容易說服客戶,讓客戶聽從我的意見,就是由于我想的比他們還要遠(yuǎn)還要周全。好
多程序員說客戶非要某個功能不做不行,就說明這個程序員并沒有理解客戶??蛻舨⒉皇悄莻€非要和你作對
的人,他只想解決他的問題??赡苣悴焕斫馑恼嬲磫栴}而且你又提不出更好的方案,所以他要跟你急
,要讓你必須實現(xiàn)某個功能。
只有你不斷游走在業(yè)務(wù)過去現(xiàn)狀未來與技術(shù)過去現(xiàn)狀未來,你做的架構(gòu)才是真正的實用、彈性、易用,而且
最小成本,不走彎路,不多花開發(fā)精力。
我們需要架構(gòu),不就是為了達(dá)到這個目的么。
|