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

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

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

    敏捷、分布式、ALM過程自動化、企業應用架構
    posts - 14, comments - 0, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Tips to Developers Starting on Large Applications

    原文引用:http://www.infoq.com/articles/tips-to-developers-starting-on-large-apps

     

    假設你是正在開發和維護一個包含2000個類并使用了很多框架的Java開發者。你要如何理解這些代碼?在一個典型的Java企業項目小組中,大部分能夠幫你的高級工程師看起來都很忙。文檔也很少。你需要盡快交付成果,并向項目組證明自己的能力。你會如何處理這種狀況?這篇文字為開始一個新項目的Java開發者提供了一些建議。

     

    1         不要試圖一下子搞懂整個項目

    好好考慮一下,為什么理解項目代碼是第一位的?大部分情況是你被要求修復一個bug或者加強系統已有功能。你要做的第一件事情不是理解整個項目的架構。當對項目進行維護時,這樣(理解整個項目架構)可能會對你造成巨大的壓力。

    即便是有著10年可靠編程經驗的Java開發者可能也沒有理解項目的核心工作機制,盡管他們可能已經在這個項目工作超過一年(假設他們并非原始開發人員)。比如,對于認證機制或事務管理機制。

    他們是怎么做的?他們對于自己負責的部分非常了解,并且能夠交付價值給小組。每天的交付價值遠比了解一些以后還不確定有沒有的東西重要的多。

    2         關注于盡快交付價值

    那我是否定了你對于項目架構理解的熱情了么?完全不。我只是要求你盡早的交付價值,一旦你開始一個項目,搭建了開發環境,你就不應該花一兩周時間才交付什么,無論他的規模大小。假如你是一個有經驗的程序員卻兩周都沒有任何交付,你的經理怎么會知道你是真的在工作還是在看新聞。

    所以交付可以使大家都輕松起來。不要認為你能夠做有價值的交付前必須理解整個項目。這是完全錯誤的。加一段javascript的驗證代碼對業務就很有價值,經理能夠通過你的交付達到對你的信任。這樣能夠向上級領導證明你的貢獻以及員工價值。

    日復一日,在你不斷修復bug及增強功能之后,就能夠慢慢開始理解項目架構。不要低估對系統方方面面理解時需要花費的時間。花3-4天理解認證機制,2-3天理解事物管理。這些都是依靠之前的相似項目的經歷,但關鍵還是要花時間才能透徹的理解。要在日常工作中擠出時間,不要向經理要求特定的時間來做這些。

    找找項目是否有一些不斷維護的單元測試用例。有效的單元測試用例是理解大型項目代碼的很好途徑。單元測試能夠幫助理解代碼片段,包括一個單元的外部接口(單元如何被調用以及返回內容)及其內部實現(調試單元測試比調試整個實際用例簡單許多)。

    你如果能夠很好的理解一些內容,寫一些筆記,或者畫一些類圖、時序圖、數據模型圖,以便你或日后其他的開發者維護。

     

    3         維護大型項目所必須的技能

    你能從事當前的工作,必然已經具有良好的java技術。我們來談談能夠讓你在新項目中良好表現的其他技能。大部分時間,你在項目中的任務是修復bug和增強功能。

    有兩項很重要的技能能夠協助你維護大型項目代碼。

    3.1         能夠迅速發現需要的類

    在任何維護活動中,無論是修復bug或增強功能,第一個動作就是識別出當前修復或增強的用例中調用的類。當你定位到需要修復或增強的類/方法,就已經完工了一半。

    3.2         能夠分析變更的影響

    當你在完成必要的修改或增強工作后,最重要的就是要確認你的修改沒有破壞代碼的其他部分。你要用你的java技術及對其他框架的理解找出變更可能影響的部分。下面有兩個簡單的例子詳細描述了最后提及的情況:

    a)當類A的equals()方法變更后,調用一個保護A實例的List的contains()方法時就會被影響到。若Java知識不夠,很難考慮到這樣的影響。

    b)在一個web項目中,我們假設“user id”保存在session中。一個新入程序員可能在“user id”中加入一些信息作為bug修復的方法,但是卻不知道會影響到那些關聯“user id”的用例。

    當你提高了如上兩個技能,盡管你對項目不是非常了解,但大部分的維護任務會變得簡單很多。若你修復一個bug,你會定位并修復這個bug,并且保證變更不會破壞項目的其他部分。若你增強或加入一個特性,基本上你只需要模仿現有的特性使用相似的設計。

    在一個在線銀行項目中,為什么“查看賬戶摘要”和“查看交易歷史”的設計需要巨大的差別呢?如果你理解了“查看賬戶摘要”的設計,完全可以模仿開發出“查看交易歷史”的功能。

    就修復bug和增強來說,你不必完全理解所有2000個類的工作內容和代碼如何運行來推動系統。你若有上面的技能,就能很快定位需要修改的代碼的部分,使用良好的java和框架技能修復,保證變更不會破壞項目的其他部分并交付,盡管你可能只知道一小部分項目的設計。

    4         使用工具找到需要的變更內容以及變更產生的影響

    繼續我們盡快交付的主題,你應當尋找那些能夠通過盡量少的了解項目但能幫助你盡快實施交付的工具作為輔助。

    4.1         迅速發現需要變更內容的工具

    無論是修復bug還是系統增強,首先都要找到該用例調用的你需要修改的類及方法。基本有兩種方式理解一個用例的工作方式,靜態代碼分析和運行時分析。

    源碼分析統計掃描所有代碼并且展示類之間的關系。市場上有很多設備與工具。比如:Architexa, AgileJ, UModel, Poseidon等。

    所有的靜態代碼分析工具缺點在于無法確切展示用例中類或方法的運行時調用情況。因此Java新加入了特性,如回調機制(callback patterns)。如靜態分析工具無法推斷出當頁面提交按鈕被點擊時哪個Servlet被調用了。

    運行時分析工具能夠展示類和方法在用例運行時的狀態。工具包括:MaintainJ, Diver,jSonde,Java Call Tracer等。這些工具可以捕獲運行時的堆棧狀態,并以此為一個用例生成序列圖和類圖。

    序列圖展示了該用例在運行時所有調用的方法。若你在修復一個bug,那這個bug很可能就是這些被調用的方法之一。

    若你在增強已有功能,利用序列圖理解調用流程然后再修改。可能是新增一個驗證,修改DAO等。

    若你在新增功能,找到一些相似的特性,利用序列圖理解調用流程然后模仿開發新功能。

    要小心挑選運行時分析工具。信息過多是這類工具的主要問題。選擇一些提供簡單過濾無效信息并能夠方便的查看各種視圖的工具。

    4.2         迅速發現需要變更內容的工具

    若單元測試有效,可以通過運行單元測試發現變更有沒有破壞其他測試用例。有效維護并且覆蓋大型企業應用的單元測試還是比較少的。下面有一些針對該情況的工具。

    仍然是有兩種技術靜態代碼分析和運行時分析可以使用。市場中有很多靜態代碼分析工具可用。如:Lattix, Structure101, Coverity, nWire and IntelliJ's DSM。

    給定一個變更后的類,上述工具均可識別對該類存在依賴的類的集合。開發者需要根據這些信息“猜測”可能產生影響的用例,因為這些工具無法展示運行時類之間的調用關系。

    市場上的可以用于運行時影響分析的工具并不多,除了MaintainJ。MaintainJ先捕獲在一個用例中調用的所有類和方法。當所有用例的上述信息都被捕獲之后,就很容易發現類的變更對用例的影響。MaintainJ能夠有效工作的前置條件就是項目的所有用例都應當先運行一遍,以便能夠獲得運行時的依賴關系。

    總之,目前你在迅速準確分析變更影響方面,還是可以從工具中獲得有限的幫助。首先根據需要實施一些影響分析,然后根據自己或小組其他高級成員評審來判斷變更的影響。你可能需要上面提到的工具對你的判斷進行反復確認。

    5         對上述內容的兩個忠告

    5.1         不要降低代碼質量

    為了快速交付,所以沒有全盤理解架構,但絕不能以降低代碼質量為條件。下面是一些你可能因為只考慮快速交付而引發的代碼質量問題。

    因為修改代碼涉及到很多的依賴,所以新增代碼相對而言風險較小。例如,有5個用例都調用了某個方法。為了改進某個用例,你需要修改這個方法的實現。最簡單的做法就是復制這個方法,重命名,然后在改進的用例中調用新方法。千萬不要這么做。代碼冗余絕對是非常有害的。嘗試對方法進行包裝或者重寫,甚至是直接修改,然后重新測試所有用例,通常停下來想一想,然后親手去實施,是一個比較好的方式。

    另一個例子是將“private”方法改為“public”,使得別的類也可以調用。盡量不要將非必須的部分暴露出來。假如為了更好的設計需要重構,就應當著手去做。

    大部分應用都有確定的結構和模式來實施。修復或增強程序時,確認你沒有偏離這樣的模式。若對約定不確定,請其他的高級開發者來審核你的變更。若你必須做一些違背約定的實施,盡量放置于一個規模較小的類中(一個200行代碼的類中的私有函數應當不會影響應用的整體設計)

    5.2         不要停止深入理解項目架構

    按照文章列出的方式,假設你能夠在對項目了解較少的情況下進行交付并以此持續下去,可能你會停止對項目架構的深入了解。這樣從長遠角度來說對你的職業生涯沒有幫助。當你的經驗增加時,你應當承擔比較大的模塊任務。如構建一個完整的新特性或者修改項目的一些基礎設計等較大的改進。當你能夠做這些改進時,你對項目的整體架構應該相當了解。文中列舉的方法是讓你在最短的時間內提升自己,而不是阻止你完整理解整個項目。

    6         結論

    整篇文章集中在對項目進行必要了解的前提下進行快速交付。你可以在不降低代碼質量的前提下這么做。

    若修復一個bug,迅速定位并修復。有必要可以使用運行時分析工具。若新增一個特寫,可以尋找相似特寫,理解流程(有必要使用工具)并編寫。

    或許這些聽起來很簡單,但是實用嗎?當然。但前提是你有良好的java技術以及對框架足夠了解才能先修改代碼,然后對變更影響進行分析。對變更影響的分析比實施變更需要更多的技巧。你可能需要高級開發人員協助你分析變更影響。

    大約有50%的IT可操作預算用于簡單的bug修復和功能增強。根據文中的建議,對于維護活動中的經費的節省應當還是很有幫助的。

    作者Choudary Kothapalli 也是MaintainJ項目的建立者。

    About the Author

    Choudary Kothapalli is the founder of MaintainJ Inc., the company that builds tools to reduce the costs of maintaining large Java applications. He has over 15 years of experience in developing and maintaining enterprise Java applications. He is a Sun Certified Enterprise Architect and Java Programmer. He lives with his wife and two sons in Toronto, Canada.

     

    posted @ 2012-03-29 22:44 一酌散千憂 閱讀(431) | 評論 (0)編輯 收藏

    軟件企業的技術體系架構包括對軟件產品本身及生產過程、軟件生產環境及生產者的管理和支持,此架構應當基于下列五項基礎建設之上:

    l 開發技術架構

    l 開發環境架構

    l 過程管理架構

    l 企業產品架構

    l 企業人件架構

    下面詳細介紹各項架構的內容及特點。

     

     

    開發技術架構

    開發技術架構作為一個軟件企業的基石,包括可復用的架構組件、公用的基礎代碼庫等。開發技術框架應當在一個良好的過程管理之下,嚴格的質量管理與實用性檢查,并且鼓勵普通技術人員的參與。

    1.建立技術架構倉庫標準體系與維護模式。建議使用MAVEN作為所有開發技術(包括架構預研與實際項目開發)的基礎項目管理工具,實施嚴格的質量管理和持續集成。

    2.選拔組建高素質的架構師隊伍,并且鼓勵技術人員參與到技術架構倉庫的構建和維護。

    3.加強技術架構實用性與適用性的檢查與改造。

    4.架構運營模式的考察,技術架構的改進與預研。技術架構的預研模式比較復雜,多個部門中多個項目可能都會要求進行多個同類框架的考察、比較、環境搭建等工作,若集中在獨立架構組可能壓力較大。可以考慮架構組內部劃分為多個技術領域,如企業基礎應用架構、消息中間件、動態化組件、分布式集群等。以技術部門的實施領域作為導向,進行技術架構的預研。

    5.開放知識系統的構建(內部wiki,個人博客,視頻分享)

    根據企業行業背景,需要關注的技術領域包括:企業應用、ESB/SOA、大型分布式架構(在線/離線),自然語言處理。

     

    開發環境架構

    包含IDE,編譯環境,遠程支持,通訊支持與其他大量功能性支持軟件,并可以根據不同的工作角色制定不同的環境,以便排除干擾,更加快速有效的進入工作狀態。

    項目的關鍵問題是溝通,個性化的工具妨礙——而不是促進溝通。開發和維護公共的通用編程/項目管理工具有很多的好處。

    1.建立具有鮮明特色與強大實用性的自有開發環境,展示一個軟件龍頭企業在企業技術沉淀中的深厚功力和規范性。

    2.建立行政流程以規范和約束開發環境管理。

    3.劃分相關職能以保持對開發環境的維護

    4.建立多種培訓機制以促進新員工能夠迅速投入工作。如固定新員工開發環境熟悉培訓機制,建立企業講解&培訓視頻庫,小組內互助&溝通。

     

    過程管理架構

    1.過程方法

    對多家企業軟件生命周期中使用的過程方法進行調查了解到,大部分優秀的軟件企業對于過程方法十分重視,且存在針對不同項目合理運用不同的過程方法。項目經理對于過程方法的理解與運用常常關系到項目的成敗。

    目前核心的管理模型/過程方法主要分為三大類:CMMI,RUP,敏捷。

    CMMI作為軟件質量體系的標準,軟件企業必須具備的資質,具有文檔齊全,流程規范等優勢,對于大型核心項目有較大優勢,其劣勢在于靈活度不足,無法很好的滿足日益變化的需求。

    RUP由Rational公司(被IBM收購,目前是IBM 軟件集團旗下之第五大軟件品牌)提出,采用迭代開發模式,四個階段,九大核心工作流,明確的角色劃分與文檔規劃,可裁剪配置的開發過程。目前被大量的軟件廠商作為最核心的過程方法使用。

    敏捷(Agile)為了滿足隊伍小型化和需求快速變化而產生的目前最流行的過程方法。XP(Extreme Programming)通過簡單的四個核心價值(溝通(Communication)、簡單(Simplicity)、反饋(Feedback)和勇氣(Courage))與十二條最佳實踐從研發的角度提出了最簡單直接的開發方式。XP的形態特殊,從編程的角度描述方法與原則,加入了SCRUM之后,加強了從行政體制方面的支持,從而形成了完整的敏捷開發的過程方法體系。

     

    過程方法一定不是萬金油,針對不同的企業特點,甚至不同項目,都有必要對過程方法進行合理的裁剪與整合。對于目前公司的情況,大型核心項目可以使用CMMI,這些往往決定了企業的戰略方向,穩健的過程方法最為合適。大部分中小型項目均可采用 RUP+敏捷 的過程方法,即遵守RUP的核心階段和工作流,但是迭代周期和開發的基本原則根據敏捷,并挑戰整合部分敏捷方法中的最佳實踐。這樣的策略用于面對市場需求的快速變化,同時也能很好的保障企業在軟件生產中的產品價值保存和技術經驗積累。

     

    2.過程方法自動化支持

    針對不同的過程方法,往往有若干的軟件產品用以快速自動化的實施。如實施CMMI時所使用到的DEVSUITE產品。完整體系的支持產品往往在應用于某套固定方法有著良好的效果,但容易存在流程生硬,無法與開發環境更好結合形成了信息孤島,改進困難等缺點。一套優秀的過程方法支持軟件,需要和開發環境(如IDE等)良好結合,并且易于調整以應對過程方法的變化,同時沒有復雜冗余的過多細節流程以便容易被開發人員學習和掌握。

    產品涉及方面:項目計劃、項目需求管理、軟件配置管理、自動集成、自動產品發布、代碼審核、代碼質量管理等。

     

     

    企業產品架構

    1.產品/產品需求流程補充,產品立項時的立項報告中應當包含市場、競爭對手、對手產品、風險等分析。

    2.領域模型與概念,在特定的行業中可以即使關注領域專家的動態,以便構建正確的領域模型,確定產品的發展方向和形態的正確性。

    3.對于特定產品的領域概念及相關技術發展需要深入了解,如輿情分析系統,需要進行了一定的市場調查,跟進了當前領域專家的報告,參考國內外多項相關項目的設計理念和原則。對于目前市場狀況、未來的方向、目前的技術實力等要有比較清晰的概念

    4.堅持以市場為導向的原則,在商務部門與研發部門之間搭建積極的溝通橋梁,研發部門的計劃根據實際市場需求進行調整。產品的發布配合市場的要求,達到利益最大化。

     

     

    企業人件架構

    企業自身環境除了常見的軟件(Software),硬件(Hardware)以為,還應當加入人件(Peopleware)。之前的種種,如過程方法、技術架構積累、知識分享等均是為了將整個企業構建成為一部精密的機器,無論缺少什么重要零件均可以快速修復,但是人員流失所造成的損失是巨大的。目前公司有著良好的軟硬件環境,技術部門作為發動機,若在針對技術性員工有特別的規劃和關心,必然能夠增強在整個市場中的競爭力,對企業自身的發展也是有良好的推進作用。

    公司可以按照職位和員工自身的情況規劃發展路線,明確技術目標。開發進化角色基本按照軟考標準,程序員-高級程序員-軟件設計師-系統分析師-系統架構師,程序員-高級程序員-項目經理。

    在技術部門內部,可以定期組織交流心得、新技術等。(在SCRUM中實際上有一些比較好的行政手段可以借鑒參考)

    由于軟件技術部門的特殊性,一些應用于生產線的行政制度可能能夠討論出更好的實施方案,避免員工單方面的錯誤認識引發消極的工作態度。

    由于有一定經驗,而且公司技術架構建設的需要,能夠很好的協助企業進行技術架構全方面的介紹和培訓。而且我自身也很希望參與到企業文化的建設工作中去,鼓勵技術人員之間的技術交流與溝通。

     

    posted @ 2012-03-29 16:27 一酌散千憂 閱讀(1309) | 評論 (0)編輯 收藏

    Example 2-2. A program for finding the maximum recorded temperature by year from NCDC weather records

    #!/usr/bin/env bash

    for year in all/*

    do

      echo -ne `basename $year .gz`"\t"

      gunzip -c $year | \

        awk '{ temp = substr($0, 88, 5) + 0;

               q = substr($0, 93, 1);

               if (temp !=9999 && q ~ /[01459]/ && temp > max) max = temp }

             END { print max }'

    done

     

    使用linux腳本打印每年最高溫度,先解釋一下該腳本幾個注意點。

    腳本目的是發現每年的最高溫度,第一句for year in 后的all/*表示在名稱為all的文件夾下每年度的溫度信息都以 1990.gz 方式存在。使用gunzip方式解壓并打印,對打印的內容使用awk函數進行處理,獲取最大溫度,單個文件處理完畢后打印max

     

    在上一篇中獲取的數據包是這樣,年度為文件夾,當中包含若干個溫度詳情文件。

    E:\testData\1990\010010-9999-1990.gz

    E:\testData\1990\010014-9999-1990.gz

    E:\testData\1990\010015-9999-1990.gz

    E:\testData\1990\010016-9999-1990.gz

     

    從后面Appendix C的描述中得知,實際上作者對這樣的數據進行了處理,因為hadoop在處理大量的小文件時無法達到很高的效率,因此作者使用hadoop將小文件合并,并且給出了代碼。

     

    我比較希望能夠使用腳本處理,將所有的gz解壓之后,合并成為一個文件,打包成gz的格式,這樣就能完全符合之前那段腳本的處理方式。所以,腳本如下:

    packyear

    #! /bin/sh

    # /usr/data/packyear

     

    # unzip all gz files in data

    for yeards in data/*

    do

           # unzip all gz files in year directory

           for gzfile in $yeards/*

           do

                  gunzip $gzfile

           done

          

           # cat all content to year file

           cat $yeards/* | head -2 >> $yeards.tc

     

           # remove year directory

           rm -rf $yeards

           mv $yeards.tc $yeards

     

           # zip the tc file

           gzip $yeards

    done

     

    根據實際路徑改寫的計算最大溫度的腳本

    maxyear

    #! /bin/sh

    # /usr/data/ maxyear

     

    for year in /usr/data/*

    do

      basename $year .gz

      gunzip -c $year | \

        awk '{temp=substr($0, 88, 5)+0;

            q=substr($0, 93, 1);

            if(temp !=9999 && q ~ /[01459]/ && temp > max) max = temp}

          END {print max}'

    done

    這個腳本最終顯示出來會是:

    1990

    3

    這樣的格式。由于對數據結構的不熟悉,所以不確定顯示出來的數據是否正確,但是基本的腳本和數據操作方式就是這樣了。

    posted @ 2012-03-29 16:21 一酌散千憂 閱讀(484) | 評論 (0)編輯 收藏

    Hadoop: The Definitive GuideHadoop權威指南),第十六頁中提到了測試數據來源來自于National Climatic Data Center (NCDC, http://www.ncdc.noaa.gov/)。在下面使用Unix Tool編寫腳本時使用到的文件格式如下:

     

    For example, here are the first entries for 1990:

    % ls raw/1990 | head

    010010-99999-1990.gz

    010014-99999-1990.gz

    010015-99999-1990.gz

    010016-99999-1990.gz

    010017-99999-1990.gz

    010030-99999-1990.gz

    010040-99999-1990.gz

    010080-99999-1990.gz

    010100-99999-1990.gz

    010150-99999-1990.gz

     

    對于數據的來源很困惑,不知道如何下載。google之后在http://lucene.472066.n3.nabble.com/The-NCDC-Weather-Data-for-Hadoop-the-Definitive-Guide-td3736774.html 這篇帖子中發現方法。現在記錄一下

    連接http://www.ncdc.noaa.gov/


    注意到左邊的
    Free Data

    點擊后轉到的頁面向下拉,在Free Data B中友一個完全免費的FTP(紅框所示)


     

    提供ftp地址為:ftp://ftp3.ncdc.noaa.gov/pub/data/noaa/

    我使用了FileZillahttp://dl.pconline.com.cn/html_2/1/89/id=5826&pn=0.html)進行下載


    1w多個文件,可能是不需要完全下載的。

    (完)

    posted @ 2012-03-28 10:32 一酌散千憂 閱讀(1725) | 評論 (0)編輯 收藏

    僅列出標題
    共2頁: 上一頁 1 2 
    主站蜘蛛池模板: 亚洲色偷拍另类无码专区| 国产免费AV片无码永久免费| 亚洲国产另类久久久精品黑人| 成人免费夜片在线观看| 内射无码专区久久亚洲| 最新亚洲人成无码网www电影| 免费国产a国产片高清网站| 韩国亚洲伊人久久综合影院| 国产国产人免费人成免费视频| 春暖花开亚洲性无区一区二区| 亚洲另类激情专区小说图片| 一级毛片免费在线| 日本红怡院亚洲红怡院最新| 午夜老司机永久免费看片| 亚洲熟妇色自偷自拍另类| 大地资源在线观看免费高清| 亚洲欧美日韩国产成人| 亚洲成网777777国产精品| 永久免费毛片在线播放| 久久久久久亚洲精品影院| 日韩免费毛片视频| 久久精品成人免费观看97| 久久精品视频亚洲| 99久久综合国产精品免费| 风间由美在线亚洲一区| 国产成人精品日本亚洲| 美女网站免费福利视频| 免费观看亚洲人成网站| 亚洲av无码片在线播放| 最近最好的中文字幕2019免费| 香港一级毛片免费看| 亚洲av日韩综合一区在线观看| 成人黄页网站免费观看大全| 羞羞漫画小舞被黄漫免费| 亚洲av无码潮喷在线观看 | 成人精品综合免费视频| 久久青青成人亚洲精品| 成人免费视频观看无遮挡| 一区二区三区免费电影| 亚洲成A∨人片在线观看无码| 免费国产综合视频在线看|