架構(gòu)師修煉課程:透過(guò)問(wèn)題看本質(zhì)
原創(chuàng)【51CTO獨(dú)家特稿】一個(gè)剛剛從學(xué)校畢業(yè)的、致力于投身編程事業(yè)的年輕人,在投遞了n封簡(jiǎn)歷之后,終于如愿以償?shù)玫搅?**份編程的工作。如果他在求學(xué)期間沒(méi)有積累過(guò)項(xiàng)目經(jīng)驗(yàn),那么可以說(shuō)這就是他職業(yè)的起點(diǎn),他青澀的編程之路開(kāi)始了。
51CTO開(kāi)發(fā)頻道年終巨獻(xiàn):架構(gòu)師最怕程序員知道的十件事
可能他一開(kāi)始會(huì)滿腔抱負(fù)、意氣風(fēng)發(fā)的按照自己的方式完成小頭目交給自己的一些練手任務(wù),然后懊惱的發(fā)現(xiàn)小頭目對(duì)這些看似能夠完成任務(wù)的代碼大搖其頭,指指點(diǎn)點(diǎn);然后在真正進(jìn)入項(xiàng)目之后,又會(huì)被各種不知道從哪里冒出來(lái)的bug和漏洞搞得暈頭轉(zhuǎn)向……
這些問(wèn)題一方面和這位菜鳥(niǎo)程序員缺乏經(jīng)驗(yàn)有關(guān),但是在過(guò)來(lái)者看來(lái),造成這些問(wèn)題的一個(gè)主要原因正是在于,這位程序員沒(méi)能看到問(wèn)題的本質(zhì)。
而看到問(wèn)題的本質(zhì),也是架構(gòu)師所必須具備的素質(zhì)。
所謂看到問(wèn)題的本質(zhì),實(shí)際上是一個(gè)思考的層面問(wèn)題。比如說(shuō),你現(xiàn)在看到的這篇文章,從表面上看,就是你的顯示屏顯示出來(lái)了一些文字,但這明顯不是它的本質(zhì)。從內(nèi)容而言,這篇文章是一篇有關(guān)架構(gòu)師技能的文章,它是對(duì)一個(gè)職業(yè)的某一項(xiàng)能力的描述;從技術(shù)而言,這篇文章是在世界上某臺(tái)服務(wù)器上的數(shù)據(jù)庫(kù)中提取出來(lái)的某些信息,經(jīng)過(guò)漫長(zhǎng)光纜和層層協(xié)議的傳遞,經(jīng)過(guò)你的網(wǎng)線插口(或無(wú)線接收器)進(jìn)入了你的機(jī)器,通過(guò)瀏覽器解讀并最終呈現(xiàn)出來(lái)。
聽(tīng)起來(lái),這個(gè)和另一篇文章介紹的同樣是架構(gòu)師所需要的“抽象思維”有點(diǎn)像,只是方向不同:抽象思維是往高層次的升華,透過(guò)問(wèn)題看本質(zhì)則是往深層次的挖掘。
讓我們看看文章一開(kāi)始的那位菜鳥(niǎo)程序員為什么總是失敗。如果你是一位PHP程序員,那么可以參考這篇文章,里面總結(jié)了一些常見(jiàn)的問(wèn)題。最簡(jiǎn)單的一個(gè)(有時(shí)被用作面試題)可能出現(xiàn)在這樣的情況下——小頭目說(shuō):“顯示用戶提交的ID名”,然后菜鳥(niǎo)程序員大筆一揮:
- echo $_GET['username'];
小頭目閱畢自然抓狂不已,因?yàn)檫@是一個(gè)再明顯不過(guò)的安全隱患。菜鳥(niǎo)程序員被小頭目訓(xùn)了一頓,然后知道這樣做是有問(wèn)題的。
這個(gè)事情如何與通過(guò)問(wèn)題看本質(zhì)有關(guān)?這個(gè)就取決于這位菜鳥(niǎo)程序員是如何改正這個(gè)錯(cuò)誤的。如果這位程序員只是把下面的那段“合格”代碼抄襲過(guò)來(lái)并死記硬背,那么,以后等待這位程序員的大概是比較悲慘的結(jié)局——因?yàn)槁L(zhǎng)的代碼生涯中有極多類似的問(wèn)題,而等到他進(jìn)入真正的項(xiàng)目之后,犯錯(cuò)誤是有成本的。他的學(xué)習(xí)方式表示他沒(méi)有主動(dòng)避免這樣類似問(wèn)題的能力,那么他可能將會(huì)造成極大的損失,從而最終失去在這個(gè)行業(yè)的競(jìng)爭(zhēng)力。
但是,如果他了解到代碼之下,更深層次的那些機(jī)制,比如echo是如何執(zhí)行的?在什么時(shí)候執(zhí)行的?哪些字符可能導(dǎo)致安全問(wèn)題?htmlspecialchars為什么能解決這個(gè)問(wèn)題?它真的解決這個(gè)問(wèn)題了么?那么他將會(huì)一點(diǎn)一點(diǎn)的進(jìn)步,逐漸成為一個(gè)合格的程序員。
什么是本質(zhì)?將世界萬(wàn)物理解為原子,將整個(gè)互聯(lián)網(wǎng)理解成0和1,這倒的確是非常本質(zhì)了,不過(guò)并不能解答任何問(wèn)題。從問(wèn)題看本質(zhì),實(shí)質(zhì)上是一個(gè)從表層逐步深入的過(guò)程。在架構(gòu)師面對(duì)一個(gè)用戶需求時(shí),這個(gè)“用戶需求”是非常表層的——比如說(shuō),一個(gè)自動(dòng)遠(yuǎn)程備份數(shù)據(jù)庫(kù)的功能。而架構(gòu)師的主要工作,就是把這樣的“業(yè)務(wù)需求”翻譯成“技術(shù)需求”。這個(gè)過(guò)程一方面需要通過(guò)抽象思維將用戶需求提煉為啟動(dòng)、讀取、存儲(chǔ)、中斷處理等模塊,而另一方面則需要看到更深層次的網(wǎng)絡(luò)、操作系統(tǒng)、硬件等方面,以及其可靠性、穩(wěn)定性、適用性、安全性等問(wèn)題。
#T#上面述說(shuō)的是個(gè)小型需求,按照某些行業(yè)標(biāo)準(zhǔn),這頂多只能算是一個(gè)資深程序員的工作,而沒(méi)有達(dá)到“架構(gòu)”的規(guī)模——即,非大型項(xiàng)目中不存在真正的架構(gòu)師(按照王翔先生的描述,大型項(xiàng)目差不多是“100M(RMB)、B(RMB)、10B(RMB)”這些數(shù)量級(jí))。那么,讓我們看看大型系統(tǒng)的情況。以eBay為例,按照其架構(gòu)師Randy Shoup的介紹,電子商務(wù)站這樣大型的系統(tǒng)有兩個(gè)層面的功能:“垂直功能,如買、賣、搜索、付款等。水平功能,如數(shù)據(jù)庫(kù)、事件與消息系統(tǒng)、服務(wù)基礎(chǔ)設(shè)施、展示框架等。”按照編者的理解,如果說(shuō)垂直功能是抽象思維的產(chǎn)物,那么其中的水平功能的劃分則是一個(gè)架構(gòu)師“透過(guò)問(wèn)題看本質(zhì)”能力的體現(xiàn)——這些劃分體現(xiàn)了架構(gòu)師看到了表層的功能是建造在哪些因素之上的。同時(shí),架構(gòu)師要看到“電子商務(wù)站”這樣一個(gè)服務(wù)的本質(zhì),就是要提供一個(gè)多人同時(shí)在線進(jìn)行交易的平臺(tái),因此系統(tǒng)的本質(zhì)也必須包括“功能,性能,可伸縮性,可管理性,安全性,以及可用性”這些因素。否則,即使搭了個(gè)架子,沒(méi)有上述特性的系統(tǒng)是完全無(wú)法滿足客戶需求的。
看到這里我們應(yīng)該明白了,“透過(guò)問(wèn)題看本質(zhì)”并不是什么神秘的能力,而是有一定經(jīng)驗(yàn)?zāi)芰Φ某绦騿T都具備的能力。如果你在編寫(xiě)Java代碼時(shí)考慮到了JVM的性能,在編寫(xiě)PHP代碼時(shí)想到了潛在的安全問(wèn)題,甚至于在編寫(xiě)HTML+CSS頁(yè)面時(shí)考慮到了不同瀏覽器的兼容性,這些都體現(xiàn)了“透過(guò)問(wèn)題看本質(zhì)”的素質(zhì)。只是,架構(gòu)師之所以為架構(gòu)師,是在于他們?cè)诿鎸?duì)龐大系統(tǒng)之時(shí),仍然能夠敏銳的發(fā)現(xiàn)其底層之真實(shí)。這不僅需要此哲學(xué)層面的“內(nèi)功”,還需要架構(gòu)師具有多領(lǐng)域知識(shí)和經(jīng)驗(yàn)的積淀。
“透過(guò)問(wèn)題看本質(zhì)”,這也是程序員往往需要修煉十余年才有資格晉升為架構(gòu)師的主要原因之一。程序員們,好好努力吧!
本文為《架構(gòu)師害怕程序員知道的十項(xiàng)技能》中的透過(guò)問(wèn)題看本質(zhì)篇。






















