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

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

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

    The important thing in life is to have a great aim , and the determination

    常用鏈接

    統計

    IT技術鏈接

    保險相關

    友情鏈接

    基金知識

    生活相關

    最新評論

    #

    這樣的辭職報告夠感人吧?(轉載)

    尊敬的公司領導:
        您們好!
        首先祝公司在新的一年中蓬勃發展,取得更加優異的成績;祝愿公司上下所有領導和員工身體健康,萬事如意!我為能在****工作過感到無比的榮幸和自豪,我會懷念在這里的每時每刻,感謝公司給了我這么一個機會。在公司這一年多里,公司領導和周圍同事給了我無比的照顧和關懷,讓我深切的感受到了公司倡導的人情化管理給我們帶來的親切和溫馨。我深信,公司將沿著通往勝利彼岸的高速軌道飛速前進,將一如既往的在*******領域領航!
        我是06年初帶著滿身激情來到北京的,原打算在我們偉大的首都能有一番作為,現在看來這些遠大抱負都將離我遠去了。也許我是一個弱者,不能去面對困難與挫折,沒能很好的預料到即將到來的暴風雨,以至于現在讓我措手不及,不敢面對,面對重重壓力,我只能選擇逃避。畢竟我不單單是我,我還有我的家庭,有我的父母和妻子,我不能太過于自私,不能為了自己的事業而忽略了他們的感受。一切的理想和抱負都是過眼云煙,在這繁忙的首都我終將迷失方向。回家過著一份安靜平和與世無爭的生活也許是我最好的選擇。在家里我能照顧我年邁的雙親,能和妻子相濡以沫恩恩愛愛,能很好的養育我的孩子們,但是在北京這一切都無法做到,面對瘋漲的房價,高額的房租,攀升的物價,想在北京安個家永遠只是那些被上帝寵壞了的人所能實現的,而我只能癡心妄想。我不想眼睜睜的看著自己的雙親老去,而自己不能很好的盡到做兒子的職責,不想忍受等我有所成時子欲養而父不在的那種痛苦;我不想看著妻子和我在北京居無定所,瓢潑不定的一天天老去,這會讓我一輩子永遠愧對我的妻子;我不想讓我的孩子在剛出生時就不知道他的爸爸在哪,不想讓他成為時下最為關注的留守兒童,如果不能盡到一個父親的責任,我會永遠對不住我的孩子……所有這一切讓我不得不重新考慮自己的人生,我想我最好的選擇就是回家,雖然那會讓我留下終生的遺憾,但是我想做一個好兒子,好丈夫,好爸爸比什么都更重要,況且回家我照樣可以有自己的一番事業,是金子到哪都會閃光。
        這段時間,我會把自己負責的****項目那塊很好的完成,會把自己的活交接完畢。如果我的離去給公司帶來了好多不便,我表示萬分的歉意,希望公司領導考慮考慮我的實際情況給予理解。我真誠的懇請公司領導批準我的辭職申請,在這里我表示衷心的感謝,同時祝愿公司不斷壯大發展!
        此致
    敬禮!
                                                       ***:**
                                                               2007年3月13日

    posted @ 2007-04-02 14:20 鴻雁| 編輯 收藏

    華為軟件外包測試流程(轉載 來源:希賽網)

    不知不覺做華為外包項目已一年多了,曾在華為常駐過,也曾負責過項目的測試,感覺對華為外包項目的測試流程較熟悉,故寫些心得來與大家分享。

    ????? 如果競標成功,項目就開始要啟動了。

    ????? 華為方會提供一份CRS(客戶需求)和SOW(工作任務書),華為方派人過來進行需求培訓,這時該項目的測試組長也要參與到項目需求的培訓和評審,也就是測試工作應該從需求開始介入。

    ????? 項目經理編寫《項目計劃》,開發人員產出《SRS》,這時測試組長就要根據SOW開始編寫《測試計劃》,其中包括人員,軟件硬件資源,測試點,集成順序,進度安排和風險識別等內容。

    ???? 《測試計劃》編寫完成后需要進行評審,參與人員有項目經理,測試經理和華為方人員,測試組長需要根據評審意見修改《測試計劃》,并上傳到VSS上,由配置管理員管理。

    ????? 待開發人員把《SRS》歸納好并打了基線,測試組長開始組織測試成員編寫《測試方案》,測試方案要求根據《SRS》上的每個需求點設計出包括需求點簡介,測試思路和詳細測試方法三部分的方案。《測試方案》編寫完成后也需要進行評審,評審人員包括項目經理,開發人員,測試經理,測試組長,測試成員和華為方;如果華為方不在公司,就需要測試組長把《測試方案》發送給華為進行評審,并返回評審結果。測試組長組織測試成員修改測試方案,直到華為方評審通過后才進入下個階段――編寫測試用例。

    ????? 測試用例是根據《測試方案》來編寫的,通過《測試方案》階段,測試人員對整個系統需求有了詳細的理解。這時開始編寫用例才能保證用例的可執行和對需求的覆蓋。測試用例需要包括測試項,用例級別,預置條件,操作步驟和預期結果。其中操作步驟和預期結果需要編寫詳細和明確。測試用例應該覆蓋測試方案,而測試方案又覆蓋了測試需求點,這樣才能保證客戶需求不遺漏。同樣,測試用例也需要通過開發人員,測試人員和華為方的評審,測試組長也需要組織測試人員對測試用例進行修改,直到華為方評審通過。

      在我們編寫測試用例的階段,開發人員基本完成代碼的編寫,同時完成單元測試。華為的外包項目一般是一次性集成,所以軟件轉測試部后直接進行系統測試。測試部對剛轉過來的測試版本進行預測試,如果軟件未實現CheckList清單上的10%,測試部會把該版本打回。否則,軟件轉測試部進行系統測試。根據《測試計劃》進度安排,測試組長進行多輪次的測試,每輪測試完成后測試組長需要編寫測試報告,其中包括用例執行通過情況,缺陷分布情況,缺陷產生原因,測試中的風險等等,這時測試人員就修改增加測試用例。待到開發修改完bug并轉來新的測試版本,測試部開始進行第二輪的系統測試,首先回歸完問題單,再繼續進行測試,編寫第二輪的測試報告,如此循環下去,直到系統測試結束。在系統測試期間,測試人員還需要編寫驗收手冊,驗收用例和資料測試用例等。

      完成系統測試后,軟件就開始轉到華為進行驗收測試,其中大概測試半個月,一般會要求測試部派人到華為方進行協助測試,并發回問題單給公司開發人員修改。

      如果驗收發現的缺陷率在SOW規定的范圍內,那么驗收成功,華為方付錢給公司,項目結束。如果超過規定的缺陷率,那么公司可能要罰錢了,整個項目組的成員(包括開發和測試)都可能要罰了。這種情況也會有,如果按照流程做事,概率不會很大。

      測試流程的規范是很重要的,但是如果要成為優秀的測試人員只知道流程還是不夠的,需要學習的東西還很多,包括熟悉相關測試業務,計算機專業知識(linux,oracle,tcp/ip等),開發的架構和語言,性能測試和系統瓶頸分析、調優等。還有性格(細心,耐心)和人際溝通能力也是很重要的決定條件。任重而道遠,我剛起步,希望大家一起在測試的路上互勵互勉。

    posted @ 2007-03-28 15:16 鴻雁 閱讀(197) | 評論 (0)編輯 收藏

    如何作好軟件項目的分析(轉載希賽網)

    本文結合自己的經驗,從實踐的角度,對項目軟件的分析工作從7個方面進行了闡述,并指出一些容易失誤的做法。希望能對從事分析工作的同仁有所參考。

      軟件從使用范圍的角度,可分為項目軟件和產品軟件。

      項目軟件:即針對特定某個客戶的要求,并僅為其使用的軟件。又稱工程軟件,特點是有明確的合同,嚴格的工期,約定的維護期等。如"XXX公司XXX系統"。

      產品軟件:即針對某一領域客戶的共有需求而開發的軟件。特點是通用、功能豐富而冗余,通過一次性的購買行為獲得等。如操作系統軟件、數據庫軟件、CAD軟件等。

      本文就項目軟件的需求分析,結合自身的體會,提出一些看法和建議。

    1、 依據分析階段確定合適的客戶方配合人員

      這一點對于獲取真正的用戶要求非常重要。通常,客戶方會組織專工以上層次的人或在單位小有名氣的計算機能手來和開發方分析人員配合,共同整理需求。

      應該對客戶方配合人員進行分類,層次化,使之和分析的各階段相對應。

      分析的初期,即總體分析階段,需要得到整體意義上的輪廓需求,此時,應與客戶方總工以上層次的人員進行交流,這一層次的人,對未來的系統會有完整的描繪,可以劃分出子系統,及其之間的關系,這也是高級管理層對系統的期望。可以以此作為綱領性的文檔指導進一步的分析,并約束后續的分析過程,避免需求范圍漫無邊際的擴大;
    專業系統分析階段,通常,客戶單位都會有專業分工,彼此之間既相互獨立,又會在某些點上發生聯系。此階段應與客戶方專工層次的人員進行深入的討論。這一層次的人,對自己的專業相當熟悉,對專業內的需求會非常到位,大都年富力強,有相當的閱歷和理解能力,甚至自己都可以繪制業務流圖,總結業務功能點。對他們應充分鼓勵,盡量調動其積極性;

      系統關聯分析階段,在各專業系統得到充分分析的基礎上,緊接著就要理清它們之間的關系,這是提升需求檔次的關鍵階段,也是高級領導層和專工都關心的階段。通常,客戶單位都會有一些零散的軟件,如財務軟件,部頒軟件等,這些專業軟件都發揮著重要的作用,但都是些信息孤島,客戶會很自然的希望能把這些信息融合到整個系統中來,為更多的人所共享。同時,也希望數據能夠在各專業系統間順暢的流動,從而減少重復勞動,提高工作效率。此階段應把總工層和專工層召集到一起,共同理清系統間的接口。

      經過這三個階段,對需求的描述將比較準確和完整。

    2、 多方位描述同一需求

      有一些需求貫穿了從基層人員到高層領導,對此需求應該從各個角度、各個方位給以描述,總結之后才能得到完整的表達,否則可能會漏掉一些信息。這也為后續的設計工作打好了基礎。

      比如,在設備管理類軟件中,有一個概念叫"缺陷",指由于材料老化或外力作用,使得設備處于不正常的運行狀態,但還沒有到立刻就釀成"事故"的程度,但如不及時檢修,就可能出事。對于設備缺陷業務,就涉及到從班組人員到領導,上上下下對此都非常關心,但各層次的人關心的側重點卻不盡相同:領導關心"消缺率"(即缺陷消除率)、"消缺及時率";專工關心缺陷類型和處理方法;班組人員關心消缺工作的人員安排及時間地點。缺陷的業務處理流程依賴于"設備缺陷單"(用于記錄缺陷及消除情況),如果僅僅局限于從由基層得到的設備缺陷單上的數據結構(設備名稱、缺陷發現人、發現時間、二級單位確認時間、缺陷性質、安排消缺時間、消缺人員、消除日期、處理方法),無法滿足專工層的分析要求:對設備的缺陷情況按類型、零部件、型號、生產廠家等分類統計,為設備采購時作為選型參考、調整設備及其零部件的檢修周期以減少缺陷發生的頻率等,因此需要在原來的設備缺陷單上增加一些相關信息。

    3、 清晰化每一數據項

      由于需求將作為設計的基礎,弄清所有的數據項的來龍去脈對于設計是必不可少的。不能有模糊不清的地方,同時通過對數據項來源的分析,可以讓分析人員更清楚的看到數據的流動情況,也會發現一些新的需求點。

    4、 充分挖掘潛在需求

      由于分析人員對軟件技術非常熟悉,一些由于技術所帶來的潛在需求對于客戶來說,一般很難被發現。不實現這些需求,對整個系統也沒什么實質性的影響;實現這些需求,則會錦上添花。

      對這些潛在需求,會有兩種處理方式:告訴客戶,客戶會得到啟發,可能進一步提出新的需求,會有一些更大膽的想法,從而擴大了需求范圍,增加了工作量,甚至會影響到工期;不告訴客戶,等客戶想到了再說。

      這些需求如果對于產品軟件,可能會是一個賣點,要盡可能的去挖掘。但對項目軟件,考慮各種風險,有時候可能會回避,或對客戶隱瞞。

      我覺得,不管是否告訴客戶,分析人員還是應該去挖掘,最起碼可以作為自己的知識積累。

    5、 采用科學的分析報告模板

      分析完成后,需要形成《需求分析報告》,應采用規范科學的報告模板,通過ISO或CMM的企業,其模板大都非常詳盡,不僅僅作為報告模板,還可以指導分析過程。

      比如,我所在的企業除了有規范的需求分析報告編寫指南、報告模板,還有"需求分析矩陣"和"需求變更報告"用于管理需求和控制變更。

    6、 積累領域知識

      領域知識對于分析人員很重要,這些知識的廣度和深度影響分析結果的準確性和分析進度。分析人員應該通過各種途徑去獲取這些,不斷積累,并進行比較和總結。

    7、 抱著學習與指導并存的態度

      面對一個新的客戶時,分析人員首先必須抱著謙遜的學習的態度,把這看成是豐富領域知識的機會。但并非客戶單位的任何層次的人都有值得學習的東西,隨著分析人員接觸的領域客戶不斷增多,分析人員對該領域的理解也會越來越深,逐漸會成長為領域專家,會有很多地方超過客戶對領域的理解,此時,要以自己的深入理解去指導客戶,說服客戶,甚至糾正客戶的一些錯誤的認識,得到客戶的信任與尊敬,這對迅速順利的完成需求分析會很有幫助。

    8、 誤區

      在進行需求分析的時候,容易陷入一些誤區,導致分析結果不理想。

    分析結果越復雜越好

      這是技術型分析人員經常碰到的情況,認為分析出錯綜復雜的關系,花哨的圖表才能顯示出分析水平高,其實,分析經常要經歷"簡單-復雜-簡單"的過程,前一個簡單表現為分析人員"認為簡單";隨著分析的深入,原以為簡單的問題會越來越復雜;最后,經過概括、消化、分解,使得需求簡單明了。

    必須一次到位

      由于項目工期緊,或者客戶單位地理位置偏遠,不想反復去現場,希望通過一次需求分析就能得到完整的不再改變的結果。有這種情況時,表現為分析人員對客戶方配合人員窮追猛問,或堅持要求配合人員做出保證,承諾需求范圍不再擴大等等。結果往往是雙方關系緊張,配合人員怕擔責任,提出過多的靈活的、可配置的一些要求,無端增加了后續設計和編碼的工作量。一次到位的想法是不現實的,隨著開發工作的進行,用戶經常會提出以前沒想到的需求,或者更改已有的需求。需求必然有一個迭代的過程,變是不可避免的,關鍵是對于變化的控制,比如通過正規而繁復的流程提高需求變化時客戶付出的代價:告知客戶如此變化將會使工期延長,或需要追加資金等等,盡管對于"軟件屬于買方市場"的現狀來說,開發方往往叫不起這個板,但這樣的控制還是有一定的效果的。

    客戶的需求必須全部滿足

      陷入這一誤區的分析人員,往往自己的領域知識欠缺,對客戶的需求是否合理,缺乏分辨能力,只能由客戶牽者走,這樣會帶來很大的風險:造成需求冗余,項目返工,更有對需求變化失去控制的危險,隨著項目的開展,整個開發團隊會越來越痛苦。所以必須加深自己的領域知識,變被動接受為主動引導,進而拒絕客戶的不合理需求。

      以上所述僅為個人體會,都是些做分析時的基本要求,要做好需求分析工作,還有賴于其他很多因素,如分析方法及輔助分析工具的掌握程度、個人交際能力的高低、語言溝通能力的高低等等,歡迎同行廣泛交流,共同進步

    posted @ 2007-03-28 15:01 鴻雁 閱讀(364) | 評論 (0)編輯 收藏

    寂寞不歸路-軟件高手是這樣練成的(轉載 來源:希賽網)

    中國人大都喜歡用武俠小說來比較軟件開發,但是在實戰武功中,只有葵花寶典才是最厲害的,也只有掌握了葵花寶典,才能稱為“不敗”。
    ??
      但什么才是軟件開發的葵花寶典?

      讓我們先從一些現象出發。我們的前提是,軟件開發是一項智力密集型勞動。對于智力密集型勞動,我們觀察到的現象是,個體的表現差異很大,團隊的表現差異很大,組織的表現差異很大,國家的表現差異很大。這不象體力占主要的勞動,象百米王跑百米的速度也僅比我快50%。但在棋類運動中,一個高手可以車輪戰數位低手,而且毫無例外地將他們一一擊敗!

      這些智力運動員表現出的特點是,計算精確而且速度快。其行為很象東方不敗。雖然關于葵花寶典的傳說很多,但最準確的描述只有一個字“快”。東方不敗已經快到了嚇人的地步。就象卡斯帕羅夫已快到了深藍的地步。

      有一則關于物理學家玻爾的軼事,有一次玻爾在普林斯頓大學聽兩個年青教授演講他們的工作成果。期間玻爾突然發言說,如果照你們的研究算下去,會得到一個很有意思的推論。結果兩個年青教授回去計算了兩天,果然得出了同樣的結論。玻爾是如何做到這樣快的?

      在軟件開發中,我們同樣注意到這樣一種高手,他們可以每天寫出一千行左右的高品質代碼。他們可以運用已有的一些軟件包,迅速完成一個新的產品。他們可以在很短的時間內,學會一項新的程序語言或是新技術。他們表現出一種神奇的速度。

      在武俠小說中,所有的高手都有一些凡人不能企及的表現。象張無忌學太極,用龍爪手擊敗龍爪手名家;喬峰用太祖長拳擊敗天下英雄;姑蘇慕容以其人之道還治其人之身,令狐沖一劍剌瞎十幾雙眼睛等等。我認為,之所以他們能做到這樣,關鍵是在于他們快。

      快并不意味著不準或品質差。快與品質并不矛盾。

      高手的快,其實包含著很高的品質在其中。如果你因為高手的快,就質疑其品質,那就相當于在問:東方不敗出手那么快,會不會刺不準?東方不敗并不滿足于刺死對手,他會在對手身上刺朵花。他把殺人變成了藝術。準確來說,他真正的興趣不在殺人,而在于藝術。

      退一步說,就算東方不敗第一擊有點偏差,他稍作修正后,馬上跟上的第二第三擊,也會擊中他想擊中的地方。在武功差的對手劍還沒撥出來的時候,他已殺死對方并刺上了一朵花。

      所以真正的軟件高手,他并不滿足于他的代碼能有效地工作了,他認為編程是藝術,并醉心于其中。在低手能寫出一個版本的時間里,他已經寫出了第十版。其品質當然不可同日而語。就象一個九段棋手,在給定的時間里,他能計算十種可能,并將每種可能計算到100手之后,從中選擇一種最有利的下法。低手豈有茍全的機會?

      高手寫軟件總是不停地在重構(refactoring)。高手喜歡迭代式開發。高手說,增量就是打補丁,迭代就是推倒重來。對于軟件這種東西,寫一遍它可能ok(做到這一點也不容易),寫十遍就是一個偉大的產品,再多寫一遍它就更偉大些。

      高手快的訣竅在于他很熟悉各種東西。高手看書很快,因為每一本新書里,值得他好好看的新技術只有一兩章的內容。他能迅速看完,并準確領會這本書的中心思想和價值。而對于一個新手,每句話都是新的,他都需要去理解,每一段例子,他都需要去試。

      很少看到一種100%全新的技術或理論。就象java language specification里說的,java沒有使用任何新技術,用的都是業界久經考驗的技術。對于高手來說,那些技術都是他所熟悉的。自然,很快他就從一個c++高手變成了java高手。如果一個編程新手學java,學兩年也不如一個高手學兩個月的。高手學新東西快。

      高手寫代碼速度快。統計結果說,人均每人月的有效代碼速度大概是300至400行。但那是業界平均生產效率。對于高手來說,這個數字太低了。每天寫300至400行是完全有可能的。因為在寫代碼時,所有知識都已具備,已經沒有任何需要他多花時間的事情了。他甚至很少需要debug。

      高手重用代碼的能力很強,熟悉新的api的速度很快。這也是因為,他曾經使用過很多的api,重用過很多的代碼。他知道哪些是可用的,哪些有缺陷。他既過用qt,也用過gtk+,也用過windows api & mfc,也用過awt & swing。新的api對他來說,也是老熟人。

      高手喜歡用輕量級的工具,象vi,notepad,最多到ultraedit這樣復雜的。高手用這種工具寫出很多的東西。這些工具就象東方不敗的針。那根針已具有神奇的魔力,有時候它可以當激光槍來用。

    ??????? 對于一些重量級的工具,高手雖不常用,但一經使出也威力大于常人。如果讓東方不敗用劍,最厲害的劍術名家也會敗得很難看。高手其實用過很多的重量級工具,而且深知其優缺點。所以使出來,就會把威力發揮到最大,而把缺陷減少到最小。而低手則不然,總是把缺陷加以大大的發揚而渾不知其精髓何在。就象很多人學用uml、rup、xp、design pattern那樣。

      高手所學博雜且融會貫通。高手做什么都快,當低手還在一愁莫展的時候,高手已經圓滿解決問題,去干別的事去了。

      相信你有一點點想成為高手了。但是有一個問題亟等解決,那就是“欲練神功,必先自宮”的問題。這一點其實是有比喻意義的。就是說,你必需拋棄一些世俗的人們很看重的東西。有詩為證:

      世人都曉高手好,只是寂寞受不了

      世人都曉高手好, 只有名利忘不了

      世人都曉高手好, 只有金錢一定要

      世人都曉高手好, 天下美女都要抱

      世人都曉高手好, 不寫代碼最最好

      高手的武功不是一朝一夕練成的。還記得玻爾那件軼事嗎,玻爾回答說,他年青時也計算過很多的問題。在很多計算的基礎上,高手能培養起一種感覺。高手不寫代碼就能做設計是因為他以前寫了很多的代碼。而且他們會保持寫代碼,以保證自已的水平不下降。想一想九段高手是如何練成的。最難做到的是能忍受十年磨一劍的寂寞。別人在父母那里撒嬌時,他們在一旁用功。十年磨一劍,劍就成了東方不敗的針。

      在你下定決心要做高手之后,也就是下定決心拋棄那些世俗的追求之后,也就是你下決心忍受那些來自于庸俗的人的白眼、攻擊和謾罵之后,你就具備了練成神功的必要條件。

      事實上其實你不必一開始就練神功,一開始大家可能是為了錢,房子,汽車,美女才編程序的,然而后來藝術就從中產生了。那時高手就不再關注那些東西了。卓別林曾說過,他開始進入那個圈子也是為了錢,后來藝術就從中產生了。當然,也有人一開始是為了藝術,后來變成為了錢。

      所謂三十而立,就是說到了三十,你找到了你的真愛,值得用一生去追求的那種。比如說有的人到了三十認為這一輩子應該賺盡可能多的錢,這也沒什么不好,也可以把賺錢本身變成一種藝術,所謂資本運作是也。所以在三十以前,有些私心雜念沒什么。三十以后還這樣是可恥的。而我,想做一個程序員

      每個人做自己最喜歡的事。這個世界需要程序員,也需要資本運作。所有真正的程序員,他最喜歡的事是編程和他自已。如果他后來去做ceo去了,不再編程,只說明他本來不是一個真正的程序員。

      在成為高手的路上,要有熱情,要循序漸進,要持之以恒。

      要靠自己,書要快快地看。要試圖迅速理解其主旨。其實你快快看所接受的信息量,與慢慢看接受的差不多。能明白多少很大程度上取決于你的功底。以后用到再回過頭來看。一本對你來說新東西太多的書,不要指望看一次就全理解吸收。就象很多功力不夠的人看design patterns那本書一樣。慢慢看還不如找到多種 信息來源,都快快看一遍。對于一個完全陌生的領域,只看一本書很遠遠不夠的。

      要靠自已,事要快快做。有一個朋友,幾年前我介紹他去玩玩linux,他也表示想玩,但他現在還沒碰過。他失去了很多機會。

      平時要有意識提高自己寫代碼的速度,其實你一天寫15行有效代碼,與你寫50行有效代碼,其品質是差不多的。你應該把那些業界平均水平拋諸腦后,把超越自己做為唯一目標。等到你寫了很多各式各樣的代碼,你的水平就不一般了。一個老師曾向我介紹他的學英語的決竅,他說你去啃原版小說,啃到50 本,就和一般人有很大距離了。就是這個理。如果你寫得太慢,怎么能寫得多?水平怎么能提高?

    ?????? 要靠自己,學很多別人怕學的東西。低手總會說:這么多東西怎么學得過來啊。于是就少學或不學。這樣就成不了高手了。高手有非常廣的知識面,有很豐富的經驗。知道很多低手不知道的事。玩過很多低手聽都沒聽過的東西。

      要靠自己,努力滿足客戶的各種需求。個人技能是在滿足客戶的各種需求的過程中提高的。比如你喜歡用delphi,客戶說一定要用vb,那你就答應他,然后把自己培養成為vb的高手。用戶的需求看似**,但對你是一個機會。

      怎樣才能做到看書快,寫代碼快,學新東西快,一個顯而易見的途徑就是將工作并行化。你在一臺機器上make時,同時可以在看別的文檔和聊天。對于計算機是這樣,對人也是這樣。如果你只能串行地處理問題,你的速度將提高有限。你的大腦有很大潛力可挖,它應該是一個多任務分時系統。努力減少它 idle的時間。搞經濟的samuelson被人稱為human brain main frame,可見他的大腦有多快。

      讓你的思維快起來,你就會區別于那些反應遲鈍的人。如果你不能讓人生的道路變長,就讓它變寬。這世界變化快,需要你變得比它快才行。

      這樣加快并不會讓你短命,相反,你有更多的時間來享受生活和鍛煉身體。你的生活將更有品質,更豐富,更有意義。面對變化,你將立于不敗之地。我們都是和自己賽跑的人,需要跑得比昨天的自己更快。

    posted @ 2007-03-28 14:49 鴻雁 閱讀(451) | 評論 (0)編輯 收藏

    實例講解如何進行系統分析

    一、什么是系統分析

      在具體的研究需求分析之前,我們先了解一下軟件工程這個概念。軟件工程分為三個層次,過程層、方法層、工具層。在最基礎的過程層,最重要的就是一組被稱為關鍵過程區域(KPAs)的框架(KPA的概念在討論CMM的書中有詳細的概念說明)。關鍵過程區域構成了軟件項目的管理控制的基礎,并且確立了上下文各區域的關系,其中規定了技術方法的采用、工程產品的,模型、文檔、數據、報告、表格等,等的產生、里程碑的建立、質量的保證及變化的適當管理。方法層主要是過程在技術上的實現。它解決的問題是如何做。軟件工程方法涵蓋了一系列的任務:需求分析、設計、編程、測試、維護。同時他還包括了一組基本原則,控制了每一個的關鍵過程區域。工具層就很好理解了,他對過程層和方法層提供了自動和半自動的支持。這些輔助工具就稱為CASE。事實上需求分析是跨越了軟件工程的三個層次的。這一點是和其他的過程是一樣的。

      可以看到需求分析的位置,它是我們軟件開發的第一步。是對用戶需求的定義,對軟件系統的描述。系統分析的任務:將用戶的業務邏輯轉化為程序邏輯,計算時間和成本。根據開發人員的理論知識和實際的經驗,人們會采用各種滿足實際情況的系統分析、開發方法、步驟以及文檔等等。一般情況下,在系統分析書中應該有以下內容(視項目而定):

      1、 系統需求說明 說明系統是一個什么樣的系統,用市場上現有的系統來類比,用客戶(或是我們自己)需要一個什么樣的系統進行說明,力求完整。并對系統的發展可擴充性進行描述(現在沒有哪個系統是一次OK的)。說明與現有的系統有什么相同什么不同,說明未來系統的發展方面以及可移值性等能預見的事情。

      2、 系統資源說明 對系統所需要的軟件、硬件資源進行說明。描述系統所需要的所有的TCO成本。包括人員、時間、設備、系統、一次性投入資金、持續性投入資金這樣的所有資源。

      3、 系統可行性分析 對系統的實施中的資源進行分析,說明投入的合理性和必然性,對其中的所有不可預見性的投入進行合理的量化說明,來說明系統的實施的可行性。
    ?
      二、系統分析員與程序員

      大家應該對這兩個詞很熟悉了,但是對詞里包含的意義可能并不是特別清楚。首先必須說明的是,程序員和系統分析員不存在誰高級誰低級的分別,他們是兩種職業,對職業技能的要求完全不同。所以厲害的程序員就是系統分析員的說法是不對的。當然,系統分析員的技能要求他必須要懂得如何寫程序,但是他的重心在于如何把一個很大的項目切割成適合個人的小塊,然后將這些小塊組織起來。程序員的職責就是如何更好更快的實現這些小塊。
    ?
      三、系統分析的方法和工具

      UML全稱:Unified Modeling Language,統一建模語言,是面向對象的建模語言,主要用于軟件系統的面向對象建模。

      UML是以面向對象圖的方式來描述任何類型的系統,具有很廣泛的應用領域。特別是在建立軟件系統模型中,它支持從系統需求、系統分析到系統設計的整個建模過程。由于UML建模是一門專門的科學,而我們這門課程的任務是數據庫系統開發,所以對于UML我們將有限的注意力集中在認識UML各種圖示上。
    ?
      可以使用Rational Rose 2003來建立UML模型

      1)? 建立角色
      2)? 創建用例
      3)? 創建角色用例關系圖
      4)? 創建時序圖
      5) 創建協作圖

    ?????? 四、QQ文本圖形留言器系統分析的實現舉例
    ?
      1)需求分析總體圖:

    ?        
      2)各模塊細分分析圖:
      顯示模塊需求分析圖

            
      查詢模塊需求分析圖

            
      添加數據模塊需求分析圖

            
    安全設置模塊分析圖

            
      系統設置模塊分析圖

            
      3)基本功能模塊流程圖(舉例)

      
    在這樣的分析基礎上,再進行編程,我們就可以有規律可依,做到有條不紊了。

    posted @ 2007-03-28 14:35 鴻雁| 編輯 收藏

    JAVA EXCEL API簡介

    Java Excel是一開放源碼項目,通過它Java開發人員可以讀取Excel文件的內容、創建新的Excel文件、更新已經存在的Excel文件。使用該API非Windows操作系統也可以通過純Java應用來處理Excel數據表。因為是使用Java編寫的,所以我們在Web應用中可以通過JSP、Servlet來調用API實現對Excel數據表的訪問。

    現在發布的穩定版本是V2.0,提供以下功能:

    • 從Excel 95、97、2000等格式的文件中讀取數據;
    • 讀取Excel公式(可以讀取Excel 97以后的公式);
    • 生成Excel數據表(格式為Excel 97);
    • 支持字體、數字、日期的格式化;
    • 支持單元格的陰影操作,以及顏色操作;
    • 修改已經存在的數據表;

    現在還不支持以下功能,但不久就會提供了:

    1. 不能夠讀取圖表信息;
    2. 可以讀,但是不能生成公式,任何類型公式最后的計算值都可以讀出;






    應用示例

    1 從Excel文件讀取數據表

    Java Excel API既可以從本地文件系統的一個文件(.xls),也可以從輸入流中讀取Excel數據表。讀取Excel數據表的第一步是創建Workbook(術語:工作薄),下面的代碼片段舉例說明了應該如何操作:(完整代碼見ExcelReading.java)

    import java.io.*;
    import jxl.*;
    … … … …
    try
    {
    //構建Workbook對象, 只讀Workbook對象
    	//直接從本地文件創建Workbook
    //從輸入流創建Workbook
        InputStream is = new FileInputStream(sourcefile);
        jxl.Workbook rwb = Workbook.getWorkbook(is);
    }
    catch (Exception e)
    {
    	e.printStackTrace();
    }
    

    一旦創建了Workbook,我們就可以通過它來訪問Excel Sheet(術語:工作表)。參考下面的代碼片段:

    //獲取第一張Sheet表
    Sheet rs = rwb.getSheet(0);
    

    我們既可能通過Sheet的名稱來訪問它,也可以通過下標來訪問它。如果通過下標來訪問的話,要注意的一點是下標從0開始,就像數組一樣。

    一旦得到了Sheet,我們就可以通過它來訪問Excel Cell(術語:單元格)。參考下面的代碼片段:

    //獲取第一行,第一列的值
    Cell c00 = rs.getCell(0, 0);
    String strc00 = c00.getContents();
    //獲取第一行,第二列的值
    Cell c10 = rs.getCell(1, 0);
    String strc10 = c10.getContents();
    //獲取第二行,第二列的值
    Cell c11 = rs.getCell(1, 1);
    String strc11 = c11.getContents();
    System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
    System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
    System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
    

    如果僅僅是取得Cell的值,我們可以方便地通過getContents()方法,它可以將任何類型的Cell值都作為一個字符串返回。示例代碼中Cell(0, 0)是文本型,Cell(1, 0)是數字型,Cell(1,1)是日期型,通過getContents(),三種類型的返回值都是字符型。

    如果有需要知道Cell內容的確切類型,API也提供了一系列的方法。參考下面的代碼片段:

    String strc00 = null;
    double strc10 = 0.00;
    Date strc11 = null;
    Cell c00 = rs.getCell(0, 0);
    Cell c10 = rs.getCell(1, 0);
    Cell c11 = rs.getCell(1, 1);
    if(c00.getType() == CellType.LABEL)
    {
    LabelCell labelc00 = (LabelCell)c00;
    strc00 = labelc00.getString();
    }
    if(c10.getType() == CellType.NUMBER)
    {
    	NmberCell numc10 = (NumberCell)c10;
    strc10 = numc10.getValue();
    }
    if(c11.getType() == CellType.DATE)
    {
    DateCell datec11 = (DateCell)c11;
    strc11 = datec11.getDate();
    }
    System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
    System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
    System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
    

    在得到Cell對象后,通過getType()方法可以獲得該單元格的類型,然后與API提供的基本類型相匹配,強制轉換成相應的類型,最后調用相應的取值方法getXXX(),就可以得到確定類型的值。API提供了以下基本類型,與Excel的數據格式相對應,如下圖所示:


    每種類型的具體意義,請參見Java Excel API Document。

    當你完成對Excel電子表格數據的處理后,一定要使用close()方法來關閉先前創建的對象,以釋放讀取數據表的過程中所占用的內存空間,在讀取大量數據時顯得尤為重要。參考如下代碼片段:

    //操作完成時,關閉對象,釋放占用的內存空間
    rwb.close();
    

    Java Excel API提供了許多訪問Excel數據表的方法,在這里我只簡要地介紹幾個常用的方法,其它的方法請參考附錄中的Java Excel API Document。

    Workbook類提供的方法

    1. int getNumberOfSheets()
    獲得工作薄(Workbook)中工作表(Sheet)的個數,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    int sheets = rwb.getNumberOfSheets();
    

    2. Sheet[] getSheets()
    返回工作薄(Workbook)中工作表(Sheet)對象數組,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    Sheet[] sheets = rwb.getSheets();
    

    3. String getVersion()
    返回正在使用的API的版本號,好像是沒什么太大的作用。

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    String apiVersion = rwb.getVersion();
    

    Sheet接口提供的方法

    1) String getName()
    獲取Sheet的名稱,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    jxl.Sheet rs = rwb.getSheet(0);
    String sheetName = rs.getName();
    

    2) int getColumns()
    獲取Sheet表中所包含的總列數,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    jxl.Sheet rs = rwb.getSheet(0);
    int rsColumns = rs.getColumns();
    

    3) Cell[] getColumn(int column)
    獲取某一列的所有單元格,返回的是單元格對象數組,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    jxl.Sheet rs = rwb.getSheet(0);
    Cell[] cell = rs.getColumn(0);
    

    4) int getRows()
    獲取Sheet表中所包含的總行數,示例:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    jxl.Sheet rs = rwb.getSheet(0);
    int rsRows = rs.getRows();
    

    5) Cell[] getRow(int row)
    獲取某一行的所有單元格,返回的是單元格對象數組,示例子:

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    jxl.Sheet rs = rwb.getSheet(0);
    Cell[] cell = rs.getRow(0);
    

    6) Cell getCell(int column, int row)
    獲取指定單元格的對象引用,需要注意的是它的兩個參數,第一個是列數,第二個是行數,這與通常的行、列組合有些不同。

    jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
    jxl.Sheet rs = rwb.getSheet(0);
    Cell cell = rs.getCell(0, 0);
    

    2 生成新的Excel工作薄

    下面的代碼主要是向大家介紹如何生成簡單的Excel工作表,在這里單元格的內容是不帶任何修飾的(如:字體,顏色等等),所有的內容都作為字符串寫入。(完整代碼見ExcelWriting.java)

    與讀取Excel工作表相似,首先要使用Workbook類的工廠方法創建一個可寫入的工作薄(Workbook)對象,這里要注意的是,只能通過API提供的工廠方法來創建Workbook,而不能使用WritableWorkbook的構造函數,因為類WritableWorkbook的構造函數為protected類型。示例代碼片段如下:

    import java.io.*;
    import jxl.*;
    import jxl.write.*;
    … … … …
    try
    {
    //構建Workbook對象, 只讀Workbook對象
    //Method 1:創建可寫入的Excel工作薄
        jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
    //Method 2:將WritableWorkbook直接寫入到輸出流
    /*
        OutputStream os = new FileOutputStream(targetfile);
        jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
    */
    }
    catch (Exception e)
    {
    	e.printStackTrace();
    }
    

    API提供了兩種方式來處理可寫入的輸出流,一種是直接生成本地文件,如果文件名不帶全路徑的話,缺省的文件會定位在當前目錄,如果文件名帶有全路徑的話,則生成的Excel文件則會定位在相應的目錄;另外一種是將Excel對象直接寫入到輸出流,例如:用戶通過瀏覽器來訪問Web服務器,如果HTTP頭設置正確的話,瀏覽器自動調用客戶端的Excel應用程序,來顯示動態生成的Excel電子表格。

    接下來就是要創建工作表,創建工作表的方法與創建工作薄的方法幾乎一樣,同樣是通過工廠模式方法獲得相應的對象,該方法需要兩個參數,一個是工作表的名稱,另一個是工作表在工作薄中的位置,參考下面的代碼片段:

    //創建Excel工作表
    jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
    

    "這鍋也支好了,材料也準備齊全了,可以開始下鍋了!",現在要做的只是實例化API所提供的Excel基本數據類型,并將它們添加到工作表中就可以了,參考下面的代碼片段:

    //1.添加Label對象
    jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
    ws.addCell(labelC);
    //添加帶有字型Formatting的對象
    jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
    jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
    jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
    ws.addCell(labelCF);
    //添加帶有字體顏色Formatting的對象
    jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
    UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
    jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
    jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
    ws.addCell(labelCF);
    //2.添加Number對象
    jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
    ws.addCell(labelN);
    //添加帶有formatting的Number對象
    jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
    jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
    jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
    ws.addCell(labelNF);
    //3.添加Boolean對象
    jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
    ws.addCell(labelB);
    //4.添加DateTime對象
    jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
    ws.addCell(labelDT);
    //添加帶有formatting的DateFormat對象
    jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
    jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
    jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
    ws.addCell(labelDTF);
    

    這里有兩點大家要引起大家的注意。第一點,在構造單元格時,單元格在工作表中的位置就已經確定了。一旦創建后,單元格的位置是不能夠變更的,盡管單元格的內容是可以改變的。第二點,單元格的定位是按照下面這樣的規律(column, row),而且下標都是從0開始,例如,A1被存儲在(0, 0),B1被存儲在(1, 0)。

    最后,不要忘記關閉打開的Excel工作薄對象,以釋放占用的內存,參見下面的代碼片段:

    //寫入Exel工作表
    wwb.write();
    //關閉Excel工作薄對象
    wwb.close();
    

    這可能與讀取Excel文件的操作有少少不同,在關閉Excel對象之前,你必須要先調用write()方法,因為先前的操作都是存儲在緩存中的,所以要通過該方法將操作的內容保存在文件中。如果你先關閉了Excel對象,那么只能得到一張空的工作薄了。

    3 拷貝、更新Excel工作薄

    接下來簡要介紹一下如何更新一個已經存在的工作薄,主要是下面二步操作,第一步是構造只讀的Excel工作薄,第二步是利用已經創建的Excel工作薄創建新的可寫入的Excel工作薄,參考下面的代碼片段:(完整代碼見ExcelModifying.java)

    //創建只讀的Excel工作薄的對象
    jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
    //創建可寫入的Excel工作薄對象
    jxl.write.WritableWorkbook  wwb = Workbook.createWorkbook(new File(targetfile), rw);
                
    //讀取第一張工作表
    jxl.write.WritableSheet ws = wwb.getSheet(0);
    //獲得第一個單元格對象
    jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
                
    //判斷單元格的類型, 做出相應的轉化
    if(wc.getType() == CellType.LABEL)
    {
    Label l = (Label)wc;
        l.setString("The value has been modified.");
    }
    //寫入Excel對象
    wwb.write();
    //關閉可寫入的Excel對象
    wwb.close();
    //關閉只讀的Excel對象
    rw.close();
    

    之所以使用這種方式構建Excel對象,完全是因為效率的原因,因為上面的示例才是API的主要應用。為了提高性能,在讀取工作表時,與數據相關的一些輸出信息,所有的格式信息,如:字體、顏色等等,是不被處理的,因為我們的目的是獲得行數據的值,既使沒有了修飾,也不會對行數據的值產生什么影響。唯一的不利之處就是,在內存中會同時保存兩個同樣的工作表,這樣當工作表體積比較大時,會占用相當大的內存,但現在好像內存的大小并不是什么關鍵因素了。

    一旦獲得了可寫入的工作表對象,我們就可以對單元格對象進行更新的操作了,在這里我們不必調用API提供的add()方法,因為單元格已經于工作表當中,所以我們只需要調用相應的setXXX()方法,就可以完成更新的操作了。

    盡單元格原有的格式化修飾是不能去掉的,我們還是可以將新的單元格修飾加上去,以使單元格的內容以不同的形式表現。

    新生成的工作表對象是可寫入的,我們除了更新原有的單元格外,還可以添加新的單元格到工作表中,這與示例2的操作是完全一樣的。

    最后,不要忘記調用write()方法,將更新的內容寫入到文件中,然后關閉工作薄對象,這里有兩個工作薄對象要關閉,一個是只讀的,另外一個是可寫入的。

    posted @ 2007-03-23 23:27 鴻雁| 編輯 收藏

    JXL操作EXCEL

    要往xls文件里面寫入數據的時候需要注意的是第一要新建一個xls文件
    OutputStream os=new FileOutputStream("c:\\excel2.xls");

    再建完這個文件的時候再建立工作文件
    jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(os));

    如果這個文件已經存在,那么我們可以在這個文件里面加入一個sheet為了和以前的數據進行分開;
    jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);

    在createSheet方法里前面的參數是sheet名,后面是要操作的sheet號

    接下來就可以往這個文件里面寫入數據了

    寫入數據的時候注意的格式

    (1)添加的字體樣式
    jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
    WritableFont()方法里參數說明:
    這個方法算是一個容器,可以放進去好多屬性
    第一個: TIMES是字體大小,他寫的是18
    第二個: BOLD是判斷是否為斜體,選擇true時為斜體
    第三個: ARIAL
    第四個: UnderlineStyle.NO_UNDERLINE 下劃線
    第五個: jxl.format.Colour.RED 字體顏色是紅色的

    jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);

    jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell",wcfF);
    ws.addCell(labelC);
    在Label()方法里面有三個參數
    第一個是代表列數,
    第二是代表行數,
    第三個代表要寫入的內容
    第四個是可選項,是輸入這個label里面的樣式
    然后通過寫sheet的方法addCell()把內容寫進sheet里面。

    (2)添加帶有formatting的Number對象
    jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");


    (3)添加Number對象
    (3.1)顯示number對象數據的格式

    jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
    jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);

    jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
    ws.addCell(labelNF);
    Number()方法參數說明:
    前兩上表示輸入的位置
    第三個表示輸入的內容


    (4)添加Boolean對象
    jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
    ws.addCell(labelB);


    (5)添加DateTime對象
    jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
    ws.addCell(labelDT);
    DateTime()方法的參數說明
    前兩個表示輸入的位置
    第三個表示輸入的當前時間


    (6)添加帶有formatting的DateFormat對象
    這個顯示當前時間的所有信息,包括年月日小時分秒
    jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
    jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
    jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
    ws.addCell(labelDTF);

    (7)添加帶有字體顏色Formatting的對象
    jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
    jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);

    import="jxl.format.*
    jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.GREEN);

    (8)設置單元格樣式

    jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
    wcfFC.setBackGround(jxl.format.Colour.RED);//設置單元格的顏色為紅色
    wcfFC = new jxl.write.Label(6,0,"i love china",wcfFC);

    posted @ 2007-03-23 23:21 鴻雁| 編輯 收藏

    簡單的JS日期表示

    代碼如下:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="">
    <META NAME="Keywords" CONTENT="">
    <META NAME="Description" CONTENT="">
    </HEAD>

    <BODY>
    <script language="javascript">
    todayDate = new Date();
    date = todayDate.getDate();
    month= todayDate.getMonth() +1;
    year= todayDate.getYear();
    document.write("? 今天是")
    document.write("<br>")
    if(navigator.appName == "Netscape")
    {
    ?document.write(1900+year);
    ?document.write("年");
    ?document.write(month);
    ?document.write("月");
    ?document.write(date);
    ?document.write("日");
    ?document.write("<br>")
    }
    if(navigator.appVersion.indexOf("MSIE") != -1)
    {
    document.write(year);
    document.write("年");
    document.write(month);
    document.write("月");
    document.write(date);
    document.write("日");
    document.write("<br>")
    }
    if (todayDate.getDay() == 5) document.write("? 星期五")
    if (todayDate.getDay() == 6) document.write("? 星期六")
    if (todayDate.getDay() == 0) document.write("? 星期日")
    if (todayDate.getDay() == 1) document.write("? 星期一")
    if (todayDate.getDay() == 2) document.write("? 星期二")
    if (todayDate.getDay() == 3) document.write("? 星期三")
    if (todayDate.getDay() == 4) document.write("? 星期四")

    </script>
    </BODY>
    </HTML>

    源代碼解釋:

    todayDate = new Date();
    當定義一個新的對象時,通常使用“new”操作符。在這里,就是創建了日期對象。
    date = todayDate.getDate();

    getDate()是Date對象的一種方法,其功能是獲得當前的日期。
    month= todayDate.getMonth() + 1 ;
    ;
    getMonth()是Date對象的一種方法,其功能是獲得當前的日期,由于月份是從0開始的,所以這里要“+1”。
    year= todayDate.getYear() getYear()是Date對象的一種方法,其功能是獲得當前的年份。
    document.write("今天是") document.write("<br>") 輸出“今天是”
    if(navigator.appName == "Netscape") { document.write(1900+year); document.write("年"); document.write(month); document.write("月"); document.write(date); document.write("日");
    document.write("<br> ") }
    如果瀏覽器是Netscape,輸出今天是“year”+“年”+“month”+“月”+“date”+“日”,其中年要加1900。
    if(navigator.appVersion.indexOf("MSIE") != -1) { document.write(year); document.write("年"); document.write(month); document.write("月"); document.write(date); document.write("日");
    document.write("<br> ") }
    如果瀏覽器是IE,直接輸出今天是“year”+“年”+“month”+“月”+“date”+“日”。
    document.write("") ; 在“日期”與“星期”之間輸入一個空格。
    if (todayDate.getDay() == 5) document.write("星期五");
    if (todayDate.getDay() == 6) document.write("星期六");
    if (todayDate.getDay() == 0) document.write("星期日");
    if (todayDate.getDay() == 1) document.write("星期一");
    if (todayDate.getDay() == 2) document.write("星期二");
    if (todayDate.getDay() == 3) document.write("星期三");
    if (todayDate.getDay() == 4) document.write("星期四")
    getDay()是Date對象的一種方法,其功能是獲得當前是星期幾。document.write輸出今天是“星期幾”。

    posted @ 2007-03-23 11:18 鴻雁| 編輯 收藏

    JScript中的隨機顏色

    一,其實隨機色就是RGB分別取三個0-256的隨機數,
    然后把你想要改的對象的樣式設置成這種顏色就行了。

    var ?rndColor? = ? " rgb( " ? + ?Math.round(Math.random() * 256 )? + ? " , " ? + ?Math.round(Math.random() * 256 )? + ? " , " ? + ?Math.round(Math.random() * 256 )? + ? " ) " ;
    document.getElementById(
    " myData " ).style.color? = ?rndColor;

    二,利用javascript中的setInterval()函數,定時給某一個控件(如:span)的更換字體顏色樣式。
    在javascript中,element.style.color屬性允許使用rgb(x,y,z)函數,這樣我們就可以生成三個隨機數填充,以達到隨機 ??? 變顏色的效果。我們可以用Math.random()來獲得隨機數,然后再利用Math.round()來得到一個小于當前值的最大整數。
    RGB的值的隨機范圍是0-255,所以每個隨機值是:Math.round(Math.random()*256)。?

    <span id="myData">Hello world</span>
    <script language="javascript">
    window.onload = function(){
    ?setInterval( rndMyData, 1000 );
    }
    function rndMyData(){
    ?var rndColor = "rgb(" + Math.round(Math.random()*256) +? "," + Math.round(Math.random()*256) + "," + Math.round(Math.random()*256) + ")";
    ?document.getElementById( "myData" ).style.color = rndColor;
    }
    </script>


    ???

    posted @ 2007-03-23 10:50 鴻雁| 編輯 收藏

    如何從開發人員走向架構師(轉載自CSDN)

    很多架構師都是從好的開發人員逐步過渡而來的,但并非每個好的開發人員都希望成為架構師,而且他們并不是都適合做架構師。無論您是打算進行職業轉型的開發人員,還是尋找能承擔體系結構設計責任的合適人選的經理,都務必對此轉型過程有個清楚的了解。本文將討論從實現專家到架構師的過渡過程。

      在尋找優秀的指揮的時候,您首先要找的是一名優秀的音樂演奏家。但并非每個音樂演奏家都能成為優秀的指揮。架構師的專業發展方面也與此類似。越來越多的 IT 組織開始認識到良好軟件體系結構的重要性,架構師職業正迅速發展為 IT 內一個獨立的門類。由于要從相當小的候選范圍內招募架構師,因此這就給管理帶來了一些新挑戰。即使人力資源部門找到了候選者,針對經驗進行的篩選也比其他門類更為嚴格。跨越這些障礙的最快方式是要認識到,大部分好的架構師同時也是好的開發人員,因此尋找架構師人才時可能首先應該從普通開發人員中找起。招聘人員在對候選者(內部或外部)進行詳細審查時,應該考慮這個觀點。不過,對此資源進行挑選可能比較麻煩,因為只有極少的優秀開發人員具有成為架構師的特征或愿望。

      本文列出了開發人員成為架構師要進行的工作。我將從可能考慮進行此轉型的開發人員和評估進行此轉型的開發人員的經理這兩個方面來探討這一問題。我還將提供一系列在做出這些決策時要考慮的因素。

      個人特征

      軟件開發團隊和管理層之間的聯系始終是 IT 中的一個關鍵所在。二者都傾向于以完全不同的方式考慮給定的問題。大部分相關技術都是討論項目經理應如何跟蹤和解釋開發人員的進度和問題。但溝通不足的情況仍然非常普遍,而且這是項目失敗的首要原因。好的架構師是解決這個問題的最有效辦法。架構師的主要責任是提供開發人員和項目經理之間的共用溝通媒體。他們負責讓業務規則及需求與工程實踐及限制相適應,以確保成功。以下是成功架構師的一些主要特征。

      愿意并有能力進行溝通:在開發人員中發現架構師的最有價值標準是有效的溝通。您需要技術嫻熟、經驗豐富的開發人員,這樣的人員需要有就項目中的業務相關問題進行溝通的經歷。架構師經常必須對理解方面的差距進行預計,然后才能有所貢獻。他們必須愿意克服困難來確保技術和業務觀點的融合。他們并不必對意見交換工作進行計劃和協調;這仍然主要是項目經理的工作。他們的任務是確定表述系統設計時的最佳工具和構件,以促進有效的意見交換。他們必須能夠判斷當前方法顯得不足而需要采用新方法的情況。寫作技能也非常重要,還需要具有制作草圖的技能或使用制圖軟件的能力。

      具有處理談判細節方面的經驗:架構師經常需要負責討論系統開發的技術折衷方案。優先級的沖突可能會帶來實踐限制、風險規避或可能導致在各個不同業務組之間需求不同。優秀的架構師能夠有效地評估技術可能性,并能在不損失項目的主要價值的前提下制訂開發計劃來處理各種利害關系和限制。這與前面討論的溝通技能緊密相關,但同時也要體現架構師的技術能力。好的架構師候選者應該是經常幫助對有爭議的討論進行引導的人,能夠使討論得出新的想法,而不會使其在一個位置停滯不前。

      自覺主動;積極解決設計問題:架構師的日常工作目標經常并不明確。很多開發人員直接參考功能規范來列出任務清單。架構師通常則是向這些開發人員提供所需結構的人員,以便盡可能提高工作效率。好的候選者不僅進行溝通方面的工作,而且也會預計各種設計問題并加以解決——通常在沒有任何具體指示的情況下自覺進行。無論所分配的職責如何,積極參與項目的開發人員都有機會從一起工作的人員中脫穎而出。

      抽象思維和分析:架構師必須能夠理解表述模糊的概念并將其變成相關各方能夠理解的項目構件。他們必須能夠理解抽象概念,并以具體的語言對其進行溝通。開發人員中好的候選者經常要求或自己主動解釋開發生命周期中容易混淆的問題。他們能迅速評估各種想法并將其納入后續工作的操作建議中。

      開發人員經常具有很強的數學能力,而好的架構師則傾向于表現出更強的口頭表達能力。管理人員經常說開發人員具有“工程意識”,而這是一個用于評估架構師的非常有意義的方面。架構師應該具有很強的解決技術問題的能力,但還必須能夠準確獲知更為全面的人員如何與技術交互的信息。這要求具有某種形式的抽象思維(而不再是代碼的細節),這種思維能力可能較難形成。

      有些人認為,某種級別的正式教育是成為優秀開發人員的必備條件之一,我并不同意這種精英論。我遇到了很多高中就輟學的優秀開發人員。不過,對于體系結構設計工作,我的個人經驗以及我對所需能力的認識都讓我相信,好的架構師通常至少獲得了一個有挑戰性的學士學位。

      跟蹤生命周期

      好的架構師通常有在具備定義良好的軟件開發生命周期(Software Development Life Cycle,SDLC)的組織工作的經驗。架構師必須理解在其所屬專業內最重要的操作過程。這并不意味著需要有其他前提,例如,并不需要高能力成熟度模型(Capability Maturity Model,CMM)級別的工作經驗。好的架構師可能來自使用 SDLC 的多個小型迭代的極限編程(Extreme Programming,XP)方法的組織。務必注意各種傳統軟件開發操作,如 Michael A. Jackson 的方法:Jackson 結構編程(Jackson Structured Programming,JSP)和 Jackson 系統開發(Jackson System Development,JSD)。Jackson 的研究對架構師職業發展的意義就像 Donald Knuth 的研究對程序員一樣重要。架構師可以偏愛任何經典的、經過時間考驗的軟件系統開發方法。

      SDLC 也可以成為評估架構師合適人選的有用機制。每個 SDLC 階段都具有能提供相關線索的特征。SDLC 包含很多小的變體,但在此部分,我將使用幾乎所有方法的公共基礎部分。下面的列表詳細說明了 SDLC 的各個階段,并列出了好的架構師候選者在每個階段表現出來的特征。

    •   分析:在分析期間,好的架構師會考慮非技術影響,以便了解需求和將在其中進行開發的環境。架構師可為風險評估任務帶來廣泛的軟件經驗供參考。尋找具有豐富經驗的開發人員,以幫助業務部門理解技術人員正確解釋需求所需的信息。尋找在開發的早期階段能夠預計可能遇到的問題的開發人員。
    •   設計:在高級設計期間,好的架構師會收集問題空間的各個抽象元素,并就其進行溝通,以便開發團隊草擬將要開發的系統的相關圖表。架構師負責將需求謹慎地映射到所得到的系統體系結構的功能。在詳細設計期間,他們所扮演的角色并不是核心角色,但為了根據整個系統的規則對特定模塊的元素進行審查,仍然需要他們。尋找善于讓團隊能夠預計設計決策對最終系統的影響的開發人員。尋找善于確定一些最佳構件來促進與技術和非技術受眾溝通設計問題的開發人員。
    •   實現:在實現期間,架構師對項目進行引導,以確保其符合系統體系結構。他們在一線評估技術更改請求,并確定如何對設計進行調整,以最好地處理此類請求。架構師還要密切了解開發人員的進度,特別要跟蹤系統中模塊間的集成點的狀態。尋找經常對討論進行引導來連接多個子系統的開發人員。尋找項目經理可以依賴其快速地進行與更改和出現的問題相關的風險評估的開發人員。
    •   測試:架構師對系統集成和用戶接受度測試進行指導,并負責評估進度的正確溝通的持續測試結果。尋找理解錯誤模式且善于將測試復查結果轉換為行動計劃的開發人員。
    •   維護:在維護期間,架構師將發起關于系統集成的討論。無論處理 IT 基礎設施問題,還是確保部門之間的技術合作,架構師都必須完全理解應用程序,必須快速學習姊妹應用程序的體系結構,而且必須就集成點和風險進行有效溝通。尋找具有系統集成經驗且表現出快速掌握全貌的能力的開發人員。系統集成是一項獨特的任務。

      架構師培養建議

      有些組織能比其他組織更有效地進行架構師培養。如果充分考慮到招聘此類新專業人才的困難,努力促成能鼓勵開發人員發展為架構師的環境是非常明智的策略。但務必避免對不愿意或不適合走這條路的開發人員進行處罰。組織應該為開發人員制訂多條發展路線,包括那些愿意繼續擔任開發人員的人。對架構師而言,資深開發人員不可或缺。他們可以實現系統中最關鍵的模塊。通過對其他開發人員進行代碼檢查和測試支持,他們可幫助確保總體軟件質量,而如果質量不能保證,即使最好的體系結構也毫無用處。

      組織應制訂個人評估程序,以鼓勵開發人員考慮其職業目標,其中要包含體系結構設計的選項。應該鼓勵經理在其下屬中尋找體系結構設計人才。應該實現指導計劃,讓架構師與希望成為架構師的開發人員協作工作。應該鼓勵開發人員通過參加各種協會、撰寫文章和參加會議,從而參與到專業領域中來。通過這樣參與進來,可幫助開發人員從新的角度理解系統,并幫助他們更好地就其認識進行溝通。這樣還能培養可提高效率的重要創新想法。

      結束語

      開發人員一旦邁出了通向體系結構設計專業方向的第一步,就可以利用很多資源來獲得幫助,其中包括很多來自 IBM 的資源。有時候,此過程的最困難的部分就是第一步,而本文提供了一些線索和提示,經理和開發人員可以利用其來評估應該鼓勵哪些人努力成為架構師。

    posted @ 2007-03-20 15:14 鴻雁| 編輯 收藏

    僅列出標題
    共18頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 Last 
    主站蜘蛛池模板: 亚洲精品中文字幕无乱码麻豆| 亚洲jizzjizz少妇| 无码久久精品国产亚洲Av影片| 亚洲黄色免费网站| 亚洲Av无码国产一区二区| 好男人资源在线WWW免费| 青青久在线视频免费观看| 国产亚洲精品线观看动态图| 亚洲国产精品张柏芝在线观看| www免费黄色网| 四虎影院在线免费播放| 在线播放亚洲第一字幕| 亚洲欧美第一成人网站7777| 无码国产精品一区二区免费vr| 亚洲AV无码一区二区三区在线观看| 亚洲第一香蕉视频| 香蕉免费看一区二区三区| 日本不卡免费新一二三区| 亚洲精品视频久久| av大片在线无码免费| 亚洲精品无码专区在线在线播放| 亚洲成AV人影片在线观看| 国产精品免费视频网站| 日本亚洲免费无线码| 84pao强力永久免费高清| 亚洲偷自拍拍综合网| 日韩国产精品亚洲а∨天堂免| 国产区卡一卡二卡三乱码免费| 亚洲精品456人成在线| 色吊丝最新永久免费观看网站| 亚洲第一成年人网站| 性做久久久久久免费观看| 亚洲视频免费观看| 扒开双腿猛进入爽爽免费视频| 久久久久亚洲AV无码麻豆| A片在线免费观看| 亚洲色欲一区二区三区在线观看| 免费一级做a爰片久久毛片潮| 免费国产a国产片高清网站| 国产亚洲视频在线观看网址| 国产在线观看免费完整版中文版 |