全棧工程師-通往架構(gòu)師之路
- 首先我們看什么是架構(gòu)師?架構(gòu)師應(yīng)該具備哪些能力?
- 大家都知道很多公司都有架構(gòu)師這個(gè)職位,但是我想告訴大家的是看一個(gè)人是不是架構(gòu)師不是看職位,而是看他所具備的能力以及正在做的事,所以有架構(gòu)師頭銜的人不一定具備架構(gòu)師的能力,而不是架構(gòu)師的人卻在做著架構(gòu)師的工作。
- 架構(gòu)師類似于建筑行業(yè)的總設(shè)計(jì)師,通常在一個(gè)軟件項(xiàng)目中,架構(gòu)師需要完成軟件項(xiàng)目中所有技術(shù)環(huán)節(jié)的設(shè)計(jì),架構(gòu)師雖然說不用親自編寫所有代碼,但是架構(gòu)師會(huì)對(duì)項(xiàng)目中所有運(yùn)用的技術(shù)環(huán)節(jié)了如指掌。
- 因此架構(gòu)師既可以是一個(gè)很簡(jiǎn)單的工作,也可以是一個(gè)具備超高難度的工作。而具體的難度系數(shù),取決于具體的項(xiàng)目類型。就好像蓋一個(gè)兩層小樓,和一個(gè)跨海大橋,對(duì)架構(gòu)師的要求截然不同。
- 在今天的課程中,陳老師給大家畫了一些不同類型項(xiàng)目的架構(gòu)圖。如果想要成為架構(gòu)師,大家可以看一下要成為架構(gòu)師針對(duì)不同項(xiàng)目類型需要掌握的技術(shù)。
- 大家可以看到框里面并列列出了很多技術(shù),只要位于同一層的技術(shù)掌握一個(gè)就可以完成完整的軟件流程設(shè)計(jì),不要求掌握全部。

Paste_Image.png
- 比如說我們現(xiàn)在目標(biāo)任務(wù)是開發(fā)一個(gè)自主品牌的mp3播放器,我們的架構(gòu)師需要懂硬件,比如單片機(jī),傳感器,聲音設(shè)備,再利用匯編或者C語言,來對(duì)該電子系統(tǒng)編寫相應(yīng)的程序,就可以完成這樣的一套mp3程序開發(fā)。
- 但軟件的架構(gòu)師在不斷進(jìn)化著,在計(jì)算機(jī)發(fā)明的初期,幾乎大部分應(yīng)用程序都是直接針對(duì)硬件來編寫的,但是這樣會(huì)導(dǎo)致程序的通用性差,所以才出現(xiàn)了操作系統(tǒng)。在目前市場(chǎng)上流通的大部分軟件都是工作在操作系統(tǒng)之上的。
- 因此我們可以看見第二張圖的這樣的架構(gòu)。

Paste_Image.png
- 編寫這樣的應(yīng)用程序需要我們架構(gòu)師了解硬件,了解操作系統(tǒng),并且能夠使用C,C++,VB,等編程語言調(diào)用操作系統(tǒng)SDK完成軟件功能開發(fā)。
由操作系統(tǒng)去跟硬件系統(tǒng)打交道,這樣對(duì)于開發(fā)人員的要求就降低了很多,同時(shí)應(yīng)用程序的通用性會(huì)變得更好。 - 再看看第三張圖

Paste_Image.png
- 隨著計(jì)算機(jī)軟件的發(fā)展,我們發(fā)現(xiàn)很多軟件都是在和數(shù)據(jù)打交道,用戶數(shù)據(jù)需要記錄到系統(tǒng)中,同時(shí)應(yīng)該能快速的檢索數(shù)據(jù),因此在我們的單機(jī)應(yīng)用中出現(xiàn)了數(shù)據(jù)庫這么一類應(yīng)用程序。
在需要存儲(chǔ)數(shù)據(jù),搜書數(shù)據(jù),以及對(duì)數(shù)據(jù)加工處理統(tǒng)計(jì)的時(shí)候可以把這些工作交給數(shù)據(jù)庫去處理。 - 做這類應(yīng)用軟件的開發(fā)工程師,對(duì)硬件和操作系統(tǒng)了解即可。需要他精通數(shù)據(jù)庫,并且能用任意語言調(diào)用系統(tǒng)提供的SDK。
- 在看看第四張圖

Paste_Image.png
- 這個(gè)是C/S應(yīng)用程序架構(gòu),這里的客戶端架構(gòu)與第三張圖單機(jī)應(yīng)用類似,唯一不同的是在數(shù)據(jù)的來源的上作出了改變。原本的單機(jī)應(yīng)用程序數(shù)據(jù)存在本地,但是一個(gè)軟件系統(tǒng)如果有多人使用多個(gè)客戶端連接的時(shí)候,不可能把數(shù)據(jù)庫再放到莫一臺(tái)客戶機(jī)中。
- 解決方案就是讓數(shù)據(jù)庫通過網(wǎng)絡(luò)對(duì)客戶端提供數(shù)據(jù)服務(wù)。直接通過客戶端遠(yuǎn)程連接直接操作數(shù)據(jù)庫這種方式也是不可以的,因?yàn)閿?shù)據(jù)庫如果直接對(duì)外提供數(shù)據(jù)服務(wù),那么凡是能連接到該網(wǎng)絡(luò)的用戶都可以繞過客戶端操作數(shù)據(jù)庫,這樣數(shù)據(jù)安全就得不到保障。
- 因此出現(xiàn)了Server,我們通過服務(wù)器端程序來操作數(shù)據(jù)庫,客戶端程序只能選擇與服務(wù)器端交互,所有的業(yè)務(wù)操作由服務(wù)器端完成,這種模式就是C/S架構(gòu)。
- 完成C/S架構(gòu)的架構(gòu)師就比做單機(jī)應(yīng)用的架構(gòu)師難度大很多,不僅要懂得單機(jī)應(yīng)用開發(fā)所需要的知識(shí),還需要掌握網(wǎng)路數(shù)據(jù)庫系統(tǒng),以及web服務(wù),socket服務(wù)等技術(shù)。
- C/S應(yīng)用程序架構(gòu)存在一些缺點(diǎn):需要更新所有已安裝的客戶端版本,而且會(huì)出現(xiàn)多個(gè)版本并存的情況,后期維護(hù)代價(jià)極高,而且很不方便。
- 因?yàn)檫@些原因,就出現(xiàn)了B/S這些架構(gòu)的軟件。

Paste_Image.png
如圖所示,我們可以看到此架構(gòu)的服務(wù)端與第四張的服務(wù)器端基本一致。
主要區(qū)別是B/S架構(gòu)的應(yīng)用程序不需要安裝客戶端程序,而是使用大部分的計(jì)算機(jī)都有安裝的瀏覽器來作為系統(tǒng)前端來與用戶交互,而瀏覽器加載的內(nèi)容全部來由服務(wù)端輸出。這樣B/S的架構(gòu)師難度相對(duì)來說比C/S架構(gòu)師低很多,并且有諸多的成熟的解決方案,比如:java的javaee架構(gòu),微軟的asp.net架構(gòu),完全開源的lamp架構(gòu),都是很成熟的解決方案。
這樣架構(gòu)的優(yōu)點(diǎn)在于因?yàn)榇嬖诖罅康某墒斓慕鉀Q方案,只需要一臺(tái)可連入網(wǎng)絡(luò)的服務(wù)器,就可以讓整個(gè)系統(tǒng)運(yùn)轉(zhuǎn)起來。開發(fā)速度快,運(yùn)營(yíng)成本低。這種解決方案被廣泛接納。所以做這樣架構(gòu)的程序員數(shù)量很多,也因此往往不被當(dāng)做架構(gòu)師來看待。但是做這樣架構(gòu)的應(yīng)用程序設(shè)計(jì)也架構(gòu)設(shè)計(jì)中的一種。
我們來看第6張圖

Paste_Image.png
- 從2010年以后,智能手機(jī)在國(guó)內(nèi)大量普及,幾年時(shí)間誕生了數(shù)百萬的App與手機(jī)游戲,往往一個(gè)項(xiàng)目既擁有自己的網(wǎng)站,又擁有獨(dú)立的APP,而且作為一個(gè)整體的系統(tǒng),iOS,安卓,與網(wǎng)頁的數(shù)據(jù)應(yīng)該是一致的。
- 那么要做到這樣的架構(gòu)設(shè)計(jì)的話,我們需要讓我們的ios,安卓客戶端共用我們的服務(wù)端,這樣我們的多端才能保持?jǐn)?shù)據(jù)高度一致。
- 服務(wù)器端的結(jié)構(gòu)沒有太大的變化,但是軟件設(shè)計(jì)的方式產(chǎn)生了變化,原本B/S架構(gòu)中由服務(wù)端向?yàn)g覽器輸出相應(yīng)的html,css,js等靜態(tài)內(nèi)容即可,但如果涉及到移動(dòng)互聯(lián)網(wǎng)應(yīng)用開發(fā),我們會(huì)將我們的應(yīng)用程序規(guī)范化,把前端和后端完全區(qū)分開來。
- 服務(wù)器端提供數(shù)據(jù)交互服務(wù),并編寫相應(yīng)的接口,移動(dòng)端進(jìn)行接口調(diào)用,并完成界面數(shù)據(jù)填充以負(fù)責(zé)用戶交互,即便是移動(dòng)端瀏覽器,也應(yīng)采用這種方式來交互。
-
接下來看第7張圖
Paste_Image.png - 它和6張圖比較類似,但多出來幾塊。我們把橫線以上的部分叫服務(wù)端,橫線以下的叫前端。我們?cè)谝苿?dòng)互聯(lián)網(wǎng)絡(luò)時(shí)代,經(jīng)常會(huì)涉及到自己的平臺(tái)與第三方平臺(tái)的交互,我們的應(yīng)用在接入支付寶,微信,微博等功能后,還會(huì)涉及到與第三方平臺(tái)的功能交互。
- 通常需要我們通過服務(wù)器發(fā)起請(qǐng)求調(diào)用第三方的API,并且為第三方的平臺(tái)保留回調(diào)的接口,因此在制作這樣的應(yīng)用程序開發(fā)的時(shí)候,架構(gòu)師除了要掌握移動(dòng)互聯(lián)網(wǎng)絡(luò)的技術(shù)外,還需要對(duì)第三方提供的功能與規(guī)范以及相應(yīng)接口有充分的了解。
- 來看第8張圖

Paste_Image.png
- 如果只是從功能實(shí)現(xiàn)來說,能夠按照第7張圖完成架構(gòu)設(shè)計(jì)的架構(gòu)師,已經(jīng)能滿足需求。但是在實(shí)際運(yùn)營(yíng)的項(xiàng)目中,除了有功能需求以外,還要有質(zhì)量需求,比如:網(wǎng)站的負(fù)載能力,網(wǎng)絡(luò)并發(fā)連接數(shù),系統(tǒng)的數(shù)據(jù)吞吐量,項(xiàng)目是否具有擴(kuò)容能力等。
- 之前所展示給大家的所有架構(gòu),都是基于單服務(wù)器架構(gòu)來設(shè)計(jì)的,如果只有一臺(tái)服務(wù)器,無能我們?cè)鯓踊ㄥX來升級(jí)他的硬件配置,我們會(huì)發(fā)現(xiàn)很快將無法進(jìn)一步擴(kuò)容。最好的CPU,最大的內(nèi)存條也是有限度的,因此采用集群架構(gòu),才是解決問題的正確方法。
- 而第8張圖所畫的就是標(biāo)準(zhǔn)的分布式集群架構(gòu),集群的擴(kuò)容原則就是一個(gè)人干不完的活多個(gè)人一起干,讓服務(wù)器與服務(wù)器之間,進(jìn)行分工與協(xié)作。
- 而做分布式集群的架構(gòu)的架構(gòu)師,也有著較高的要求,而互聯(lián)網(wǎng)上受人敬仰的架構(gòu)師大多屬于這類。你也可以認(rèn)為這才是真正的架構(gòu)師。
- 看第9張圖

Paste_Image.png
- 服務(wù)器端同第7張,第8張可以是一致的,具體是選擇哪個(gè)服務(wù)器的架構(gòu),取決于項(xiàng)目的規(guī)模。
項(xiàng)目初期用戶量少,可以選擇單服務(wù)器架構(gòu),如果項(xiàng)目后期服務(wù)器負(fù)載壓力過大,可以重構(gòu)為分布式集群架構(gòu)。 - 第9張圖的重點(diǎn)在于項(xiàng)目前端,我們來看前端的技術(shù)架構(gòu)圖,這里所畫的是市面所流行的混合APP的架構(gòu)。
- 著名的混合APP應(yīng)用有很多,比如說支付寶手機(jī)客戶端,還有Facebook,這些應(yīng)用都是采用混合APP架構(gòu)設(shè)計(jì)的。
- 混合APP應(yīng)用使用html,和css打造用戶界面,無論是在瀏覽器,微信端,還是在APP中,都是如此。因此他具備B/S應(yīng)用程序的優(yōu)點(diǎn),可以在服務(wù)器端更新應(yīng)用內(nèi)容,并且讓應(yīng)用在ios,安卓,瀏覽器端保持高度一致性。
- 利用單頁web APP開發(fā)技術(shù),能夠讓網(wǎng)頁程序像原生應(yīng)用一樣流暢,而web APP的缺點(diǎn)在于,網(wǎng)頁js程序無法調(diào)用手機(jī)硬件功能,但是混合APP架構(gòu)可以通過微信sdk,微博sdk ,iOS bridges,安卓bridge是等方式來獲取微信APP,微博APP以及手機(jī)硬件的功能。
- 因此混合APP架構(gòu)同時(shí)具備了web APP與原生應(yīng)用的優(yōu)勢(shì),成為了市場(chǎng)上主流的移動(dòng)應(yīng)用架構(gòu)設(shè)計(jì)方法??缙脚_(tái)兼容性好,開發(fā)成本低,開發(fā)速度快。逐步取代了大量的原生應(yīng)用。這也是我們兄弟全棧工程師學(xué)習(xí)的主要內(nèi)容。
- 為什么定這個(gè)主題呢?其實(shí)我們會(huì)發(fā)現(xiàn)全盞所涉及的開發(fā)領(lǐng)域和架構(gòu)師基本一致,區(qū)別在于能力與深度
- 比如分布式服務(wù)部分,如果全盞工程師,可以使用類似Laravel框架這樣的全盞框架解決本地服務(wù),webservice ,消息隊(duì)列等問題,
- 但架構(gòu)師則應(yīng)該能深入了解其中原理,并做出相應(yīng)設(shè)計(jì)
- 全棧工程師只要加深各個(gè)領(lǐng)域知識(shí)深度,很容易向架構(gòu)師方向發(fā)展
- 當(dāng)然學(xué)習(xí)的同時(shí)也應(yīng)該注意誤區(qū),很多人以為全棧是學(xué)習(xí)linux+php+h5+移動(dòng)端,這是典型誤區(qū)
- 如果學(xué)linux,那么從組網(wǎng)做網(wǎng)絡(luò)配置,搭建文件共享或者郵件發(fā)送,web服務(wù)等都需要學(xué)習(xí)和掌握
- 學(xué)h5的話,webgl游戲開發(fā),網(wǎng)頁開發(fā)都有學(xué)習(xí),其實(shí)對(duì)于全棧或者架構(gòu)師發(fā)展來說,這樣并不好
- 如果做全棧,那么我不需要學(xué)習(xí)如何做網(wǎng)管,所以使用linux應(yīng)該集中在web服務(wù)環(huán)境上,類似,學(xué)h5,應(yīng)該著重在移動(dòng)端觸屏設(shè)備開發(fā)為主,所以劃分維度不同,
- 如果有了這個(gè)認(rèn)識(shí),就不會(huì)被誤導(dǎo),以為全?;蛘呒軜?gòu)師就是什么技術(shù)都學(xué),什么都會(huì)。我么要的是更專業(yè),學(xué)習(xí)更深。
- 相信通過今天的分享,大家對(duì)如何學(xué)習(xí),如何發(fā)展,如何成為架構(gòu)師,能有一個(gè)很好的認(rèn)識(shí)。
