從程序員到架構(gòu)師的方法與邏輯
架構(gòu)師是什么?
架 構(gòu)師這詞其實(shí)很有意思,很多人的Title是這個(gè),但其實(shí)我們對(duì)架構(gòu)師都干什么并沒有太統(tǒng)一的認(rèn)識(shí)。往大了說,比爾蓋茨當(dāng)年好像也稱自己為架構(gòu)師,往小了 說隨便一個(gè)小的軟件上做設(shè)計(jì)的也說自己是架構(gòu)師。所以如果把這個(gè)詞泛化而不局限于特定的場(chǎng)景,估計(jì)單是說清楚什么是架構(gòu)師就要花費(fèi)不少口水。下面我們用一 個(gè)取巧的辦法,在一個(gè)具體的場(chǎng)景下來看看,架構(gòu)師都該干什么,而不把這個(gè)詞泛化,如果在特定場(chǎng)景下這個(gè)角色應(yīng)該干什么清楚了,那它就可以為其它場(chǎng)景下提供 不錯(cuò)的參考。
我 們只考慮從頭開發(fā)一款產(chǎn)品的場(chǎng)景,不考慮這款產(chǎn)品可能是個(gè)家族,可能需要在公司里與許多東西配合這樣繁瑣的事情。這樣問題就簡(jiǎn)化成:當(dāng)我們要開發(fā)一款新產(chǎn) 品的時(shí)候,架構(gòu)師都要干些什么?為讓事情更具體,我們進(jìn)一步假設(shè)公司想做一個(gè)Trello,Worktile這樣的協(xié)同辦公工具。
在產(chǎn)品初期除了UI這類東西,還能明確的一些關(guān)鍵需求大概是這樣:
- 簡(jiǎn)單、迅速,追求***的用戶體驗(yàn),這時(shí)也許能想到看板這樣的功能
- 打入社交元素(任務(wù)分配與溝通時(shí)打入信息流的機(jī)制)
- 移動(dòng)端支持
- 公司判斷:如果產(chǎn)品能在1年內(nèi)上線,時(shí)機(jī)比較好
其他的需求呢就是感覺上肯定有,但暫時(shí)說不清楚
基于這樣的簡(jiǎn)單提示,長(zhǎng)做程序的可能腦子里會(huì)立刻冒出來無數(shù)東西,比如:
- 快的確保?
- 看板里拖動(dòng)的實(shí)現(xiàn)?
- SaaS時(shí)伸縮性的確保?
- 數(shù)據(jù)庫中表的設(shè)計(jì)?
- 數(shù)據(jù)庫類型的選擇?
- 移動(dòng)端的支持方式?
- 人員的現(xiàn)狀?
- 迭代式開發(fā)的支持?
- ... ...
但顯然不是每個(gè)事情都要在架構(gòu)設(shè)計(jì)階段搞定,否則等于是被弄蒙了,這時(shí)候架構(gòu)師的一個(gè)關(guān)鍵職責(zé)就是要能區(qū)分出哪些東西預(yù)先需要搞定,而哪些東西則要在迭代過程中解決。
一般來講重置成本越大,牽涉的人越多的事情越應(yīng)該由架構(gòu)師預(yù)先搞定,否則就容易做無用功,對(duì)開發(fā)工作產(chǎn)生致命傷害。具體來講這類事情由三個(gè)核心部分組成:
- 選定Tech Stack
- 概要設(shè)計(jì),確立分工的基礎(chǔ)
- 協(xié)同方式
下面來分別解釋下這三個(gè)方面的具體含義。
選定Tech Stack是指要選定包括編程語言,基本框架等一系列東西,比如Trello選完之后大致是下面這個(gè)樣子:
這 事情幾乎是不可重置的,因?yàn)橹刂贸杀疽呀?jīng)到了正常團(tuán)隊(duì)不可能負(fù)擔(dān)的地步。所以Tech Stack與待開發(fā)產(chǎn)品的吻合程度是非常體現(xiàn)架構(gòu)師價(jià)值的地方。選了Tech Stack但發(fā)現(xiàn)無法達(dá)成產(chǎn)品目標(biāo)是架構(gòu)設(shè)計(jì)上最差的結(jié)果,也正因?yàn)檩敳黄?,在這個(gè)環(huán)節(jié)上可以慎重些。這種Tech Stack的選擇受限于上述所說的關(guān)鍵需求,比如快,支持移動(dòng)端等。也就是常說的從需求的模型想技術(shù)模型的映射。
了 解些技術(shù)的應(yīng)該一眼可以看出來上面這張圖是MEAN(MongoDB,Express,AngularJS。。。,NodeJS)架構(gòu),這架構(gòu)滿足上面關(guān) 鍵需求是沒問題的,但如果關(guān)鍵需求里有一條叫以靈活的插件結(jié)構(gòu)來滿足不同用戶的定制化需求,上面這架構(gòu)可能就有點(diǎn)麻煩了。
不管怎么樣Tech Stack架構(gòu)師***個(gè)需要搞定的事情,沒這個(gè)什么活也干不了。
再 其次則是相對(duì)比較傳統(tǒng)一點(diǎn)的部分,不管從哪里開始迭代,總是要切分前端后端的職責(zé),設(shè)計(jì)彼此交互的接口,要區(qū)分出來哪些是純工具型的模塊(比如日志),哪 些是基礎(chǔ)設(shè)施型的(比如用戶管理與權(quán)限),哪些是可以徹底進(jìn)行迭代的(比如具體的某個(gè)功能)。這些東西之間是有一種內(nèi)在的時(shí)序關(guān)聯(lián)的,不是簡(jiǎn)單一句:我們 迭代吧,我們測(cè)試驅(qū)動(dòng)開發(fā)吧,就可以的,那會(huì)導(dǎo)致很大的混亂,所以這里也是架構(gòu)師要扮演角色的地方。傳統(tǒng)上管這個(gè)叫概要設(shè)計(jì),雖然這詞現(xiàn)在不怎么用了,但 這詞其實(shí)還不錯(cuò)的。當(dāng)然架構(gòu)師不一定要一個(gè)人搞定所有這些事情,而是要肩負(fù)起協(xié)調(diào)大家搞定這些事情的職責(zé)。這個(gè)地方依賴于產(chǎn)品的類型對(duì)業(yè)務(wù)知識(shí)的要求程度 不同:一般來講越是面向個(gè)人的產(chǎn)品,在業(yè)務(wù)知識(shí)上要求越低;越是面向企業(yè)的產(chǎn)品業(yè)務(wù)知識(shí)的要求越高。簡(jiǎn)單講做天氣應(yīng)用的時(shí)候可能直接做就行了,但做財(cái)務(wù)應(yīng)用時(shí)了解財(cái)務(wù)的某些知識(shí)就挺必須的。
***一項(xiàng)則是分工后的一種協(xié)作的方法,這里面包含著分支策略,持續(xù)集成策略等。
顯然的,下面兩種分支策略下,團(tuán)隊(duì)的協(xié)作方式不一樣.
這是又一個(gè)全局性的工作,干活前需要預(yù)先定下來應(yīng)該也是沒疑問的,但是不是架構(gòu)師搞定這事上,不同人的認(rèn)知可能會(huì)不一樣,有的人會(huì)認(rèn)為應(yīng)該是項(xiàng)目經(jīng)理類的角色來搞定這事情。我個(gè)人則堅(jiān)持認(rèn)為理想情形下應(yīng)該架構(gòu)師搞定這事,因?yàn)榉种Р呗缘仁芗夹g(shù)的約束更大。
這就是我理解中架構(gòu)師的要干的三類活:選擇Tech Stack,概要設(shè)計(jì)來確立分工的基礎(chǔ),確立協(xié)同的方式。
在 開發(fā)產(chǎn)品時(shí),這三樣事情不搞定,迭代都不好迭代。抽象點(diǎn)來看是這樣:假設(shè)說在現(xiàn)有人員的基礎(chǔ)上,預(yù)先搞定某問題需要耗費(fèi)的成本為X,而迭代后,事到臨頭再 處理,其耗費(fèi)的成本為Y,那么無疑的Y>X的問題都應(yīng)該是盡可能預(yù)先處理的問題,而不能以迭代為借口堂而皇之的進(jìn)行忽視。而上述三方面問題,基本上 是Y>X這類。
如何成為架構(gòu)師?
首先想說的是程序員不一定要成為架構(gòu)師的,優(yōu)秀的程序員一樣很有價(jià)值,但關(guān)鍵要看技術(shù)領(lǐng)域,我在程序員可以只關(guān)心技術(shù)么? 專門說過這事,這里不再展開。
真要想成為架構(gòu)師事實(shí)上總是有兩類方法,這兩類方法倒不局限于架構(gòu)師的學(xué)習(xí),而是普適于任何學(xué)習(xí)。
一 種是從概念規(guī)則到實(shí)踐,一種則是從實(shí)踐總結(jié)出概念和規(guī)則。數(shù)學(xué)更近似前者,而歷史更近似后者。當(dāng)我們?cè)噲D先抽象出什么是架構(gòu)設(shè)計(jì),架構(gòu)設(shè)計(jì)又有那些原則, 之后再讓大家了解現(xiàn)實(shí)中的架構(gòu)設(shè)計(jì)如何做時(shí),無疑的采取的也是前者的方式,也就是數(shù)學(xué)的方式。這種方式在現(xiàn)實(shí)中比較常見,但在邏輯上是有問題的:正是因?yàn)?對(duì)架構(gòu)設(shè)計(jì)的不理解,才嘗試學(xué)習(xí)架構(gòu)設(shè)計(jì),即如此想學(xué)習(xí)的人天生在了解架構(gòu)設(shè)計(jì)的概念與原則會(huì)遭遇困難。
出 于這樣一種考慮,***的辦法其實(shí)是先了解一些最基本概念,比如前面說的那些,再了解一些最基本的原則,比如:正交,信息隱藏等。之后就不在抽象概念層面打 轉(zhuǎn)了。而了解多個(gè)現(xiàn)有典型產(chǎn)品的架構(gòu),比如上面說的Trello,WordPress等。這時(shí)候***對(duì)產(chǎn)品歸類,在特定類別下抽象出來一些典型的架構(gòu)模 式。比如:軟硬一體產(chǎn)品的架構(gòu),CMS的架構(gòu)等。這樣一來,如果一個(gè)人可以主要學(xué)習(xí)其中之一,順道了解其余,那就可以比較迅速的掌握架構(gòu)設(shè)計(jì)的知識(shí),至少 是上面說的架構(gòu)設(shè)計(jì)中的前兩類知識(shí):Tech Stack的選擇與概要設(shè)計(jì)。在開源的時(shí)代里,這已經(jīng)成為一個(gè)人坐在家里就可以完成的事情了。
一點(diǎn)呼吁
***做一點(diǎn)呼吁?,F(xiàn)在各種架構(gòu)設(shè)計(jì)的課程還是比較多的,但基本上都是按照***條思路來的,比如:講架構(gòu)設(shè)計(jì)時(shí)會(huì)去嘗試把架構(gòu)設(shè)計(jì)分解為邏輯架構(gòu),運(yùn)行架構(gòu) 等。從身邊人的效果來看,普遍不太理想。有實(shí)力的培訓(xùn)機(jī)構(gòu)可以嘗試總結(jié)架構(gòu)的模式,以一個(gè)總綱帶領(lǐng)幾個(gè)典型領(lǐng)域的架構(gòu)分析,比如:CMS就參照 WordPress來講架構(gòu),基礎(chǔ)JavaScript庫就參照Backbone這種等。也不用太多,覆蓋典型的4~5個(gè)領(lǐng)域就可以解決很大的問題了。這 應(yīng)該會(huì)更有效果,但課程創(chuàng)建上會(huì)比較吃力些,真想做的人要有思想準(zhǔn)備。我個(gè)人曾經(jīng)嘗試和南京的TalenCamp按照第二條路來設(shè)計(jì)課程,但由于各種原因 暫時(shí)進(jìn)展不太大。
本文鏈接:http://www.apkbus.com/android-11361-1.html