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

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

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

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    性能測試的BLOG

    http://blog.sina.com.cn/s/blog_5fa3c7dd0100uu5w.html

    posted @ 2011-11-11 10:20 順其自然EVO 閱讀(133) | 評論 (0)編輯 收藏

    ERP系統BETA測試攻略

      關于ERP,關于BETA測試理論性的文章太多了,看多了就是兩種結果,經歷過的只當看過了,沒經歷過的還是不知道怎么做。最近產品要發版了,準備開展BETA測試,10余家的BETA測試項目,無奈新人太多,怎么才能讓大家了解到BETA測試的實戰經驗以及遇到困難的時候如何應對?今天加班“憤筆急書”寫了一個BETA測試攻略,在這里也拿來和大家分享一下,希望我的經驗能夠成為你開展BETA測試的錦囊妙計。文章中沒有太多講解BETA測試的理論,如果你還不明白的,可以先看一下BETA測試相關的理論知識,同時相信我這篇文章對于ERP項目實施也會有一些幫助,在此先感謝各位的拜讀!(相關文檔涉及公司資料,不便提供,敬請諒解)

    ERP系統 BETA測試攻略

      首先恭喜你將代表公司參加ERP系統的BETA測試,你將被派駐“前線”開展BETA測試的艱巨任務。任務中你會直接面對客戶,和客戶進行溝通交流。你也許會聽到客戶的贊賞,友好的溝通,也許會聽到客戶的批評乃至抱怨,甚至是不信任。你需要通過這次BETA行動讓客戶的贊賞升級到對ERP系統的敬仰;你需要扭轉客戶的抱怨以及對產品的不信任,讓他們重新認識ERP系統,認可ERP系統這一款偉大的產品。你準備好接受這次挑戰了嗎?Let’go!黨和人民期待你的凱旋歸來!

      (BETA測試流程)

      (團隊與協作)

      請確認你的BETA測試團隊的負責人以及成員。你的團隊中會有測試人員以及開發人員,還可能有部署、性能專家,也許還會有產品經理或者需求分析師。不管你的團隊有多少人,請記住一旦出發,你們這個團隊需要完成BETA測試的所有任務。在前方你需要和現場的實施顧問進行緊密協作,他們是你們在現場面對棘手問題的最有效的盟軍。不要嘗試自己解決所有的問題,遇到緊急情況可以與總部取得聯系,記住你所在BETA測試項目的內部接口人,你遇到的所有問題以及需要尋求總部支持的時候都可以和他取得聯系,他是你在前線唯一的接口人,你只需要在前線有條不紊的開展工作,不要被煩心事打亂你的計劃,否則你將功虧一簣。

      (行前準備)

      當你被任命為BETA測試團隊負責人的時候,你的第一件事,就是和你的團隊成員進行溝通,包括你的內部接口人。明確BETA測試的計劃安排,并達成一致,注意你必須在計劃時間內完成BETA測試,請珍惜每一天,每一分鐘。具體請查看《ERP系統BETA測試計劃客戶信息.xls》,上面有你想要的所有信息。

      第二件事,了解測試計劃客戶信息文檔的內容后,與對應機構的實施顧問進行一次詳細的溝通,了解必要的信息:

      1> 了解項目的大體情況,客戶關系,客戶訴求等

      2> 客戶應用業務的領域以及具體應用的業務模塊

      3> 客戶是否有大量的二次開發業務,主要集中在哪些領域

      4> 客戶項目的階段,上線初期?實施階段?維護階段?一期驗證,二期準備上線?

      5> 客戶應用的環境(操作系統、數據庫類型、數據庫大小),客戶應用ERP系統的規模(大型的客戶可能已經有多臺服務器集群,如果環境過于復雜,對于后續的驗證、升級都會有巨大的挑戰,需要提前預知這些風險,及時做應對策略)

      6> 現場的業務以及技術實力的了解。BETA測試能夠前往前場的人員有限,不可能驗證到所有的業務領域,在環境部署以及服務器配置上也不可能把專家派往每一個現場。所以了解現場的業務以及技術實力非常重要以便于到了現場以后的工作開展。有一部分工作是需要實施顧問配合我們一起完成的。

      了解了必要的信息后,要把你的BETA測試計劃(《ERP系統Beta測試現場工作計劃_xx客戶.doc》)進行整理,并發給實施顧問,讓實施顧問和客戶做好溝通,并確認。

      有很多實施顧問都沒有經歷過BETA測試,有的容易把BETA等同為總部人員幫機構完成客戶實施交付,有的認為BETA測試是總部派人員來解答客戶的問題,你需要把BETA測試和顧問解釋清楚,雙方要對BETA測試的目標和過程意見一致。具體可以把《ERP系統Beta測試說明文檔.doc》發給顧問,并進行說明,如果有需要在BETA測試客戶交流溝通的時候也可以提供這份文檔,讓客戶有正確的理解。

      不論在行前溝通還是到現場和顧問溝通,都要注意以下一些顧問最為關心的問題。

      Q:BETA測試對機構有啥好處?(這是機構最喜歡問的問題,也是最核心利益的問題)

      A:BETA測試需要機構來協助總部來驗證產品相關的功能以及質量的狀況。總部給予機構對客戶實際應用的業務進行產品的驗證,發現可能存在的缺陷及時修復。如果BETA客戶需要正式升級的,總部會支持客戶正式環境的升級,通過BETA期間總部的支持大大提升升級效率,升級過程中所有的問題總部都會有綠色通道直接解決,對于需要升級的客戶來說好處顯而易見。

      Q:BETA測試總部派人來幫助機構完成項目實施交付?

      A:NO,BETA測試的目標是來驗證產品的質量穩定性,為正式發版進行實戰的驗證過程,與項目實施交付并沒有直接的關系。但在BETA期間可能會涉及到預測試,甚至客戶環境正式升級,可能和項目有一定的結合,但BETA測試的結束不以項目進展為目標,而是以BETA測試的目標達成為結束標志。

      Q:你們趕緊過來吧,客戶有很多需求需要總部給予解答

      A:BETA測試階段主要目標是驗證產品的質量以及業務功能的正確性,客戶的需求我們可以協助記錄并反饋給總部,由總部后續給予解答,但BETA測試團隊不對相關的需求問題給予任何承諾,也不會在BETA測試期間解決相關的需求問題。

      Q:BETA測試把客戶正式環境升級以后,你們不能走啊,要等客戶完全沒有問題才能走。

      A:BETA測試有詳細的流程以及相關問題處理的方案,正式升級后我們會有一個觀察期,客戶整體應用沒有重大問題后,BETA測試團隊就會返回,后續如果還有問題可以按照日常提單流程進行反饋,總部會有相關人員協助處理的。

      Q:BETA測試的費用誰承擔?

      A:BETA測試的費用由總部承擔,機構無需承擔任何費用。

      Q:那你們來吧,我們比較忙,正好ERP系統客戶就交給你們了

      A:BETA測試期間必須有實施顧問全程參與,堅決不允許總部BETA測試團隊直接和客戶接觸。所有涉及到商務、需求等相關問題,BETA測試團隊不便于和客戶直接接觸。且相關的客戶信息以及交流需要通過顧問的協調和參與。

      第三件事,如果有可能盡量拿到客戶的最新帳套,在研發內部進行一次預升級測試,升級過程是BETA測試期間問題最多且最為耗費時間的環節,如果可以拿到客戶帳套在研發內部做一次預升級,及時發現可能存在的問題并在研發內部修改完成,有利于現場BETA測試的快速開展,也能夠較好的給顧問以及客戶信心。

      第四件事,出發前必要的準備,請查看《Beta測試行前準備事項檢查表.xls》。

      1> 準備你所需要的筆記本電腦,鼠標,網線。注意安裝必要的OFFICE軟件,抓圖工具等等,BETA測試的相關文檔記得出發前索取

      2> 帶上你的郵件系統密碼卡,郵件系統將是你和總部溝通的關鍵工具

      3> 記錄下你對應項目的內部接口人、部門經理、項目總監等關鍵人物的手機號碼,在遇到突發事件的時候不會手忙腳亂,總能找到你需要找到的人

      4> 出發時間明確后,記得給實施顧問打電話,讓他們協助定一下酒店,酒店的位置最好在客戶的附近,免除奔波之苦。注意出差標準,和實施顧問明確,否則多的費用是要你自己出的。

      5> 帶上身份證,注意當地未來的天氣變化,多準備一些衣物,身體對于BETA測試尤為重要,時常記住你所肩負人民的囑托,不要誤了大事。

      6> 最后就是走之前填寫出差申請

      (BETA現場階段)

      --啟動會議

      當你離開深圳的時候,就要開始帶領你的團隊獨立作戰了。到了目的地安頓好住宿后,先和實施顧問進行聯系,找個時間進行一下項目的溝通,交換一下BETA測試的意見,這個時候不要有客戶在場,等雙方就相關事宜達成一致后,在和客戶進行溝通,開展BETA測試啟動會議。BETA測試形式不限,有的客戶可能會隆重的開會,有的客戶可能就確認一下即可。形式不重要,只要和客戶確認了整個計劃以及BETA測試的目的即可。

      再次強調,整個BETA測試開始就一定要說清楚,實施顧問必須要全程參與,換人可以,但必須保證每天都有實施顧問在現場。

      --預測試

      預測試環節是BETA測試最為重要的環節,是直接決定BETA測試成敗,以及檢驗BETA測試效果的因素。所以預測試需要認真對待,并且百分百投入。

      1> 預測試開始階段一定要制定一個詳細的預測試計劃,把客戶常用的業務流程進行總結梳理,先設計一個測試方案,測試方案需要有測試用例,顆粒度可以粗一些,但一定要有明確的驗證思路。計劃的時候一定要考慮可能存在的風險以及客戶方的因素。比如客戶方業務的參與時間和安排,系統能夠切換的時間,任何工作不要過多的影響到客戶的正常業務工作。客戶復雜的環境以及升級所需要的周期都要納入到考慮的因素中,總之就是要做好風險管理,把一切可能的因素都考慮進來。

      2> 預測試期間必須關注此次版本測試的目標(質量穩定?擴展平臺?性能優化?),這些都必須納入到你的測試方案中。每項工作都要落實具體的人員,前線的資源是有限的,這個時候不要區分什么需求、開發、測試和顧問,所有的人都應該全力投入到驗證過程中,分工有側重,但并不代表只要各掃門前雪,需要一起開展工作的時候就要全力投入,特別是業務驗證階段,任務最為繁重。

      3> 請按照部門要求在客戶現有版本上收集相關業務的性能數據,填寫《ERP系統beta驗證性能收集.xls》,這個是未來我們未來需要解決的性能關鍵點。同時你還要填寫一個文檔《ERP系統Beta測試性能優化驗證列表.xls》,這個里面描述了本版本性能優化的點,你需要在升級前在客戶的現有版本上收集數據。然后在升級到最新版本,再次收集一次數據,這樣才能了解我們這次性能優化的效果如何。

      4> BETA測試一定要想清楚了在開始動手,一切計劃準備就緒以后就開始BETA測試吧。BETA測試切記的一點就是時刻做好備份,備份是你一切工作開展的基礎。一旦沒有備份,造成的后果將是毀滅性的,所以一定要記住!!!不要怕麻煩,有風險的時候就備份一次。做預測試的時候備份賬套,執行腳本的時候備份賬套,發過來的私家包替換前先備份被替換的文件……

      5> 按照當初制定的計劃開展整個BETA測試的執行工作,遇到問題就按照流程進行反饋,直到問題的解決。如果客戶關注到我們的某個問題,不要謊報瞞報,客觀的和客戶反饋并積極跟進解決,千萬不要欺騙客戶。當然很多工作是需要大家在下面做好的,在客戶面前盡量展現良好的精神風貌,無論是產品還是個人。

      6> 預測試期間發現的問題注意更新《ERP系統Beta測試反饋匯總表_XX客戶.xls》,并將該文檔及時反饋給研發總部人員,不要簡單的等到每天晚上才集中反饋,這樣對于問題的處理就會延誤。所有的問題請注意和內部接口人事先溝通,定一個問題的編碼規則,否則會容易亂套的。建議的編碼規則為“客戶簡稱_日期_序列號”,比如中國運輸的客戶,問題編號為“zgys_20100615_002”,這樣編號的好處是唯一編號,便于總部和現場的郵件跟蹤,有個日期能夠方便的了解每天所有問題的處理結果。

      7> 預測試過程中所有的細節都要詳細記錄,不要被表象麻痹了雙眼,特別是數據庫升級的時候,每一步的異常以及你的處理方式都要詳細記錄,因為所有的問題在你正式升級的時候都有可能碰到,如果你沒有記錄清楚,正式升級的時候帶來的影響會是致命的。

      8> 除了每個問題的及時更新,在辛勞一天以后BETA測試負責人還需要對一天的工作進行總結,把項目的大體情況反饋到總部。你也許還堅守在客戶的現場,也許你正在酒店舒適的床上,但請記住一定要發送《ERP系統Beta測試_工作日志_XX客戶.xls》給總部對應的接口人

      預測試工作比較艱辛,可能你會發現很多的問題在研發的時候都沒有碰到,但在客戶現場卻時常出現,這就是 BETA測試的目的,請認真思考每一個問題,這將是你BETA測試期間最大的收獲,也許會是你人生中重大的一次經歷。BETA團隊負責人注意BETA測試進度以及計劃的把控,這就是一次項目管理的親身經歷,也許對于你來說擔子重了一點,但你應該慶幸你有這么一次難得的鍛煉機會。把自己想象成是麥克.阿瑟或者隆美爾,運用你的聰明才智取得這次“非洲戰役”的勝利。

      --系統切換

      系統切換的成敗取決于預測試是否充分完善,所以正式升級前請對預測試的內容進行一個回顧,把相關的內容整理清楚,特別是升級和環境部署過程。

      1> 正式升級前一定要把升級計劃及時間安排反饋給你的總部接口人,也可以讓總部接口人為你在指定的時間內安排可能的支持人員

      2> 正式升級前請做好所有需要備份的工作-環境、數據庫、腳本、模板等等

      3> 制定升級計劃以及明細的升級步驟,包括每個步驟可能的耗時。想好每一步的后路,做好最壞的打算。即便是升級不成功至少還可以還原客戶現有的環境,不影響客戶的業務的繼續開展。

     4> 計劃和步驟明確后,選擇好升級時間就可以開始正式升級了,安裝正式環境-升級數據庫-執行腳本-升級成功。升級過程多少都會有一些小的意外,不要驚慌,認真分析問題產生的原因,并與總部進行溝通尋求幫助。

      5> 經過一到兩個不眠之夜(也許會更長),正式環境升級成功,還不要高興的太早,請安排所有的人員鋪到系統上做一個基本的業務驗證,做一個憑證,走一張供應鏈單據,……至少要保證重大業務功能的正確性。此時的驗證范圍一定要準,一定是客戶應用的關鍵流程,這些業務沒有問題,至少客戶在正式使用的時候不會造成惡劣的影響。

      --運行觀察

      當第一個工作日的來臨時候,也是最為緊張的時刻,客戶平穩的運行將是你期待的結果。如果遇到了突發問題一定要沉著冷靜,要以最快的速度分析問題,并尋求總部的解決,要不斷關注問題的解決過程,最好是每4個小時就和總部確認解決情況,這個時候是分秒必爭的時刻。不要因為緊張而忽略了要求,繼續按照《ERP系統Beta測試反饋匯總表_XX客戶.xls》的要求進行反饋溝通,不要以為一個個問題郵件反饋會來的快,那樣只會更亂。

      隨著系統的穩定,你的等待期間也許會變得悠閑,你的心情也許會格外舒暢。可以和客戶方的業務人員拉拉家常,聊聊家庭,生活,工作。在輕松愉快的過程中建立深厚的友誼,這都是緣分呀。在閑扯中不要忘了和客戶交流一下產品的應用感受,收集他們的感受,日后也是我們產品改進的方向。

      記得在空閑的時候操作一下系統,填寫《ERP系統測試性能優化驗證列表.xls》,用數據來感受我們的性能優化的成果。

      --BETA報告

      當一切的艱辛都已成往事,你該為你的工作感到自豪,你已經具備了相當的項目管理能力,閉上眼睛回顧一下你在客戶面前從容不迫的神情(盡管你的內心非常的緊張),在面對問題的時候果斷正確的決策,還有麥克.阿瑟將軍般的指揮風采。原來“非洲戰役”對你來說是如此般的成功,想象你正在接受人民的歡呼和祝賀……

      這種感覺是不是非常的好?×&……%¥#@!,擦干口水該起床了。順利完成BETA測試后,請準備你的 BETA測試報告《ERP系統Beta測試報告_xx客戶.doc》,記住測試報告編寫完成以后請一定發給BETA測試總負責人審核一下,確認符合要求且沒有問題的時候在給客戶簽字,不要犯一些低級錯誤,這個是非常影響公司專業形象的。

      BETA報告簽字的時候和客戶領導簡要交流一下此次BETA測試的過程以及成果,特別是功能改善以及性能提升部分的典型成果,我們的目標是幫助客戶成功!請讓客戶體驗到幫助客戶成功后的喜悅,同時也讓客戶看到你艱辛努力換來的豐碩成果!分手道別的時候向客戶送上公司準備的精美禮品,也祝福客戶一帆風順,飛黃騰達!

      客戶可能會談到一些遺留問題以及后續維護的顧慮,請告訴他我們的策略,打消他的后顧之憂。

      --BETA測試結束

      BETA測試結束,也請整理好你的行囊,整理你所有的費用發票,便于回家后報銷。如果可以的話,建議拉上實施顧問找個當地有特色的小館子小酌幾杯,當然這個費用公司不會給你報銷的,因為公司提供了出差補助。不要過于在乎這點小錢,對于此次BETA測試你所獲得的收獲,這點小錢實在算不了什么。日后項目還需要實施顧問繼續跟進,難得一次天南海北的相聚,留下一個美好的記憶。說不定日后一不小心又會在一起戰斗呢。

      人生就像一場旅行,不必在乎目的地,重要的是沿途的風景和看風景的心情……,退房,趕飛機,回家咯……!

     

     

    posted @ 2011-11-10 14:19 順其自然EVO 閱讀(237) | 評論 (0)編輯 收藏

    人機交互的測試

    當我們在接到一個需要測試的項目或任務時。我們通常往往思考的是在系統中出現的錯誤現象。如單擊某個按鈕出現了http500現象,或是其他錯誤頁面。這在我們測試中是無可非議的測試工作。大家有沒有想過當你接受這個軟件時,她就像一個你從未接觸過的汽車。每個檔位的轉換,每個功能按鈕的操作、及其作用都是陌生的。在這個時候你感覺麻煩的地方是最多的時候,有些問題當你接觸的時間長了你會有一些麻木感。往往這些麻木感就會變成了習慣。習慣的東西也就無所謂了,或許就是正確的。

      很多項目或產品,當我們的系統軟件拿到用戶現場的時候。我們的用戶會提出一大堆問題。這個該怎么做,那個該怎么做。為什么會有這么多問題的反饋。項目還好說我們大不了給他們進行培訓。當我們做成產品的時候,批量生產發貨的時候,我們就沒有精力去照顧每個用戶。用戶最開始使用你的東西時,第一印象是非常重要的,用戶很少會花很長時間去試用你的推薦。用戶感覺這個軟件或系統好不好用,很大程度上是在他與機器之間的互通上。

      我感覺有兩點值得我們測試人員關注的。

      其一,系統本身的操作,其繁簡程度、流程規劃上。我們應該熟知業務的需求、規則。如出版業務都需要其三審,每一審我們展現的同樣的東西,他們也能工作。有時開發圖省事把所有的功能都整合一起,共同使用。必然會帶來很多沒必要的操作。他們的重點是不一樣,我們不應該把每一審都一樣,我們要展現給每一審的他們關注的重點,他們的需要的操作。每個人測試的行業都可能不一樣,這就需要我們去了解它,運用到我們的測試中。

      其二,用戶本身常用操作,使用習慣。這里也就是說用戶的習性了。如用戶等待時間等。及其軟件使用的一些“潛規則”。如按鈕的擺放,一些頁面的大小等。這就需要我們在平時的多加積累。之前剛開始測試遇見一個問題,就是在彈出頁面后讓選擇其多個目錄。我單擊一下選擇框沒選中,又單擊還是沒選中。之后又單擊的內容才勾選上前面的選擇框。這一個問題就凸現了我們的使用習慣。在用戶使用中一些規范的提示。圖標的運用、快捷鍵、提示的語義等問題,也是值得我們注意的。

      剛接手的系統,它的安裝、配置、使用等,應該去記錄我們感覺有疑問的操作。在之后的測試工作中在詳細的去分析這些疑問。該增、改減、該修、該改,我們再去判定。

    posted @ 2011-11-10 14:13 順其自然EVO 閱讀(186) | 評論 (0)編輯 收藏

    量化項目管理案例:缺陷趨勢預測利器(7)

      在之前的文章里,已經介紹了幾種不同的成長曲線的形式,知道了幾種曲線的趨勢情況。比如,指數曲線就是呈指數的不斷增長;S型曲線就是先增后趨于平穩。然而,再進一步,怎么擬合出適合給定樣本數據的模型曲線呢?這回,我們介紹曲線的幾種擬合算法。

      曲線擬合主要有3種算法:三點法、三和法和高斯-牛頓法。下面簡單介紹3種算法的原理。

      1、三和法:

      三和法是利用三個和值來進行計算。將數據平均分成三段,分別求這三段數據的和;隨后將三個和值依次做減法;通過求減法得出要預測的參數。也就是求解三元一次方程組,得到最終參數的值。

      2、三點法:

      三點法亦如它的名字,是利用三個點的值來進行計算。選擇數據的起點、中點和終點,得到三元一次方程組;解出方程組,得到參數值。

      3、高斯-牛頓法:

      高斯-牛頓法是用逐次逼近的方式來得到最佳參數值。高斯-牛頓法的計算過程是一個不斷迭代的過程。由于高斯-牛頓法的計算原理為尋找最優值,因此得到的結果應該最接近實際情況,擬合度最高。然而,高斯-牛頓法對數據要求較高,會出現由于數據原因無法計算的情況。

      由于算法公式較為復雜,暫時沒有發表在網站上,但我們會盡快整理。

     三和法

    三點法

    高斯-牛頓法

    原理將大量數據分為3段3點確定一條曲線迭代尋找最優值
    對數據個數的要求最少9個3個無要求
    易用性較為易用 易用對數據要求嚴格,易用性較低
    準確度較為準確準確性較差準確
    可能不適用的情況樣本連續出現多個0樣本連續出現多個0無法簡單判斷,只能通過計算得出
    使用場景已有一定數據量,可用于評斷一個模型合適與否,或用于跟蹤、更新模型數據量不夠,用于策劃得到初始模型數據量要求無太大限制,可用于評價模型的使用情況
    注意事項時間從0開始和從1開始計算公式不同選取的三點距離應相等 最優值的選取標準是R2 

    posted @ 2011-11-10 11:28 順其自然EVO 閱讀(243) | 評論 (0)編輯 收藏

    如何帶好軟件測試新人

     1、熟悉工作環境,認識新同事

      2、制定學習計劃、跟進學習進度

      (1)了解新人的情況,制定出盡量適合新人的學習計劃,計劃制定的要細致,包括各個階段要學習的內容、學習時間、學習資料、學習產出。

      (2)找個機會和新人一起看下學習計劃,講解計劃內容以及認真聽取新人的意見,根據新人反饋的信息適當的調整計劃。和新人的溝通可以讓自已更能了解新人,制定盡量適合新人的計劃能讓新人帶著合理的目標去學習,而不會讓新人感到迷茫和困惑。

      (3)跟進學習進度是讓自已了解前期制定的計劃是不是適合新人,并且可以通過這種方式了解新人的學習情況和遇到的問題,及時根據具體情況協助新人解決。在新人執行計劃前,告訴新人以日報的形式反映學習進度、遇到的問題、心得。

      3、講解概念性的問題,讓新人從整體上有個大概了解

      (1)工作內容:新人一進來不知道自已所在的組是做什么測試的,自已的職責和任務是什么。所以師傅要主動介紹工作內容,測試的系統是什么,是通過哪種方式進行測試,以及她將來要做的工作是什么。

      (2)發布流程方面:告訴新人發布流程的學習網址,告知流程平臺的作用。

      (3)業務方面:

      ● 告訴新人業務的學習網址,告知業務學習是根本,雖然一進來是做接口測試,但是只有在了解業務的情況下才能更好的勝任測試的工作。

      ● 把自已以前整理好的主要業務流程圖和基本業務術語文檔給新人,先讓新人閱讀,第一遍看新人肯定會懵,所以師傅應該給予大概的講解,告訴新人遇到任何問題都可以問,不怕被打擾,只怕沒問題問,因為只有新人帶著問題問才知道新人需要什么幫助。

      ● 新人有一定的經驗后可以給予新人整理某塊業務的機會,這樣有助于她對這塊業務更深層次的了解。由于我帶的新人所分配的工作任務是做接口測試和偶爾做功能測試,其實在做功能測試的時候她已經了解了一些業務,所以我會整理出相關業務的一級業務點和底層對應的接口,然后讓新人查找知識沉淀或者功能基線用例庫把該業務的所有業務點畫出mm圖,讓她試著根據閱讀接口的實現代碼進行完善mm圖。

      (4)測試流程方面:測試流程是新人需要掌握的,這樣可以讓新人知道整個測試各個階段需要做哪些工作,包括:什么時候了解需求、什么時候測試用例評審、什么時候開始測試、什么時候接口測試完成進入功能測試、什么時候daily測試,什么時候預發測試。

      (5)測試技術方面:

      ● 給新人分享所測系統的架構以及如何搭建接口測試環境,這個分享是很有必要的,新人不僅要知其然而且要知其所以然,所以講解的時候要通俗易懂,目的只想讓新人知道被測系統是怎樣的架構,我們又是如何進行接口測試的,直到新人能真正理解為止。

      ● 給個簡單的接口讓新人第一次與接口測試親密接觸,我是以一個業務邏輯非常簡單的接口讓新人做的,因為第1次做接口測試,我會告訴她如何去設計正常流和異常流測試用例,如何寫測試腳本和驗證點到位。同時,我會寫好第1個測試腳本,然后讓她完成其他腳本的編寫,并且給予review。

      ● 給新人找個稍微有點業務邏輯的接口讓她測試,這樣她可能通過對這個接口測試了解到相關的業務,也可以了解更復雜點的開發代碼

      ● 告訴新人如何提bug

      ● 告訴新人測試過程中的重點是什么,以及測試時間的把握

      4、善于聽取新人的問題并給予回復

      (1)新人問問題是一件非常正常的事情,反而沒有問題可以問這才叫人干著急,所以當新人問問題的時候,尤其前幾次問師傅問題時,師傅態度要誠懇,要有耐心,要是一個很好的聽眾。這點是從我師傅宋缺和文朗那學到的,我覺得做好一個師傅,要善于聽取新人的問題和意見,這樣新人才敢拋出問題,不會把問題爛到肚子里,從而才能解決問題,這樣也可以提升以后的工作效率。

      (2)幫新人解決問題時最好告訴新人自已怎么解決的,解決的思路和方法是什么,這樣在你幫她解決問題的同時也在教她知識,下次同樣的問題她就會解決了。

      5、信任和鼓勵對方、讓新人更加自信

      (1)第1次讓新人整理mm圖時,我會給予一些指導,同時自已也會整理同一個業務的mm圖,然后對比新人產出的mm圖和新人一起討論,這樣可以知道她的思路是什么,思路對不對,以及表達我自已的觀點。互相討論交換思考可以讓新人覺得你尊重她,同時她也會很愿意很主動的表達自已的觀點。

      (2)新人來到新的環境工作,心里或多或少會有點壓力,在工作中偶爾問問新人工作和生活情況,關心下新人,會讓她感覺到新環境的溫暖,也許可以讓她更輕松更快樂的工作。

      (3)多鼓勵別人是一種美德,因為這是你對新人的認可,會讓新人更有信心和激情去勝任手頭上繁忙的工作。

      (4)當新人成長了,達到自已的預估目標時,我覺得要讓新人獨立的去承擔一些工作,可能新人會很有壓力,心里會擔心萬一業務理解的有偏差遺漏了問題怎么辦,萬一在發布之前測不完怎么辦。其實這種心態是很正常的,所以師傅要把握好這個度,要做好review工作,要在適當的時候問問新人進展過程中有什么風險需不需要幫助。當新人獨立的完成了測試工作,體會到整個測試并沒有延期,并沒有遺漏的問題時,新人會更自信的面對以后的工作。因為信任,所以簡單。

    posted @ 2011-11-10 11:27 順其自然EVO 閱讀(178) | 評論 (0)編輯 收藏

    軟件探索性測試 筆記四

      *建立起一個全局目標后,再開始測試

      探索式測試的幾個目標:

      1、理解應用程序如何工作、它的接口看起來怎樣、它實現了哪些功能

      2、強迫軟件展示全部能力:

      *目的是讓軟件努力運行,證明軟件確實實現了設計時所要求達到的功能

      3、找到缺陷,并有目的的使缺陷數量降為零

      把軟件特性劃分成幾個相互重疊的“區域”,具體區域和測試方法如下:

      商業區:

      *含義:用戶所要使用的軟件特性和功能,你的軟件包裝盒上描述的特性和掩飾的特性及代碼

      測試方法:

      1、指南測試法:根據用戶說明書來測試

      2、賣點測試法:觀摩哪些銷售演示,測試演示過程,并且可以加上質疑測試法

      3、地標測試法:提前確定關鍵的軟件特性,確定他們的前后順序

      4、極限測試法:向軟件提出最困難的問題

      5、快遞測試法:關注于數據,找到每個和數據有接觸的軟件特性

      6、遍歷測試法:通過選定一個目標(例如所有菜單項、所有錯誤消息或所有對話框),然后使用可以發現的最短路徑來訪問目標包含的所有對象

      歷史區:

      *含義:從前版本遺留下的代碼,還有那些曾經出現較多缺陷的特性和功能

      測試方法:

      1、惡鄰測試法:反復測試缺陷特別多的地方

      2、博物館測試法:關注被接受重新修改的老代碼,或者是沒被改動就放到新環境中運行的老代碼

      3、上一版測試法:回歸測試,關注新版本中無法再運行的測試用例

      娛樂區:

      *含義:軟件的輔助特性,而不是主線特性

      測試方法:

      1、配角測試法:關注和主要的特性非常鄰近的特性,例如和主要的特性一同出現在顯示器上,容易被用戶注意

      2、深巷測試法:軟件中最不可能被用到的或者最不吸引用戶的特性,有助于提高代碼覆蓋率

      *注:多個特性混合在一起測試時,比如重要的和不重要的混在一起時,可以考慮:

      **有關輸入的問題:這兩個特性會不會處理同一輸入

      **有關輸出的問題:這兩個特性功能是否在可見的用戶界面上操作同一塊區域?他們會產生同一個輸出嗎?

      **有關數據的問題:這兩個特性會操作其共享的一些內部數據?是讀取共享數據、還是修改共享數據

      3、通宵測試法:性能測試和壓力測試,永遠不關閉程序,連續不斷的使用某些特性來測試軟件

      旅游區:

      *含義:只對新用戶有吸引力的特性和功能,它關心的是快速訪問軟件的各種功能,而不是關心軟件是否工作

      測試方法:

      1、收藏家測試法:收集軟件的輸出,收集的越多越好

      *背后的思想是測試人員到達所有那些可到達的地方并把觀察到的輸出結果記錄下來

      2、長路徑測試法:測試離應用程序開始點盡可能遠的特性,例如:哪個特性需要點擊N次才能被用到,選定該特性,一路點擊過去,然后測試它

      *指導思想:到達目的地前盡量多的在應用程序中穿行,因而要選取埋在應用程序最深處的特性

      *可以結合收藏家測試法

      3、超模測試法:只關心表面的東西

      4、測一送一測試法:測試時運行一個應用程序,然后運行該應用程序的另外一個拷貝,然后再運行一個拷貝時,關注網絡傳輸數據、文件操作等方面

      旅館區:

      *含義:指一些經常被忽視的或者在測試計劃中較少描述的次要的及輔助功能

      測試方法:

      1、取消測試法:

      *啟動操作然后停止它,并花些時間在應用程序里四處檢查

      *找應用程序中最耗時的操作來充分實施這種方法

      *可以嘗試開始一個操作,不要停止它,然后再開始另一個同時的操作

      *在取消被測對象之前應該改變被測對象的狀態,這點也很重要

      2、懶漢測試法:做盡量少的實際工作,

      *可以嘗試接受所有的默認值,測試程序對默認值的處理情況

      破舊區:

      *含義:指一些經常被忽視的或者在測試計劃中較少描述的次要的及輔助功能

      測試方法:

      1、注意輸入的限制,哪些是非法輸入;注意不按照指定的順序做事情

      2、重復執行同樣的操作,重復輸入同樣的數據

      總結:

      跟蹤哪種測試法發現的缺陷最多,哪種執行時間最少,哪種的代碼、界面、功能覆蓋最多等

    posted @ 2011-11-10 11:20 順其自然EVO 閱讀(149) | 評論 (0)編輯 收藏

    教你維護SQL Server數據庫日志。

    導讀】教你維護SQL Server數據庫日志

      交易日志(即oracle中的事務)(Transaction logs)是數據庫結構中非常重要但又經常被忽略的部分。由于它并不像數據庫中的schema那樣活躍,因此很少有人關注交易日志。

      交易日志是針對數據庫改變所做的記錄,它可以記錄針對數據庫的任何操作,并將記錄結果保存在獨立的文件中。對于任何每一個交易過程,交易日志都有非常全面的記錄,根據這些記錄可以將數據文件恢復成交易前的狀態。從交易動作開始,交易日志就處于記錄狀態,交易過程中對數據庫的任何操作都在記錄范圍,直到用戶點擊提交或后退后才結束記錄。每個數據庫都擁有至少一個交易日志以及一個數據文件。

      出于性能上的考慮,SQL Server將用戶的改動存入緩存中,這些改變會立即寫入交易日志,但不會立即寫入數據文件。交易日志會通過一個標記點來確定某個交易是否已將緩存中的數據寫入數據文件。當SQL Server重啟后,它會查看日志中最新的標記點,并將這個標記點后面的交易記錄抹去,因為這些交易記錄并沒有真正的將緩存中的數據寫入數據文件。這可以防止那些中斷的交易修改數據文件。

      維護交易日志

      因為很多人經常遺忘交易日志,因此它也會給系統帶來一些問題。隨著系統的不斷運行,日志記錄的內容會越來越多,日志文件的體積也會越來越大,最終導致可用磁盤空間不足。除非日常工作中經常對日志進行清理,否則日志文件最終會侵占分區內的全部可用空間。日志的默認配置為不限容量,如果以這種配置工作,它就會不斷膨脹,最終也會占據全部可用空間。這兩種情況都會導致數據庫停止工作。

      對交易日志的日常備份工作可以有效的防止日志文件過分消耗磁盤空間。備份過程會將日志中不再需要的部分截除。截除的方法是首先把舊記錄標記為非活動狀態,然后將新日志覆蓋到舊日志的位置上,這樣就可以防止交易日志的體積不斷膨脹。如果無法對日志進行經常性的備份工作,最好將數據庫設置為“簡單恢復模式”。在這種模式下,系統會強制交易日志在每次記錄標記點時,自動進行截除操作,以新日志覆蓋舊日志。

      截除過程發生在備份或將舊標記點標為非活動狀態時,它使得舊的交易記錄可以被覆蓋,但這并不會減少交易日志實際占用的磁盤空間。就算不再使用日志,它依然會占據一定的空間。因此在維護時,還需要對交易日志進行壓縮。壓縮交易日志的方法是刪除非活動記錄,從而減少日志文件所占用的物理硬盤空間。

      通過使用DBCC SHRINKDATABASE語句可以壓縮當前數據庫的交易日志文件,DBCC SHRINKFILE語句用來壓縮指定的交易日志文件,另外也可以在數據庫中激活自動壓縮操作。當壓縮日志時,首先會將舊記錄標記為非活動狀態,然后將帶有非活動標記的記錄徹底刪除。根據所使用的壓縮方式的不同,你可能不會立即看到結果。在理想情況下,壓縮工作應該選在系統不是非常繁忙的時段進行,否則有可能影響數據庫性能。

      恢復數據庫

      交易記錄備份可以用來將數據庫恢復到某一指定狀態,但交易記錄備份本身不足以完成恢復數據庫的任務,還需要備份的數據文件參與恢復工作。恢復數據庫時,首先進行的是數據文件的恢復工作。在整個數據文件恢復完成前,不要將其設為完成狀態,否則交易日志就不會被恢復。當數據文件恢復完成,系統會通過交易日志的備份將數據庫恢復成用戶希望的狀態。如果在數據庫最后一次備份后,存在多個日志文件的備份,備份程序會按照它們建立的時間依次將其恢復。

      另一種被稱為log shipping的過程可以提供更強的數據庫備份能力。當log shipping配置好后,它可以將數據庫整個復制到另一臺服務器上。在這種情況下,交易日志也會定期發送到備份服務器上供恢復數據使用。這使得服務器一直處于熱備份狀態,當數據發生改變時它也隨之更新。另一個服務器被稱作監視(monitor)服務器,可以用來監視按規定時間間隔發送的shipping信號。如果在規定時間內沒有收到信號,監視服務器會將這一事件記錄到事件日志。這種機制使得log shipping經常成為災難恢復計劃中使用的方案。

    posted @ 2011-11-10 11:17 順其自然EVO| 編輯 收藏

    《Linux內核修煉之道》——分析內核源碼如何入手?(下)

     下面的分析,米盧教練說了,內容不重要,重要的是態度。就像韓局長對待日記的態度那樣,嚴謹而細致。

      只要你使用這樣的態度開始分析內核,那么無論你選擇內核的哪個部分作為切入點,比如USB,比如進程管理,在花費相對不算很多的時間之后,你就會發現你對內核的理解會上升到另外一個高度,一個抱著情景分析,抱著0.1內核完全注釋,抱著各種各樣的內核書籍翻來覆去的看很多遍又忘很多遍都無法達到的高度。請相信我!

      讓我們在Linux社區里發出號召:學習內核源碼,從學習韓局長開始!

      態度決定一切:從初始化函數開始

      任小強們說房價高漲從現在開始,股評家們說牛市從5000點開始。他們的開始需要我們的錢袋,我們的開始只需要一臺電腦,最好再有一杯茶,伴著幾支小曲兒,不盯著錢總是會比較愜意的。生容易,活容易,生活不容易,因為總要盯著錢。

      有了地圖Kconfig和Makefile,我們可以在龐大復雜的內核代碼中定位以及縮小了目標代碼的范圍。那么現在,為了研究內核對USB子系統的實現,我們還需要在目標代碼中找到一個突破口,這個突破口就是USB子系統的初始化代碼。

      針對某個子系統或某個驅動,內核使用subsys_initcall或module_init宏指定初始化函數。在drivers/usb/core/usb.c文件中,我們可以發現下面的代碼。

    940 subsys_initcall(usb_init);
    941 module_exit(usb_exit);

      我們看到一個subsys_initcall,它也是一個宏,我們可以把它理解為module_init,只不過因為這部分代碼比較核心,開發者們把它看作一個子系統,而不僅僅是一個模塊。這也很好理解,usbcore這個模塊它代表的不是某一個設備,而是所有USB設備賴以生存的模塊,Linux中,像這樣一個類別的設備驅動被歸結為一個子系統。比如PCI子系統,比如SCSI子系統,基本上,drivers/目錄下面第一層的每個目錄都算一個子系統,因為它們代表了一類設備。

      subsys_initcall(usb_init)的意思就是告訴我們usb_init是USB子系統真正的初始化函數,而usb_exit()將是整個USB子系統的結束時的清理函數。于是為了研究USB子系統在內核中的實現,我們需要從usb_init函數開始看起。

    865 static int __init usb_init(void)
    866 {
    867   int retval;
    868   if (nousb) {
    869    pr_info("%s: USB support disabled/n", usbcore_name);
    870    return 0;
    871   }
    872
    873   retval = ksuspend_usb_init();
    874   if (retval)
    875    goto out;
    876   retval = bus_register(&usb_bus_type);
    877   if (retval)
    878    goto bus_register_failed;
    879   retval = usb_host_init();
    880   if (retval)
    881    goto host_init_failed;
    882   retval = usb_major_init();
    883   if (retval)
    884    goto major_init_failed;
    885   retval = usb_register(&usbfs_driver);
    886   if (retval)
    887    goto driver_register_failed;
    888   retval = usb_devio_init();
    889   if (retval)
    890    goto usb_devio_init_failed;
    891   retval = usbfs_init();
    892   if (retval)
    893    goto fs_init_failed;
    894   retval = usb_hub_init();
    895   if (retval)
    896    goto hub_init_failed;
    897   retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);
    898   if (!retval)
    899    goto out;
    900
    901   usb_hub_cleanup();
    902  hub_init_failed:
    903   usbfs_cleanup();
    904 fs_init_failed:
    905   usb_devio_cleanup();
    906 usb_devio_init_failed:
    907   usb_deregister(&usbfs_driver);
    908 driver_register_failed:
    909   usb_major_cleanup();
    910 major_init_failed:
    911   usb_host_cleanup();
    912 host_init_failed:
    913   bus_unregister(&usb_bus_type);
    914 bus_register_failed:
    915   ksuspend_usb_cleanup();
    916 out:
    917   return retval;
    918 }

     (1)__init標記。

      關于usb_init,第一個問題是,第865行的__init標記具有什么意義?

      寫過驅動的應該不會陌生,它對內核來說就是一種暗示,表明這個函數僅在初始化期間使用,在模塊被裝載之后,它占用的資源就會釋放掉用作它處。它的暗示你懂,可你的暗示,她卻不懂或者懂裝不懂,多么讓人感傷。它在自己短暫的一生中一直從事繁重的工作,吃的是草吐出的是牛奶,留下的是整個USB子系統的繁榮。

      受這種精神所感染,我覺得有必要為它說的更多些。__init的定義在include/linux/init.h文件里

    43 #define __init          __attribute__ ((__section__ (".init.text")))

      好像這里引出了更多的疑問,__attribute__是什么?Linux內核代碼使用了大量的GNU C擴展,以至于GNU C成為能夠編譯內核的唯一編譯器,GNU C的這些擴展對代碼優化、目標代碼布局、安全檢查等方面也提供了很強的支持。而__attribute__就是這些擴展中的一個,它主要被用來聲明一些特殊的屬性,這些屬性主要被用來指示編譯器進行特定方面的優化和更仔細的代碼檢查。GNU C支持十幾個屬性,section是其中的一個,我們查看GCC的手冊可以看到下面的描述

    ‘section ("section-name")'
       Normally, the compiler places the code it generates in the `text'
     section. Sometimes, however, you need additional sections, or you
    need certain particular functions to appear in special sections.
       The `section' attribute specifies that a function lives in a
       particular section. For example, the declaration:

         extern void foobar (void) __attribute__ ((section ("bar")));

       puts the function ‘foobar' in the ‘bar' section.

       Some file formats do not support arbitrary sections so the
       ‘section' attribute is not available on all platforms. If you
       need to map the entire contents of a module to a particular
       section, consider using the facilities of the linker instead.

      通常編譯器將函數放在.text節,變量放在.data或.bss節,使用section屬性,可以讓編譯器將函數或變量放在指定的節中。那么前面對__init的定義便表示將它修飾的代碼放在.init.text節。連接器可以把相同節的代碼或數據安排在一起,比如__init修飾的所有代碼都會被放在.init.text節里,初始化結束后就可以釋放這部分內存。

      問題可以到此為止,也可以更深入,即內核又是如何調用到這些__init修飾的初始化函數?要回答這個問題,還需要回顧一下subsys_initcall宏,它也在include/linux/init.h里定義

    125 #define subsys_initcall(fn)             __define_initcall("4",fn,4)

      這里又出現了一個宏__define_initcall,它用于將指定的函數指針fn放到initcall.init節里 而對于具體的subsys_initcall宏,則是把fn放到.initcall.init的子節.initcall4.init里。要弄清楚.initcall.init、.init.text和.initcall4.init這樣的東東,我們還需要了解一點內核可執行文件相關的概念。

      內核可執行文件由許多鏈接在一起的對象文件組成。對象文件有許多節,如文本、數據、init數據、bass等等。這些對象文件都是由一個稱為鏈接器腳本的文件鏈接并裝入的。這個鏈接器腳本的功能是將輸入對象文件的各節映射到輸出文件中;換句話說,它將所有輸入對象文件都鏈接到單一的可執行文件中,將該可執行文件的各節裝入到指定地址處。 vmlinux.lds是存在于arch/<target>/ 目錄中的內核鏈接器腳本,它負責鏈接內核的各個節并將它們裝入內存中特定偏移量處。

      我可以負責任的告訴你,要看懂vmlinux.lds這個文件是需要一番功夫的,不過大家都是聰明人,聰明人做聰明事,所以你需要做的只是搜索initcall.init,然后便會看到似曾相識的內容

    __inicall_start = .;
    .initcall.init : AT(ADDR(.initcall.init) – 0xC0000000) {
    *(.initcall1.init)
    *(.initcall2.init)
    *(.initcall3.init)
    *(.initcall4.init)
    *(.initcall5.init)
    *(.initcall6.init)
    *(.initcall7.init)
    }
    __initcall_end = .;

      這里的__initcall_start指向.initcall.init節的開始,__initcall_end指向它的結尾。而.initcall.init節又被分為了7個子節,分別是

    .initcall1.init 
    .initcall2.init 
    .initcall3.init 
    .initcall4.init 
    .initcall5.init 
    .initcall6.init 
    .initcall7.init

      我們的subsys_initcall宏便是將指定的函數指針放在了.initcall4.init子節。其它的比如core_initcall將函數指針放在.initcall1.init子節,device_initcall將函數指針放在了.initcall6.init子節等等,都可以從include/linux/init.h文件找到它們的定義。各個字節的順序是確定的,即先調用.initcall1.init中的函數指針再調用.initcall2.init中的函數指針,等等。__init修飾的初始化函數在內核初始化過程中調用的順序和.initcall.init節里函數指針的順序有關,不同的初始化函數被放在不同的子節中,因此也就決定了它們的調用順序。

      至于實際執行函數調用的地方,就在/init/main.c文件里,內核的初始化么,不在那里還能在哪里,里面的do_initcalls函數會直接用到這里的__initcall_start、__initcall_end來進行判斷。

      (2)模塊參數。

      關于usb_init函數,第二個問題是,第868行的nousb表示什么?

      知道C語言的人都會知道nousb是一個標志,只是不同的標志有不一樣的精彩,這里的nousb是用來讓我們在啟動內核的時候通過內核參數去掉USB子系統的,Linux社會是一個很人性化的世界,它不會去逼迫我們接受USB,一切都只關乎我們自己的需要。不過我想我們一般來說是不會去指定nousb的吧。如果你真的指定了nousb,那它就只會幽怨的說一句“USB support disabled”,然后退出usb_init。

      nousb在drivers/usb/core/usb.c文件中定義為:

    static int nousb; /* Disable USB when built into kernel image */
    module_param_named(autosuspend, usb_autosuspend_delay, int, 0644);
    MODULE_PARM_DESC(autosuspend, "default autosuspend delay");

      從中可知nousb是個模塊參數。關于模塊參數,我們都知道可以在加載模塊的時候可以指定,但是如何在內核啟動的時候指定?

      打開系統的grub文件,然后找到kernel行,比如:

    kernel  /boot/vmlinuz-2.6.18-kdb root=/dev/sda1 ro splash=silent vga=0x314

      其中的root,splash,vga等都表示內核參數。當某一模塊被編譯進內核的時候,它的模塊參數便需要在kernel行來指定,格式為“模塊名.參數=值”,比如:

    modprobe usbcore autosuspend=2

      對應到kernel行,即為:

    usbcore.autosuspend=2

      通過命令“modinfo -p ${modulename}”可以得知一個模塊有哪些參數可以使用。同時,對于已經加載到內核里的模塊,它們的模塊參數會列舉在/sys/module/${modulename}/parameters/目錄下面,可以使用“echo -n ${value} > /sys/module/${modulename}/parameters/${parm}”這樣的命令去修改。

      (3)可變參數宏。

      關于usb_init函數,第三個問題是,pr_info如何實現與使用?

      pr_info只是一個打印信息的可辨參數宏,printk的變體,在include/linux/kernel.h里定義:

    242 #define pr_info(fmt,arg...) /
    243         printk(KERN_INFO fmt,##arg)

      99年的ISO C標準里規定了可變參數宏,和函數語法類似,比如

    #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

      里面的“…”就表示可變參數,調用時,它們就會替代宏體里的__VA_ARGS__。GCC總是會顯得特立獨行一些,它支持更復雜的形式,可以給可變參數取個名字,比如

    #define debug(format, args...) fprintf (stderr, format, args)

      有了名字總是會容易交流一些。是不是與pr_info比較接近了?除了‘##’,它主要是針對空參數的情況。既然說是可變參數,那傳遞空參數也總是可以的,空即是多,多即是空,股市里的哲理這里同樣也是適合的。如果沒有‘##’,傳遞空參數的時候,比如

    debug ("A message");

      展開后,里面的字符串后面會多個多余的逗號。這個逗號你應該不會喜歡,而‘##’則會使預處理器去掉這個多余的逗號。

      關于usb_init函數,上面的三個問題之外,余下的代碼分別完成usb各部分的初始化,接下來就需要圍繞它們分別進行深入分析。因為這里只是演示如何入手分析,展示的只是一種態度,所以具體的深入分析就免了吧。

    posted @ 2011-11-10 11:10 順其自然EVO| 編輯 收藏

    多些時間能少寫些代碼

      導讀:作者陳皓在微博上說過這樣一段話:“聰明的程序員使用50%-70%的時間用來思考,嘗試和權衡各種設計和實現,而用30%–50%的時間是在忙碌著編碼,調試和測試。聰明的老板也會讓團隊這樣做。而愚蠢的老板,愚蠢的程序員會拿出來100%-150%的時間來忙著趕進度,返工,重構,fix大量的bug…所以,越差的團隊一般會越忙,而且還忙不完。”文中作者就此觀點進行闡述。

      文章內容如下:

      在現在這個浮躁的時期,再加上敏捷咨詢師們念的歪經,他們讓人感覺上就像是軟件產品是可以在很短的時間內高質量的完成的,這令那些管理者們很興奮,就像巴甫洛夫的條件反射實驗中的狗看到了肉就像流口水那樣興奮。他們使用TDD,快速迭代,不斷重構,持續集成直至持續部署的方法在進行軟件開發

      軟件開發真是這樣的嗎?難道不需要花時間去思考嗎?對此,有些觀點在Todd的《“品質在于構建過程”嗎?》以及《Bob大叔和Jim Coplien對TDD的論戰》中談到過了。我只想想表達下面的觀點:

      ● 軟件的精髓在于設計,設計是一件很費大腦的事件。對于軟件來說,設計沒有完美的,它總是一件需要取舍需要權衡的事,比如:時間換空間,空間換時間,TCP或UDP,同步還是異步,數據冗余還不冗余等等。那怕是一個小小的observers模式是pull方式還是push方式都需要仔細討論。這些的東西需要時間和做前期嘗試。

      ● TDD、快速原型和迭代可能會對軟件和團隊產生負面影響。在一開始,你需要花很大的精力來讓你的軟件從無到有(做過軟件的人都知道,從零開始寫代碼是很痛苦的事),但是因為你沒有想好,先做再說,所以,后期你會面臨更多的質量問題而讓你需要花更多的時間精力。當然,那些咨詢師會讓你用持續集成和持續部署這樣的方法。但我想告訴你,這并不解決你軟件設計的缺陷。舉個例子——TDD、迭代、原型只關注功能性需求,其不會關注非功能性需求,比如性能問題,高可用性問題,系統維護問題(模塊的耦合問題),等等。而這些問題往往都可以讓你的軟件設計重新來過。

      ● 重構是惡夢,重構應該越少越好。當你維護一個復雜的系統時你會知道重構是一件多么恐怖的事情(參看《重構代碼的7個階段》)。如果一開始沒有想好,你要面臨的不單單是re-design, re-architect,還要面對時間和人力成本的增加,最難的是你還要面對的是團隊士氣因為不斷的rework而逐漸低落并產生厭倦和懈怠情緒。

      所以,如果你能有多一些時間去和客戶討論一下需求和未來可能的變化,去調查一下實現的技術難點和細節,去和其他有經驗的人討論并推敲一下架構和設計,去思考設計上的缺陷,那么,你的coding會變得非常地直,直到你一眼就看到盡頭,你的測試案例也會寫得非常地好,你會幾乎不需要重構,于是,你會在未來少寫很多代碼,從而你的軟件開發會越來越輕松,直到技術開始換代。

      我現在在做的項目,花了幾乎4個月的時間來做設計,在這個過程中,我們反復思考、討論和權衡若干種實現方法,并盡可能地窮舉所有的場景和細節以及未來可能的變化(那怕是那些簡單的模塊),有個模塊被重寫了至少三次,每次都是寫到一半就被推翻重寫,我們整個團隊不斷地在和其它團隊討論,并在對系統不斷地認識中對系統進行簡化和優化,并力求達到完美。現在看來,沒有貿然使用Scrum是明智的。

      這就好像我們修路造橋一樣,我們需要花大量的時間勘測地形地質,分析數據,思考可能出現的各種問題(各種自然災害),評估不同的設計方案,而不是先盡快建好再說。

      所以,多一些時間,不是讓你多做幾次迭代,多完成幾個模塊,而是可以讓你少寫一些代碼,更快的交付一個更好的產品。

      我相信你會有很多疑問,下面是我覺得你可能會有下面的一些觀點,讓我一條一條來回復:

      ● 首當其沖的一定會是項目的deadline,或是那種你沒有活語權的項目。比如做那種“甲乙方合同式的項目”,我把這種項目統一認為是“外包項目”,在這種項目性質下,你很難有話語權。對此,我覺得,1)作為乙方的你還是應該和甲方在項目計劃上爭取一下,曉之以情,動之以理。2)如果不行,只能在時間、需求范圍和質量上做一個權衡。另外,在這種情況下你要找一個方法,把你的壓力和痛苦分擔給用戶和領導。(找到這個方法的前提需要你找到用戶和領導他們害怕什么,嘿嘿)

      ● 過度設計和紙上談兵。有人說會不會設計太多,造成過度設計,或是在設計上花太多的時間。這有可能。我上一家公司的一個項目團隊就花了1年多的時間來不停不停的開會和做設計,結果release的時候還有1000多個bug。這個問題的原因是,這個團隊的設計是在紙上談兵,開會是開神仙會,討論的設計都是浮云。所以,設計并不是討論和思考,還需要去嘗試,我認為當你的設計完成的時候,你的骨干核心代碼都基本完成了。

      ● 我的團隊成員水平太差,不會思考。首先,先恭喜你找到一堆碼農,當然,這不怪你,這是中國教育和大環境的問題,讓人不會思考。對于這樣的情況,我有兩個建議,1)量力而行,使多大的碗就吃多少飯。2)鼓勵思考,那怕那些想法很不靠譜,因為如果不開始,那么將永遠不會思考。

      ● 必需使用快速迭代。很多公司都在強行上敏捷,他們希望產品越快release越好,而沒有充分的時間思考和討論。對于這種項目,我的建議是,1)找有豐富經驗的人來做。2)迭代過程中力求架構和程序邏輯的簡單,簡單,再簡單,力求代碼間的高內聚,低耦合。不然,重構的時候你就好玩了。

      ● 創業團隊必需要快。做得快就是做得好嗎?很多時候,不是誰快誰就能笑到最后的。這樣的例子太多了。第一個做出來的人并不一定就會占領市場,其很有可能會成為先驅。

      ● 有錢的公司才會讓團隊用更多的時間去思考。錯了,你們沒有見過有錢的公司,有錢的公司可以招一堆干不成活的人,可以把事搞亂了再新來過,甚至可以把做失敗的項目換個名字再重新立項。這些真正的有錢的公司只求快,只求人多,不怕做錯決定。像我們這些沒錢的人,干什么事都是小心翼翼地,生怕做錯決定。

    posted @ 2011-11-10 10:58 順其自然EVO 閱讀(115) | 評論 (0)編輯 收藏

    Java編程體驗:線程的7種狀態及相互轉換

      先從圖片開始

      小小的作下解釋:

      1、線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但不管怎樣,當我們new了這個對象后,線程就進入了初始狀態;

      2、當該對象調用了start()方法,就進入可運行狀態;

      3、進入可運行狀態后,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;

      4、進入運行狀態后情況就比較復雜了

      4.1 run()方法或main()方法結束后,線程就進入終止狀態;

      4.2 當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但并不釋放所占有的資源)。當sleep()結束或join()結束后,該線程進入可運行狀態,繼續等待OS分配時間片;

      4.3 線程調用了yield()方法,意思是放棄當前獲得的CPU時間片,回到可運行狀態,這時與其他進程處于同等競爭狀態,OS有可能會接著又讓這個進程進入運行狀態;

      4.4 當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被synchroniza(同步),獲取不到鎖標記,將會立即進入鎖池 狀態,等待獲取鎖標記(這時的鎖池里也許已經有了其他線程在等待獲取鎖標記,這時它們處于隊列狀態,既先到先得),一旦線程獲得鎖標記后,就轉入可運行狀態,等待OS分配CPU時間片;

      4.5 當線程調用wait()方法后會進入等待隊列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態后,是不能自動喚 醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會進入鎖 池,等待獲取鎖標記。

      總算全部回憶了一遍JDK1.5在API的使用上有了較好的改進,效率得到很大的提高,不過幾個狀態轉換的原理還是一樣。

    posted @ 2011-11-10 09:44 順其自然EVO 閱讀(161) | 評論 (0)編輯 收藏

    僅列出標題
    共394頁: First 上一頁 368 369 370 371 372 373 374 375 376 下一頁 Last 
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 114一级毛片免费| 国产亚洲欧美在线观看| 亚洲V无码一区二区三区四区观看| 免费一级做a爰片性色毛片| 免费毛片在线播放| 国产免费看插插插视频| 国产免费久久精品| 又粗又大又长又爽免费视频| 亚洲av无码国产精品色在线看不卡 | 亚洲AV一宅男色影视| 久久亚洲精品视频| 亚洲精品在线观看视频| 亚洲国产综合精品| 亚洲jjzzjjzz在线观看| 亚洲中文字幕无码中文字| 久久亚洲精品无码网站| 特级毛片A级毛片100免费播放| 色爽黄1000部免费软件下载| aa级毛片毛片免费观看久| 国产猛男猛女超爽免费视频| 久久ww精品w免费人成| 国产片AV片永久免费观看| 午夜爱爱免费视频| 亚洲精品99久久久久中文字幕| 久久亚洲色一区二区三区| 亚洲AV人人澡人人爽人人夜夜| 亚洲宅男天堂a在线| 亚洲欧美国产国产一区二区三区| 国产精品亚洲天堂| 中文字幕av免费专区| 最近免费中文字幕大全免费版视频| aⅴ在线免费观看| 日本高清免费网站| 国产亚洲人成A在线V网站| 亚洲国产精品不卡在线电影| 亚洲综合校园春色| 午夜在线免费视频| 无码国产精品一区二区免费模式 | 看全免费的一级毛片| 久久国产免费一区二区三区| 无码精品A∨在线观看免费|