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