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

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

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

    京山游俠

    專注技術,拒絕扯淡
    posts - 50, comments - 868, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

      SpringSide是個好東西,對我來說,它的好主要體現在兩個方面:一、它提供了一個敏捷開發的框架,省去了我自己整合Spring、Hibernate、Struts、ActiveMQ等等開源組件的時間,而且還是最佳實踐;二、它指導了我的學習目標,在SpringSide中整合的各種組件,都是在同一類組件中最優秀的,而且要想熟練使用這些組件,都必須對它們進行深入的系統的學習。

      本來以為我會在SpringSide開發實戰系列中寫更多的文章,但是寫到現在,我認為應該要寫結局了,為什么呢?因為在使用SpringSide進行項目開發的過程中,我越來越感覺到項目絕對不是各種組件的簡單堆砌,而是程序員要不斷有自己的想法和創意,并能夠抽象到一個高度。這也正是為什么我的文章從第一篇到第八篇越來越偏離SpringSide的核心了。在這里,我主要想談談程序員的境界。以下觀點純屬個人看法,歡迎大家探討。

      第一層境界:從不能到能。

      可以這么說,早在7年前我就已經熟練掌握C語言、Visual FoxPro數據庫、HTML、CSS和JavaScript,C語言和Visual FoxPro是學校教的,HTML、CSS和JavaScript是自學的,同時,我還自學了Flash動畫制作和Photoshop圖像處理。但是,我那時候還不知道應用程序開發,學的這些東西無非就是好玩,偶爾參加一次學校主辦的網頁設計大賽而已。

      我開發的第一個應用是《銀符英語在線》,使用的是ASP + SQL Server 2000,時間是2004年,那時我剛考過軟件設計師(原高級程序員),有人找我做程序,他說想做一個英語四六級的在線考試系統,問我能不能做到,我毫不猶豫就說能。我想我確實是具有軟件設計方面的天賦,用了一個星期設計出數據庫,再用一個星期寫了一個Demo,一下子就把他征服了,于是,他當老板,我當程序員,一起進行在線英語考試方面的開發。

      在這段時間,我覺得我不折不扣就是處于這第一層境界。JScript我早已是滾瓜亂熟,ASP教程更隨處可得。在這段時間里,我用全JScript代碼實現了用戶認證和權限管理,用Visual C++寫了個COM組件進行數據的加密和解密,還在網上到處搜索文件上傳和動態圖片生成方面的解決辦法。當時,我覺得我的開發過程充實而滿足;現在看來,我只不過是一個重復發明輪子的傻冒。

      在10個月的時間里,我把這個程序從1.0版開發到3.0版,功能上進行了不少升級。但是我認為升級最大的還是我的技術,我盡我最到的能力將代碼與網頁分離,盡我最到的能力減少代碼的重復,甚至已經基本做到使用模式來讓程序更加容易擴充和維護。我所做的一切,與現代的一些Web開發框架已經不謀而合。但是,以我當時的內力,確實沒有辦法將之抽象為一個框架。我的程序中依然充滿了意大利面條式的代碼,而且在在線人數多的時候,網頁會慢得象蝸牛爬。

      第二層境界:從能做到做得漂亮

      2005年,我開始接觸Java,以我的基礎,自然是很快就學會了Java的語法并進軍J2EE。我覺得Java開源世界給了我不少能量,在這兩年里,我的進步速度是呈指數式的。以我現在的水平,僅使用JSP和Servlet,已經足以解決絕大部分的需求。然而,僅使用JSP和Servlet就是全部嗎?

      這個時候,我們不僅僅要能夠完成應用程序的編寫,更重要的要讓應用程序便于維護和便于擴充。這時候,沒有足夠的抽象能力是不夠的。要能夠理解和應用分層架構,要知道MVC、IoC、AOP、ORM,要了解聲明式事務處理,還要學會最流行了AJAX。所有的這一切,不僅能夠讓我們的應用便于維護,合理使用各開源組件還能加快開發的速度,但是最重要的,它們能使我們的應用充滿藝術的美感。

      在SpringSide社區,現在最流行的是Acegi,這也是對安全與權限功能的一種抽象。本來我也想寫一篇Acegi方面的文章,但是cac寫的文檔是在是太完美、太經典了,我無法超越。我們應該讓我們的應用盡量向Acegi靠攏,因為,它代表的就是安全與權限領域的最佳實踐。

      第三層境界:從程序員到架構師

      架構師可以干什么?如何讓應用在性能,伸縮性,擴展性、可靠性,容災,可恢復性,可管理性等方面做到最好,就是架構師的職責,同時,架構師要能夠把握軟件開發的整個周期。由于我還只是一個程序員,也沒有精力去學習架構師方面的只是,因此上面的論述可能不準確。但是,作為一個程序員,上升到一個境界之后,確實應該考慮編碼之外的東西了。

      舉例說明,cnblogs的博客程序算式比較完善的了,我個人對站長dudu也是充滿了仰慕。cnblogs的1.0Beta2版本我也下載得有,本打算使用它建一個自己的博客網站,但是卻不行,因為它在性能,伸縮性,擴展性方面都達不到我的要求。

      不信?看看現在www.cnblogs.com吧,注冊用戶已經2萬多了,速度也是越來越慢,經過我一nslookup,發現它還只是一臺主機在運行,而www.tianya.cn則是一個服務器集群。如下圖:
    52.JPG

      造成這個問題的原因,主要就是架構的問題。cnblogs是基于.net的,.net運行于IIS之上,而IIS又是那么的簡單,更本不具備配置Cluster的功能。而cnblogs的程序在設計的時候也沒有往集群方面考慮,甚至是想多配置幾個數據庫都是困難的。

      解決網站性能的辦法有幾種,一是向上擴展,也就是不斷增加服務器的CPU和內存,但是這種擴展價格非常昂貴;二是向外擴展,也就是多增加幾臺廉價的Web服務器和數據庫服務器,但是由于cnblogs在設計的時候沒有考慮到集群功能,就必須得重構所有的代碼,這個工作量實在是太大了;三是垂直分割,也就是目前博客園所采用的方法,就是讓一臺主機負責.net博客,一臺主機負責java博客等等,把不同的應用分開。這樣帶來的負面影響是我們就沒有辦法在同一個博客上面同時寫.net、java、c++方面的隨筆了,這確實讓我感覺不爽,此外,在.net領域這樣訪問量大的領域,一樣會使服務器不堪重負。

      我不能讓我的程序重蹈覆轍,因此,在架構階段就應該考慮到Cluster,考慮到負載均衡,考慮到可擴充性,并同時使用水平分割策略。水平分割策略和垂直分割策略不同,是讓每一個Web服務器都應該能夠使用程序的所有功能,而讓不同的用戶使用不同的服務器,比如id為0-10000的用戶和www1.cnblogs.com交互,10001-20000的用戶和www2.cnblogs.com交互,等等,如下圖所示:
    53.JPG

      這個時候,服務器www.cnblogs.com作為負載均衡服務器,它根據登錄用戶的ID將該用戶請求重定向到www1.cnblogs.com或者www2.cnblogs.com,對于匿名用戶,它把用戶請求隨機重定向到www1.cnblogs.com或者www2.cnblogs.com。

      同時,為了能夠讓負載均衡服務器能夠根據不同的用戶來重定向到不同的Web服務器,又要讓每個Web服務器上的應用都能夠得到所有各個數據庫服務器數據的總的索引,需要有一個索引數據庫服務器,如下圖:
    54.JPG

      此外,我們還應該讓Web服務器和數據庫服務器可以動態增加,也就是當某一個服務器負載到達極限時,我們可以添加一臺服務器,只需要修改配置文件即可,無需更改代碼,如下圖:
    55.JPG

      同時配合使用動態頁面靜態化技術,靜態化后的html頁面和圖片文件都保存在Web服務器上,此時Web服務器有同時擔當了緩存服務器的功能。當達到IO瓶頸的限制后,又可以通過服務器加大內存或為服務器配置SAN(存儲區域網絡)來解決問題。


      好了,SpringSide系列的文章就寫這么多吧。期待SpringSide 2.0正式版的發布。我會把它用到實際的項目開發中。


    評論

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 01:19 by yeshucheng
    文章寫得確實不錯:)

    哪天我也有你的心態境遇就好,繼續努力!

    京山游俠,希望以后你多寫點在實際項目中遇到類似這些性能問題的解決方法:)

    不過我覺得你的這篇文章和SS好象很離題吧?難道是我語文沒學好

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 03:17 by 山風小子
    您的這篇文章要比其他技術性文章要優秀很多,也讓我學到了不少東西。
    對各類框架的整合,應用,我已經膩了,感覺自己像一個‘裝配工’。
    因此現在要么學習封裝的最好的框架--Grails,設計模式等High level的東西,要么就鉆研數據結構,算法,編譯原理等最基礎的東西。
    您覺得我走這兩個極端如何,希望得到您的忠告,謝謝 :)

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 07:33 by ncindy
    IIS不能集群,Apache可以?而且Web服務器沒有集群的必要吧,
    而且天涯那更像是用DNS做LB的方式,不是集群。LB的話IIS當然可以了。
    可伸縮性在應用層上用SNA才是最關鍵的,用這種架構別說IIS,就是用Ruby腳本寫的web server都可以實現高可伸縮性。

    dudu只有一臺服務器是估計因為現在資金還不夠充裕,想想天涯做了多少 年了啊。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 09:10 by wangzx
    作者關于集群的描述我比較感興趣,不過我覺得從應用的角度上不妨越簡單越好。比如說作者可以考慮使用Apache作為反向代理的方式,將負載均衡到多臺WEB服務器上,再結合動態、靜態的Cache技術,我覺得這個問題會變得簡單很多。利用Apache等提供的緩存技術,我感覺會比你自己來實現“動態轉靜態”更有意義。

    過多的在應用層次考慮一些低層次的功能,最大的缺點是把應用本身搞得很復雜,難以維護,而如果放在其下的層次來考慮,我覺得可以很好的實現這二者的平衡:既簡單又高效。當然,從應用的設計上來說,不是說不需要考慮底層技術,只是,現在我們只要知道我們的應用設計是可以跟這些底層(如反向代理、Cache)等相匹配、相合作的,就可以了。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 09:18 by L
    負載均衡直接用F5做就行了,根本沒必要這么復雜。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 09:24 by Max
    如果作者有看過《Expert One on one J2EE Development Without EJB》應該知道,J2EE的Cluster的性能不一定是最好的。
    Microsoft同樣有Load Balance的軟件。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 09:59 by 蕭木
    這篇文章應該有不少誤導讀者的地方.

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 10:04 by BeanSoft
    也許作者說的是理想情況下, 不需要考慮吃飯, 出于研究/自學狀態下的心態.

    絕大多數程序員吧, 都是為了吃飯而工作. 很多時候用戶需要的是一個 IF-ELSE 的邏輯符合他的需要, 這個時候再多的框架也只是個殼, 而且這些框架也絲毫不能減少編寫 if-else 的代碼. 我不覺得框架整合的越多越牛, 而是應該進行分工, 不同的人專著于自己最擅長的領域, 大家分工合作. 換句話說只要能如期完成項目或者需求, 到底是什么技術用戶是不在意的.
    軟件業是服務業, 而國內的項目大多都是應用程序, 業務流程, 這時候這些XX開源框架很多時候都幫不了太多的忙.
    至于架構的方面, 只能說做新項目之前多做些設計, 擴展等方面的工作, 能否集群也只是一部分, 采用哪些框架要根據實際情況討論, 還得考慮萬一碰到框架 Bug 的時候怎么辦(記住開源項目可不是帶免費技術支持的). 實際的情況往往是在維護老項目, 架構已不可再改, 推倒重做風險更大, 老板也不會同意.
    個人覺得吧, 好好工作, 扎實掌握基礎知識, 對于項目所需知識則是按需學習, 早日根據自己的愛好, 實際情況進行定位和規劃. 畢竟精力有限, 人人都成為精通XXX流行框架又是架構師的概率實在是太低. 基礎掌握牢固的話, 再看框架很多時候都會感到似曾相識.
    PS: 我也不覺得 SpringSide 就是敏捷開發, 最佳實踐, 說最佳之前請三思. PetStore 不也是經典嘛, 現在還不是被批判的體無完膚.

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 11:08 by 江南白衣
    恭喜恭喜,告一段落,可以向更高的目標進發。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 11:31 by adsljkfjlksda
    @蕭木
    那你寫篇來看看,說這句話之前,想想你自己能寫出什么東西,如果你有,請在你這句話下面把 鏈接 貼出來,讓大家也評評,如果確實好,那么沒人會說什么,如果沒有一絲對大家有幫助的話,那你這句話是不負責任的~~ ,

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 13:27 by yegucheng
    作者只寫了集群的一部分,我覺得架構設計應該包含更廣泛的內容,我覺得架構師應該從更高的高度去理解項目需求,不是為技術而技術,當然,這一切都必須以扎實的基本功為基礎

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 17:26 by 小陸
    clust可以在操作系統的層次上實現,iis完全可以集群化。
    你所說的集群是load balance,可以做在網關或者dns上

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界[未登錄]  回復  更多評論   

    2007-03-29 18:48 by cac
    其實每個程序員不一定都有架構師的職位,但都需要有架構師的思想,可以說沒有架構師思想的程序員不是好的程序員。
    從程序員到架構師只是一個從量變到質便的過程,沒有在編程階段磨練過,嘗試過各種語言,各種工具,各種方法的架構師也不會是一個好的架構師
    LZ 樸實的學習精神讓人敬佩

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 20:43 by 海邊沫沫
    @yeshucheng
    就是因為越來越離題,所以決定結束這個系列

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 20:46 by 海邊沫沫
    @山風小子
    我也喜歡數據結構、算法、編譯原理
    我也討厭當裝配工

    看來我們兩個有很多共同之處

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-29 20:52 by 海邊沫沫
    剛到msdn去看了下關于體系結構方面的東西,看了下MSA EDC構建指南。感覺我的確是井底之蛙。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-30 09:01 by 山風小子
    @海邊沫沫 @江南白衣
    以后請多多指教 :)

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-31 10:57 by 海邊沫沫
    @wangzx
    我覺得應用層還是應該考慮一些底層的東西。myspace.com現在有1.2億注冊用戶,每個月訪問量達到400億,三年時間中已經對網站進行了5次重寫,最后就是在應用層采用的水平分割策略。

    Apache的緩存我也應該去學習學習,謝謝你的指點。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-03-31 17:46 by 海邊沫沫
    @Max

    《Expert One on one J2EE Development Without EJB》中并沒有說J2EE的Cluster性能不好。

    在“性能和可伸縮性”這一節,作者對怎樣設計具有高性能和高可伸縮性的程序進行了探討,其大致意思基本如下:

    應用于服務器集群的程序,其實現方式基本上可以分為兩種,一種是基于分布式對象的,一種是基于部署的。什么是基于分布式對象呢?就是傳統的EJB部署方式,不同的業務對象分布于集群中不同的服務器上,通過遠程調用來分擔服務器負載;這種方式是被作者所不推薦的,理由是遠程調用太浪費時間,這也正是作者寫Without Ejb的本意。什么是基于部署的呢?就是在集群中的每一臺服務器上都部署有該程序的完整版本,所有的業務對象都在本機上可以訪問。

    此外,作者還探討了狀態管理,性能最高的就是作者所說的農場模式,也就是說每一臺服務器都可以當作別的服務器不存在,他們之間不需要進行Session狀態復制等等。如果要進行Session狀態的復制,必然會對集群的性能造成影響,n臺服務器的性能不可能達到1臺服務器的n倍。

    對于《Expert One on one J2EE Development Without EJB》這樣的好書,確實應該反復閱讀。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-07-25 15:08 by 我的Java工作經歷
    無語了,牛。。。。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2007-08-09 13:22 by mmwy
    nslookup出來只有一個ip并不一定能說明它就沒做負載均衡處理。難說你得到的這個ip是前置的負載均衡交換機的ip,realserver都躲在其內部來著。

    nslookup出來多個ip,也許他只是用了最簡單的dns輪循的負載均衡處理,也有可能是做了gslb。

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2008-08-13 08:23 by 笑笑笑笑笑笑笑
    文章舊了,希望可以更新到springside3.0

    # re: SpringSide開發實戰(八):不是結局的結局,談談程序員的境界  回復  更多評論   

    2009-03-25 23:58 by hansen
    寫的不錯,有同感
    記得老師曾說過 “程序員像作家,寫代碼就像在寫作”,
    好的架構師就如同金庸等名家,寫出的代碼像是藝術品 如spring hibernate的作者。 而普通的程序員(這里指為了生計,在極短時間內copy,修改代碼,來完成工作任務) 可能只是為了完成每天的工作而已,只是為那點錢。就像某些記者。 雖然我也很想寫出優雅的代碼,但領導不會理解你的做法,只是覺得你效率低。
    未來 我一定會“寫”屬于我自己風格的真正好作品。
    主站蜘蛛池模板: 噜噜综合亚洲AV中文无码| 亚洲自国产拍揄拍| 大妹子影视剧在线观看全集免费| 中文字幕无码视频手机免费看| 亚洲最大福利视频网站| 59pao成国产成视频永久免费| 亚洲日本中文字幕区| 午夜视频免费在线观看| 亚洲视频在线观看网站| 18禁美女黄网站色大片免费观看| 97se亚洲综合在线| 在线看片无码永久免费视频 | 久久精品7亚洲午夜a| 最近2019中文免费字幕在线观看 | 国产乱子精品免费视观看片| 亚洲视频在线观看网址| 国产一精品一AV一免费孕妇| 亚洲性无码AV中文字幕| 亚洲高清成人一区二区三区 | 91香蕉成人免费网站| 亚洲av最新在线观看网址| 亚洲av无码国产精品色在线看不卡 | 成年人免费视频观看| 亚洲av日韩综合一区久热| 免费又黄又硬又爽大片| a级成人免费毛片完整版| 亚洲精品电影天堂网| 免费黄色网址入口| 成人免费乱码大片A毛片| 亚洲美女在线观看播放| 国产精品免费_区二区三区观看| 永久免费无码网站在线观看个| 国产AV无码专区亚洲Av| 大学生a级毛片免费观看 | 国产成人综合久久精品免费| 中文在线日本免费永久18近| 亚洲系列国产精品制服丝袜第| 国产老女人精品免费视频| 中文字幕乱码一区二区免费| 亚洲国产成a人v在线观看| 亚洲综合最新无码专区|