<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    #

    為什么使用 Redis及其產品定位

    傳統MySQL+ Memcached架構遇到的問題

    實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據加載到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:

    1. MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。

    2. Memcached與MySQL數據庫數據一致性問題。

    3. Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。

    4. 跨機房cache同步問題。

    眾多NoSQL百花齊放,如何選擇

    最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那么如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問 題,實際歸根結底最重要的是了解這些產品的定位,并且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用于解決 以下幾種問題

    1. 少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。

    2. 海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。

    3. 這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,后者是一個中心化的方案設計,通過 類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然后定期compat歸并到磁盤上,將隨機寫優化為順序寫,提高寫入性能。

    4. Schema free,auto-sharding等。比如目前常見的一些文檔數據庫都是支持schema-free的,直接存儲json格式數據,并且支持auto-sharding等功能,比如mongodb。

    面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。

            

    Redis適用場景,如何正確的使用

    前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed 的功能,跟傳統意義上的持久化有比較大的差別,那么可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那么何時使用 Memcached,何時使用Redis呢?

    Redis與Memcached的比較

    1. 網絡IO模型

    2. Memcached是多線程,非阻塞IO復用的網絡模型,分為監聽主線程和worker子線程,監聽線程監聽網絡連接,接受請求后,將連接 描述字pipe 傳遞給worker線程,進行讀寫IO, 網絡層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變量加鎖,進行計數等工作,帶來了性能損耗。

      (Memcached網絡IO模型)

      Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和 select,對于單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對于這些操 作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

    3. 內存管理方面

    4. Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存 儲,內存池的方式可以省去申請/釋放內存的開銷,并且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,并且在內存仍然有很大空間時,新的數 據也可能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

      Redis使用現場申請內存的方式來存儲數據,并且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎 片,Redis跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,并把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致 swap也不會剔除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。

    5. 數據一致性問題

    6. Memcached提供了cas命令,可以保證多個并發訪問操作同一份數據的一致性問題。 Redis沒有提供cas 命令,并不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

    7. 存儲方式及其它方面

    8. Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復制等功能

      Redis除key/value之外,還支持list,set,sorted set,hash等眾多數據結構,提供了KEYS

      進行枚舉操作,但不能在線上使用,如果需要枚舉線上數據,Redis提供了工具可以直接掃描其dump文件,枚舉出所有數據,Redis還同時提供了持久化和復制等功能。

    9. 關于不同語言的客戶端支持

    10. 在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因為Memcached發展的時間更久一 些,目前看在客戶端支持方面,Memcached的很多客戶端更加成熟穩定,而Redis由于其協議本身就比Memcached復雜,加上作者不斷增加新 的功能等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。

    根據以上比較不難看出,當我們不希望數據被踢出,或者需要除key/value之外的更多數據類型時,或者需要落地功能時,使用Redis比使用Memcached更合適。

    關于Redis的一些周邊功能

    Redis除了作為存儲之外還提供了一些其它方面的功能,比如聚合計算、pubsub、scripting等,對于此類功能需要了解其實現原理,清 楚地了解到它的局限性后,才能正確的使用,比如pubsub功能,這個實際是沒有任何持久化支持的,消費方連接閃斷或重連之間過來的消息是會全部丟失的, 又比如聚合計算和scripting等功能受Redis單線程模型所限,是不可能達到很高的吞吐量的,需要謹慎使用。

    總的來說Redis作者是一位非常勤奮的開發者,可以經常看到作者在嘗試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入了解后再使用。

    總結:

    1. Redis使用最佳方式是全部數據in-memory。

    2. Redis更多場景是作為Memcached的替代者來使用。

    3. 當需要除key/value之外的更多數據類型支持時,使用Redis更合適。

    4. 當存儲的數據不能被剔除時,使用Redis更合適。

    后續關于Redis文章計劃:

    1. Redis數據類型與容量規劃。

    2. 如何根據業務場景搭建穩定,可靠,可擴展的Redis集群。

    3. Redis參數,代碼優化及二次開發基礎實踐。

    關于作者

    田琪,目前負責新浪微博平臺底層架構與研發工作,之前曾擔任搜狐白社會實時游戲平臺核心架構工作,主要關注webgame, 分布式存儲,nosql 和 erlang 等領域,目前主要從事mysql源代碼的一些深入研究工作,浪微博:http://weibo.com/bachmozart

    posted @ 2014-08-26 09:04 paulwong 閱讀(456) | 評論 (0)編輯 收藏

    Java設計模式:觀察者

         摘要: 簡單來說,觀察者模式=發布者+訂閱者。下面是一個有關獵頭的典型的例子。在下面這張圖當中有兩個角色:獵頭和尋找工作的人。找工作的人向獵頭訂閱,告知自己希望得到一份工作,當有新的工作機會的時候,獵頭就會把這個信息通知給曾經向他訂閱過的人。Java代碼Subject接口:1public interface Subject {2    publi...  閱讀全文

    posted @ 2014-08-26 08:50 paulwong 閱讀(294) | 評論 (0)編輯 收藏

    在AJAX中將FORM里面的元素以JSON方式提交

    $('#formID').on('submit',function () {
        $.ajax({
            url: 'submit.php',
            cache: false,
            type: 'POST',
            data : $('#formID').serialize(),
            success: function(json) {
                alert('all done');
            }
        });
    });

    posted @ 2014-08-22 09:38 paulwong 閱讀(603) | 評論 (0)編輯 收藏

    曾國藩語錄(摘)

    -----------------曾國藩箴言(一)----------------



    ●輕財足以聚人,律己足以服人,量寬足以得人,身先足以率人。

    【譯文】輕視財物可以召集人,律己可以讓人敬服,氣量寬廣可以得人心,自己親身先做事可以領導人。



    ●惟正己可以化人,惟盡己可以服人。

    【譯文】只有端正自己可以感化別人,只有開放自己的心才可以服人。



    ●遇詭詐人變幻百端,不可測度,吾一以至誠待之,彼術自窮。

    【譯文】遇到詭秘狡詐的人變化百端,不可以猜測度量,我都用至誠心對待他,他的方法就沒用了。



    ●功不獨居,過不推諉。

    【譯文】有功勞不自己一個人占有,有過錯不推脫。



    ●不可輕率評譏古人。

    【譯文】不可以輕易評論譏諷古人。



    ●今日所說之話,明日勿因小利害而變。

    【譯文】今天講的話,明天不要因為小的利害就改變。



    ●遇棘手之際,須從耐煩二字痛下功夫。

    【譯文】遇到棘手的時候,要從耐煩這兩個字上下功夫。



    ●勿以小惡棄人大美,勿以小怨忘人大恩。

    【譯文】不要因為別人小的壞處而放棄他大的優點,不要因為與別人小的仇怨而忘記他的恩情。





    -----------------曾國藩箴言(二)--------------------



    ●責過太直,使人慚恨,在我便是一過。

    【譯文】指責過錯過于直接,讓別人生慚愧而痛恨自己,對我來說就是一種過錯。



    ●受挫受辱之時,務須咬牙勵志,蓄其氣而長其智。

    【譯文】受到挫敗和侮辱時,一定要咬緊牙忍受來激勵志向,繼續志氣,增長智慧。



    ●行事不可任心,說話不可任口。

    【譯文】做事不可以隨心所欲,說話不可以隨口胡說。



    ●百種弊病,皆從懶生。

    【譯文】很多的弊病都是從懶惰生出的。



    ●守篤實,戒機巧,守強毅,戒剛愎。

    【譯文】謹守篤定老實,不要投機取巧,盡收剛強堅毅,不要剛愎自用。



    ●凡人做一事,便須全副精神注在此一事,不可見異思遷。

    【譯文】凡是有人要做一件事,就須把全副精神貫注在這件事上,不可以見異思遷。





    ---------------曾國藩箴言(三)---------------



    ●寡言養氣,寡視養神,寡欲養精。

    【譯文】少說話可以休養元氣,少看可以休養心神,減少欲望可以休養精氣。



    ●禮義廉恥,可以律己,不可以繩人。

    【譯文】禮義廉恥,可以用來要求自己,卻不能用來要求別人。



    ●利可共而不可獨,謀可寡而不可眾。獨利則敗,眾謀則泄。

    【譯文】利益可以共享不可以獨享,謀劃可以讓少數人知道不可以讓多數人知道,獨享利益就會失敗,謀劃讓多數人知道就會泄露。



    ●久利之事勿為,眾爭之地勿往。物極則反,害將及矣。

    【譯文】能一直產生利益的事不要做,眾人爭奪的好地方不要去。物極必反,禍害就要來了。



    ●知足則樂,務貪必憂。

    【譯文】知足就會快樂,執著貪心就會憂慮。



    ●處事宜決斷。

    【譯文】處理事情應該堅決果斷。



    ●事到手且莫急,便要緩緩想。想得時切莫緩,便要急急行。

    【譯文】事情分配到手上先別急,要慢慢想。想到時不要拖延,要趕快做。



    ●尖酸語稱快一時,當之者終身怨恨。

    【譯文】尖酸刻薄的話讓你一時痛快,可對方卻終身怨恨你。



    ●凡權要人聲勢赫然時,我不可犯其鋒,亦不可與之狎,敬而遠之,全身全名之道也。

    【譯文】凡是掌握權力的重要人物聲名、勢力非常大的時候,我們不要去觸犯他的鋒芒,也不可以和他交好。對他敬而遠之,是保全自己名聲、生命的方法。



    ●行事常思退一步。

    【譯文】做事常常要想到退讓一步。



    ●慎言謹行,是修己第一事。

    【譯文】謹慎自己的言行,是修養自己德行的最重要的事。

    posted @ 2014-08-20 11:06 paulwong 閱讀(207) | 評論 (0)編輯 收藏

    Logstash logo開源日志管理 Logstash

    logstash日志處理采用隊列ZMQ,壓力會很好的被緩沖,針對高并發的大數據量的日志處理是沒有問題的,日志利用ES存放,就是個基于lucene的全文檢索數據庫,也不存在數據量的問題。

    logstash 是一個應用程序日志、事件的傳輸、處理、管理和搜索的平臺。
    你可以用它來統一對應用程序日志進行收集管理,提供 Web 接口用于查詢和統計。

    logstash screenshot

     

    http://logstash.net/docs/1.4.2/tutorials/getting-started-with-logstash

    posted @ 2014-08-20 09:22 paulwong 閱讀(575) | 評論 (0)編輯 收藏

    Spring對HttpSession的重新封閉

    https://github.com/spring-projects/spring-session/tree/master/samples

    posted @ 2014-08-19 09:13 paulwong 閱讀(947) | 評論 (0)編輯 收藏

    刪除List中重復元素

    方法一:循環元素刪除
    // 刪除ArrayList中重復元素 
        public static void removeDuplicate(List list) {
            for (int i = 0; i < list.size() - 1; i++) {
                for (int j = list.size() - 1; j > i; j--) {
                    if (list.get(j).equals(list.get(i))) {
                        list.remove(j);
                    }
                }
            }
            System.out.println(list);
        }


    方法二:通過HashSet剔除
    // 刪除ArrayList中重復元素 
        public static void removeDuplicate(List list) {
            Set set = new HashSet(list);
            list.clear();
            list.addAll(set);
            System.out.println(list);
        }


    方法三: 刪除ArrayList中重復元素,保持順序
    // 刪除ArrayList中重復元素,保持順序 
        public static void removeDuplicateWithOrder(List list) {
            Set set = new HashSet();
            List newList = new ArrayList();
            for (Iterator iter = list.iterator(); iter.hasNext();) {
                Object element = iter.next();
                if (set.add(element))
                    newList.add(element);
            }
            list.clear();
            list.addAll(newList);
            System.out.println(" remove duplicate " + list);
        }

    posted @ 2014-08-18 12:09 paulwong 閱讀(1873) | 評論 (0)編輯 收藏

    RESTful 最佳實踐

         摘要: 除了傳統對于遠程調用的需求,近來移動開發對于api的規范化需要,restful作為一個流行的接口調用方式,值得深入了解。聲明 本文屬于轉載:原文此文為實踐總結,是自己在實踐過程中積累的經驗和"哲學"。部分內容參考相關資料,參考內容請看尾頁。建議對RESTful有一定了解者閱讀!"哲學"不要為了RESTful而RESTful在能表達清楚的情況下,簡單就是美接口路徑設計接口設計原則URI指向...  閱讀全文

    posted @ 2014-08-18 08:47 paulwong 閱讀(6476) | 評論 (0)編輯 收藏

    UML類圖中的六大關系:泛化、實現、依賴、關聯、聚合、組合關系

    UML定義的關系主要有:泛化、實現、依賴、關聯、聚合、組合,這六種關系緊密程度依次加強,分別看一下

    1、泛化

    概念:泛化是一種一般與特殊一般與具體之間關系的描述,具體描述建立在一般描述的基礎之上,并對其進行了擴展。在程序中是通過繼承類實現的。比如狗是對動物的具體描述,在面向對象設計的時候一般把狗設計為動物的子類。

    表示方法:空心三角形箭頭的實線,子類指向父類

    image

    2、實現

    概念:實現是一種類與接口的關系,表示類是接口所有特征和行為的實現,在程序中一般通過類實現接口來描述

    表示方法:空心三角形箭頭的虛線,實現類指向接口

    image

    3、依賴

    概念:是一種使用的關系,即一個類的實現需要另一個類的協助,所以要盡量不使用雙向的互相依賴,在程序中一般表現為類A中的方法需要類B的實例作為其參數或者變量,而類A本身并不需要引用類B的實例作為其成員變量。

    表示方法:虛線箭頭,類A指向類B。

    image

    4、關聯

    概念:表示類與類之間的聯接,它使一個類知道另一個類的屬性和方法,這種關系比依賴更強、不存在依賴關系的偶然性、關系也不是臨時性的,一般是長期性的,在程序中被關聯類B以類屬性的形式出現在關聯類A中,也可能是關聯類A引用了一個類型為被關聯類B的全局變量

    表示方法:實線箭頭,類A指向類B

    image

    5、聚合

    概念:聚合關聯關系的一種特例,是強的關聯關系。聚合是整體和個體之間的關系,即has-a的關系,整體與個體可以具有各自的生命周期,部分可以屬于多個整體對象,也可以為多個整體對象共享。程序中聚合和關聯關系是一致的,只能從語義級別來區分;

    表示方法:尾部為空心菱形的實線箭頭(也可以沒箭頭),類A指向類B

    image

     

    6、組合

    概念:組合也是關聯關系的一種特例。組合是一種整體與部分的關系,即contains-a的關系,比聚合更強。部分與整體的生命周期一致,整體的生命周期結束也就意味著部分的生命周期結束,組合關系不能共享。程序中組合和關聯關系是一致的,只能從語義級別來區分。

    表示方法:尾部為實心菱形的實現箭頭(也可以沒箭頭),類A指向類B

    image

    posted @ 2014-08-08 08:18 paulwong 閱讀(405) | 評論 (0)編輯 收藏

    架構師的職責

        近來看到CSDN上有個CTO俱樂部,里面聊得是不亦樂乎。我懷著無比崇敬的態度,拜讀了一下牛人們的發言。

    里面有個哥們發起一個話題:

    “CTO, 你多久沒有寫程序了?”。
    有人回答:“不寫代碼的CTO,屬于......這公司問題大了!”。

    看到這里,我就趕緊撤了,怕忍不住反駁幾句,反而遭到牛人們的群毆。試想,一個上點規模的IT公司,還得靠CTO來寫程序的話,那是不是才叫問題大了呢。當然,我沒有做過CTO,所以我有我的不同看法,而且還愿意表達出來,無知者無畏。我情愿相信:我所理解的CTO跟這位CTO所理解的是兩回事。所以我想,如果有人能把CTO的職責給標準化了,也許就不會有這么多的爭論了。

        同樣的道理,關于架構師的定義,大家也有著不同的理解。什么是架構師?架構師有哪些職責?我覺得有必要提前明確一下,要不然大家溝通起來也會產生類似問題,子說子理,卯說卯理,但是壓根說得不是一碼子事。
     
    0.1 什么是架構師

    曾經有這么個段子:
    甲:我已經應聘到一家中型軟件公司了,今天上班的時候,全公司的人都來歡迎我。
    乙:羨慕ing,都什么人來了?
    甲:CEO、COO、CTO、All of 程序員,還有會計、司機都來了。
    乙:哇,他們太重視你了,人才啊,這么多人迎接你!
    甲:沒有啊,就一個人!
    乙:靠,#%¥$%...

        很多的創業公司,一人身兼數職的情形還是很常見的。至少,我是經歷過的,一個人包辦了所有的開發過程,連測試我都做了,絕對的一條龍,但是經常踩鋼絲、騎獨輪車總會有失足的時候,結果有一次,從我手里發出去的光盤母盤,含有病毒僵尸,以至于被迫收回已經推上市場的2萬張光盤,從那之后,我的心臟就開始變得無比堅強,現在就是整個后臺服務都癱瘓了,我也只是微微一笑。其實,一個人身兼架構師和程序員,甚至多種角色,沒什么不妥,后面還會講這個話題,這種現象不是中國特色,跟國外是完全接軌的。我曾經跟米國的一個工程師在msn中聊過類似的話題,發現他們的路子跟咱們沒什么不同,在IT這個行業,我們跟世界的差距只有1天,他們剛弄出來的新東西,我們這里第2天保準見得到。

        架構師這個稱呼不是拍腦袋想出來的,是有國際標準(ISO/IEC 42010)可查的。架構師是軟件開發活動中的眾多角色之一,它可能是一個人、一個小組,也可能是一個團隊。微軟對架構師有一個分類參考,我們參考一下,他們把架構師分為4種:企業架構師EA(Enterprise Architect)、基礎結構架構師IA(Infrastructure Architect)、特定技術架構TSA(Technology-Specific Architect)和解決方案架構師SA (Solution Architect)。微軟的這個分類是按照架構師專注的領域不同而劃分的。

        EA的職責是決定整個公司的技術路線和技術發展方向。蓋茨給自己的Title就是首席軟件架構師,網易丁磊也喜歡這么稱呼自己,實際上就是EA角色;IA的工作就是提煉和優化技術方面積累和沉淀形成的基礎性的、公共的、可復用的框架和組件,這些都是一個技術型公司傳承下來的最寶貴的財富之一;特定技術架構師TSA,他們主要從事類似安全架構、存儲架構等專項技術的規劃和設計工作;SA的工作則專于解決方案的規劃和設計,“解決方案”這個詞在中國已經到了嚴重泛濫的程度,大忽悠們最喜歡把它掛在嘴邊。所謂解決方案,就是把產品、技術或理論,不斷地進行組合,來創造出滿足用戶需求的選擇。售前工程師一般都是帶著它到客戶那里去發揮的。

        大公司會把各種類型的架構師分得很清楚,小公司一般就不那么講究了,架構師多數是是IA+TSA+SA,一人包打天下,所以說大公司出專才,小公司出全才。

        實際工作中,我們也經常會見到另一種比較簡單的分類方式,把架構師分為軟件架構師和系統架構師。軟件架構師基本上是TSA+IA,這也是程序員最容易突破,最可能走上的一條道路,比如JAVA架構師、DotNet架構師、LAPM架構師等等,我后面所講的內容都是與軟件架構師的相關的話題。系統架構師實際上是SA+TSA,更著力于綜合運用已有的產品和技術,來實現客戶期望的需求。系統架構師要求通曉軟、硬件兩方面的知識,所以它的知識體系相對龐雜。關于系統架構師的話題,我們可以稍后再作討論。
     
    0.2 架構師的職責

          架構師需要參與項目開發的全部過程,包括需求分析、架構設計、系統實現、集成、測試和部署各個階段,負責在整個項目中對技術活動和技術說明進行指導和協調。 
    架構師主要職責有4條: 

    1、確認需求
        在項目開發過程中,架構師是在需求規格說明書完成后介入的,需求規格說明書必須得到架構師的認可。架構師需要和分析人員反復交流,以保證自己完整并準確地理解用戶需求。

    2、系統分解


        依據用戶需求,架構師將系統整體分解為更小的子系統和組件,從而形成不同的邏輯層或服務。隨后,架構師會確定各層的接口,層與層相互之間的關系。架構師不僅要對整個系統分層,進行“縱向”分解,還要對同一邏輯層分塊,進行“橫向”分解。
        軟件架構師的功力基本體現于此,這是一項相對復雜的工作。

    3、技術選型


        架構師通過對系統的一系列的分解,最終形成了軟件的整體架構。技術選擇主要取決于軟件架構。
    Web Server運行在Windows上還是Linux上?數據庫采用MSSql、Oracle還是Mysql?需要不需要采用MVC或者Spring等輕量級的框架?前端采用富客戶端還是瘦客戶端方式?類似的工作,都需要在這個階段提出,并進行評估。

    架構師對產品和技術的選型僅僅限于評估,沒有決定權,最終的決定權歸項目經理。架構師提出的技術方案為項目經理提供了重要的參考信息,項目經理會從項目預算、人力資源、時間進度等實際情況進行權衡,最終進行確認。

    4、制定技術規格說明
       
        架構師在項目開發過程中,是技術權威。他需要協調所有的開發人員,與開發人員一直保持溝通,始終保證開發者依照它的架構意圖去實現各項功能。
       
        架構師與開發者溝通的最重要的形式是技術規格說明書,它可以是UML視圖、Word文檔,Visio文件等各種表現形式。通過架構師提供的技術規格說明書,保證開發者可以從不同角度去觀察、理解各自承擔的子系統或者模塊。
    架構師不僅要保持與開發者的溝通,也需要與項目經理、需求分析員,甚至與最終用戶保持溝通。所以,對于架構師來講,不僅有技術方面的要求,還有人際交流方面的要求。


    0.3 架構師的誤區

    1、架構師就是項目經理


        架構師不是項目經理。項目經理側重于預算控制、時間進度控制、人員管理、與外部聯系和協調等等工作,具備管理職能。一般小型項目中,常見項目經理兼架構師。

    2、架構師負責需求分析


        架構師不是需求分析員。需求分析人員的工作是收集需求和分析需求,并與最終用戶、產品經理保持聯系。架構師只對最終的需求審核和確認,提出需求不清和不完整的部分,他會跟需求分析員時刻保持聯系。架構師是技術專家,不是業務專家。

    3、架構師從來不寫代碼

        這是一個尚存爭論的問題。目前有兩種觀點:
    觀點1:架構師不寫代碼,寫代碼純體力活,架構師寫代碼大材小用。架構師把UML的各種視圖交給開發人員,如果有不明確的地方,可以與架構師隨時溝通。
    觀點2:架構師本來自于程序員,只是比程序員站的層面更高,比程序員唯一多的是經驗和知識,所以架構師也免不了寫代碼。

        我個人覺得這兩種說法是與架構師的出身和所處的環境有關。

        架構師首先是一個技術角色,所以一定是來自于技術人員這個群體,比如系統架構師,多是來自于運維人員,可能本身代碼寫得并不多,或者說寫不出來很漂亮的代碼。軟件架構師多是來自于程序員,有著程序員的血統和情懷,所以在項目開發過程中,可能會寫一些核心代碼。我們的理想是架構師不用寫代碼,但事實上有時候過于理想。架構師寫不寫代碼,可能取決于公司的規模、文化、開發人員的素質等現實情況。另外,架構師也不是跟程序員界限分得那么清楚,按照能力也有高中低之分,寫不寫代碼不是區分兩者的根本標準。

    0.4 架構師的基本素質

    周星馳有個片子《喜劇之王》,劇中的尹天仇整天揣著本《演員的自我修養》,一個好演員不僅需要天賦,也需要一定的理論指導,無師自通的人畢竟是少數。架構師的成長過程也是這樣。從普通程序員到高級程序員,再到架構師,是一個經驗積累和思想升華的過程。經驗積累是一個方面,素質培養是另一個方面,兩者相輔相成,所以我覺得有必要把架構師的所要具備的素質羅列一下,作為程序員努力的方向。

    1、溝通能力

        為了提高效率,架構師必須贏得團隊成員、項目經理、客戶或用戶認同,這就需要架構師具有較強的溝通能力。溝通能力是人類最普遍性的素質要求,技術人員好像容易忽略,想成為架構師就不能忽略。千萬不要抱著這樣的觀念:懷才跟懷孕似的,時間久了總會被人發現的。還是天橋上賣大力丸的哥們說得對:光說不練假把式,光練不說傻把式。看看你周圍的頭頭腦腦們,哪一個不是此中高手,我們千萬不要鄙視,認為這是阿諛奉承、投機鉆營,凡事都要看到積極的一面,“溝通”的確是一種能力。我認為自己是一個略內向的人,因為我是農村出來的孩子,普通話都說不好,以前或多或少帶有點自卑感,幻想著是金子總會發光,所以在職業生涯中吃了不少虧。現在,我深深懂得了溝通的重要性,我會很主動地跟同事們,跟老大們不定時地溝通,感覺工作起來順暢多了。

        這一條我認為最為重要,所以排在首位。我甚至認為下面幾條都可以忽略,唯一這一條得牢記,而且要常常提醒自己。

    2、領導能力

        架構師能夠推動整個團隊的技術進展,能在壓力下作出關鍵性的決策,并將其貫徹到底。架構師如何來保證這種執行力?這就需要架構師具有領導能力。

        架構師的領導能力的取得跟項目經理不太一樣。項目經理主要負責解決行政管理,這種能力與技術關系不大,他有人權和財權,再扯上一張“領導”的虎皮,采用“胡蘿卜加大棒”的方式,基本上可以保證執行力。架構師在項目里面可能更多地使用非正式的領導力,也就是我們常說的影響力,里面包括個人魅力、技術能力、知識傳遞等等。

    3、抽象思維和分析能力

        架構師必須具備抽象思維和分析的能力,這是你進行系統分析和系統分解的基本素質。只有具備這樣的能力,架構師才能看清系統的整體,掌控全局,這也是架構師大局觀的形成基礎。你如何具備這種能力呢?一是來自于經驗,二是來自于學習。架構師不僅要具備在問題領域上的經驗,也需要具備在軟件工程領域內的經驗。也就是說,架構師必須能夠準確得理解需求,然后用軟件工程的思想,把需求轉化和分解成可用計算機語言實現的程度。經驗的積累是需要一個時間過程的,這個過程誰也幫不了你,是需要你去經歷的。但是,如果你有意識地去培養,不斷吸取前人的經驗的話,還是可以縮短這個周期的。這也是我寫作此系列的始動力之一。

    4、技術深度和廣度

       架構師最好精通1-2個技術,具備這種技術能力可以更加深入的理解有關架構的工作原理,也可以拉近和開發人員的距離,并形成團隊中的影響力。

       架構師的技術知識廣度也很重要,需要了解盡可能多的技術,所謂見多識廣,只有這樣,才可能綜合各種技術,選擇更加適合項目的解決方案。有的人說,架構師技術廣度的要求高于技術深度的要求,這是很有道理的。

    總而言之,一句話:架構師是項目團隊中的技術權威。

    posted @ 2014-08-05 18:35 paulwong 閱讀(388) | 評論 (0)編輯 收藏

    僅列出標題
    共115頁: First 上一頁 46 47 48 49 50 51 52 53 54 下一頁 Last 
    主站蜘蛛池模板: 亚洲欧洲自拍拍偷午夜色| 久久国产精品2020免费m3u8| 亚洲精品视频免费在线观看| 亚洲精品无码久久千人斩| eeuss影院ss奇兵免费com| 亚洲精品无码久久久久AV麻豆| 亚洲欧美aⅴ在线资源| 久久这里只有精品国产免费10| 亚洲情A成黄在线观看动漫软件| 一个人免费高清在线观看| 亚洲卡一卡二卡乱码新区| 亚洲无码精品浪潮| 免费看黄的成人APP| 久久久久亚洲AV无码网站| 一级做a爰全过程免费视频| 亚洲黄色在线观看视频| 国产香蕉免费精品视频| 亚洲性无码AV中文字幕| 国产免费私拍一区二区三区| 免费看黄网站在线看| 亚洲综合伊人久久综合| 久久99热精品免费观看动漫 | 国产亚洲综合久久| 国产亚洲视频在线播放| 最近的中文字幕大全免费版| 亚洲av无码专区在线观看亚| 亚洲毛片网址在线观看中文字幕| 91香焦国产线观看看免费| 亚洲高清中文字幕免费| 亚洲AV人无码综合在线观看| 中文字幕无码视频手机免费看| 麻豆精品不卡国产免费看| 久久精品亚洲AV久久久无码| 日本黄色免费观看| 丝袜捆绑调教视频免费区| 亚洲六月丁香六月婷婷色伊人| 国产在线观看www鲁啊鲁免费| 国产性生大片免费观看性| 国产成人 亚洲欧洲| 亚洲乱码av中文一区二区| 亚洲午夜精品在线|