Java架構師筆記丨深入談談架構師,以及架構師該掌握的技術-巴分巴秒

架構師是一個充滿挑戰的職業,知識面的寬窄往往決定着一個架構師的架構能力,所以在這一點上我比較贊成你的學習方式,就是要閱讀大量的技術書籍,但我希望你不要僅限於軟件相關的書籍,經常泡技術論壇,一方面可以結交朋友,一方面可以增加自己的知識面。

公司的大小往往決定了所做的項目規模,一般的大項目不太可能直接總包給小公司去做,但這並不妨礙小公司可以分包到大項目的一部分。在做小項目的同時也可以積累豐富的經驗,我自己就是一個這樣的例子。

我在小公司混跡了5年多,其中也偶爾有1兩個大公司,比如三一重工,但是基本上都是小公司,從基層的程序要到公司的開發總監都做過,甚至自己還設計過包括LED顯示屏,密碼鍵盤在內的收費系統,自己聯繫廠家OEM,當然這些今天已經廣泛應用了,當時我們的客戶用上之後還是非常震撼的。

知識面的寬廣對於一名出色的架構師來說是必不可少的技能,也許很多人對架構的理解還停留在設計模式,重構,SOA等等的軟件層面,然而這僅僅是非常基本的東西,架構師的腦子裏不光需要知道讓軟件如何高效的運行,還需要知道如何去結合網絡,存儲,甚至一些文件系統的特性,比如GFS,NFS,XFS,NTFS等等,而且架構師還需要知道一些編程語言的特性,C,C++,Java,PHP,Python,Lisp,JS等等,現在是一個混合編程的時代,只瞭解一種語言,即使再精通也會使你在架構系統的時候受到很大的侷限性。

再有一點,架構師需要對數據庫技術有深刻的認識,因爲現今是一個信息時代,大量的信息都是需要存儲並檢索的,數據庫設計的不好,將會嚴重影響系統的性能,而這一點往往會被我們的設計人員忽略,他們只知道遵守那些範式而不會結合數據的特性去設計數據庫。

看你的編程情況,你好像做PHP開發比較多,PHP比較適合B/S結構的應用開發,這會限制一個架構師的思路,我建議你再學習一門適合做C/S開發的語言,拓寬自己的視野。

從一個程序員到架構師是一個很大的變化,架構師需要從大的方面考慮,而不只是考慮這個模塊該用哪種設計模式去開發。不能急於求成,也許是我自己變化的比較慢,我用了10年的時間,這10年裏,我使用超過一年的編程語言包括了delphi,C++,Java,python,使用的數據庫包括了oracle,infomix,sybase,sqlserver,mysql,javadb,sqlite等等,使用過大型機,小型機,服務器。unix,linux,windows都至少做過兩年以上的開發,這些使用和開發的經歷會大大增強一個人在做架構師這個職業時的技術素養。

Java程序員應該掌握的技術

1.通信協議

各個子系統之間要進行通信,必須要選擇一種或多種通信協議,現代比較常見的都是基於HTTP的協議。更早期,爲了追求性能,有過一些基於TCP協議的實現。建議還了解下CORBA等RPC方式。瞭解更多協議對於學習安全也有很大幫助,比如MySQL和PostgreSQL的協議都有安全的設計。

  1. 序列化

系統之間通過網絡傳輸,或者存儲到文件時,肯定只有一種格式,就是字符串。要將複雜的數據結構與字符串之間進行轉換,就需要用到序列化。簡單的序列化如JSON和XML,稍微複雜些的有protobuf、thrift等。需要了解所有這些序列化方式之間的優勢和劣勢。比如JSON和XML只能用於傳遞數據,而protobuf與thrift還可以用來做RPC協議。至少要確保每種序列化方式都自己嘗試過hello world。

  1. 數據庫

要形成自己的數據庫選取風格,就需要先對自己常用的數據庫有足夠深入的瞭解。對於關係式數據庫,除了一般的Create、Query、Delete、Update操作外。還需要能自行建立索引,數據庫的平行擴展,瞭解如何進行性能調試。以及瞭解常見查詢操作的性能級別,常見的查詢性能瓶頸點。一個較好的例子是 ‘SELECT COUNT(*) FROM table WHERE dt_create-86400>NOW();’ 。
4. 存儲

存儲分爲幾種類型。NAS等各家產品有所不同,大多是通過NFS來訪問的,這個不必多講。問題是NAS的價格很高,而且在去IOE的趨勢中很多人也不願意再用。所以經常會有基於文件系統建立小規模存儲的需求。要關注的點主要就是每個目錄下的文件數不應該太多,當一個目錄下文件數(實際是inode數量,包括文件和目錄)超過1000時,性能就很差了。所以建議的做法是將一個系統中要存儲的對象ID做16進制,隨後每2位16進製做成一級目錄。這樣可以確保每個目錄下的文件數不會超過256個。現代雲計算,如Amazon S3已經把存儲的問題解決的很好了,如果可能,儘量用好。

  1. 應用框架

此事在各個語言之間各有選擇,多注意瞭解自己關注方向的所有框架的優勢和劣勢。至少當有個毛頭孩子問你爲什麼不選擇某個最新的框架時,要有自己的觀點來給出明確的答覆。對於常見的框架,十分推薦自己重新實現一個來當作鍛鍊。實現一個WEB框架,他用了不到200行代碼就實現了。

  1. 接口

主要是指接口協議,或者RPC協議。系統之間進行RPC調用很常見,注意選擇個自己能熟練使用的,並且有所深入研究。並瞭解其常見的限制。RESTful API就是個比較常見的選擇,但是性能並不好。要自己對性能等參數有個量化的瞭解,而不是簡單的一句好或不好。短連接接口在三次握手時是串行操作,要了解其爲何耗時。

除了要在如上的各種不可或缺的組成部分中有所瞭解,還要能清楚的知道一些常用系統模塊的原理,並能夠很深入的玩起來。幾個值得注意的:

  1. HTTP服務器:常見的無非是nginx、apache,自己要能進行基本配置,包括靜態文件、fastcgi轉發等

  2. 關係式數據庫:常見的如mysql、postgresql、sqlite,自己要對每一種都有深入的瞭解。自己要做一遍常見操作的性能測試,並能牢記於心。比如sqlite雖然並不需要走網絡,但是實際查詢性能是很差的。我2008年就發現其 '<‘和’>'共同作用的查詢的例子比走網絡的mysql還慢了幾十倍。

  3. NoSQL數據庫:memcache、redis、mongodb等,近幾年有很多,挨個瞭解下其實現原理,以及各種常用操作的性能。當有需要時,要隨時能拿得出手來用。

  4. 雲計算平臺:幾種常見的雲計算平臺的應用方式要有了解,如Google的資源方式,和Amazon的VPS方式,每種雲計算平臺往往還會提供一大堆的附加服務,比如可靠數據庫,存儲,緩存等,也要分別有所瞭解。

  5. 加密/簽名技術:常見如truecrypt、openssl、gnu pg、sha1、md5、scrypt等,瞭解各種加密/簽名技術的安全性,字長等,並都能自己做過hello world。

一些網上常見的系統服務形式的架構設計也要仔細瞭解清楚。一般此類系統的開發人員,往往會通過個人博客,或者一些活動的PPT中進行講解。仔細找找會有不少收穫。值得關注的常見系統架構

  1. 博客/論壇:博客和論壇有很多,並且各個網站也都很常用,瞭解下其原理,最好自己寫個練習下。

  2. 微博:Twitter/weibo等,涉及到大量的聯表查詢,需要用多種辦法來優化查詢性能。

  3. 雲計算:雲計算的幾個常見平臺的服務提供方式,如Google和Amazon的,如果精力夠用最好了解下OpenStack等搭建私有云的方式,總的來說,這是未來的大方向。

  4. 視頻播放:在網頁上播放視頻的技術,包括基於Flash和HTML5的,各種瀏覽器對視頻的兼容性等,瞭解通過ffmpeg將一個視頻轉換爲標準mp4(HTML5可以播放的)的方式和參數

  5. CDN:瞭解應用CDN的方式,包括拆分靜態文件的域名,靜態文件版本化,Cookie拆分等相關技術

  6. OAuth:與其他網站聯合認證的方式,有多種,分別瞭解。

常見的架構設計陷阱:

  1. 用戶認證:一開始就應該花大精力設計好用戶認證系統,包括不要明文存儲密碼,包括嚴格限制Cookie和Session的使用,包括用戶認證信息的緩存等。如果需要設計一個長期運行的大系統,強烈建議使用簽名來保證Cookie的不可僞造,同時常見信息直接存儲Cookie,這樣可以避免每次Request都訪問數據庫。

  2. 靜態文件存儲:如果一開始就將靜態文件與主站內容混雜在一起,未來就是個災難,具體參考CDN的應用方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章