1. 什麼是白盒測試和黑盒測試有什麼區別
白盒測試是一種測試用例設計方法,盒子指的是被測試的軟體,白盒指的是盒子是可視的,你清楚盒子內部的東西以及裡面是如何運作的。
黑盒測試也稱功能測試,它是通過測試來檢測每個功能是否都能正常使用。
兩種測試都適合網頁游戲。
區別如下:
1、測試方法不同
白盒測試的測試方法有代碼檢查法、靜態結構分析法、靜態質量度量法、邏輯覆蓋法、基本路徑測試法、域測試、符號測試、路徑覆蓋和程序變異。
黑盒測試用例設計方法包括等價類劃分法、邊界值分析法、錯誤推測法、因果圖法、判定表驅動法、正交試驗設計法、功能圖法、場景法等。
2、作用不同
白盒測試通過檢查軟體內部的邏輯結構,對軟體中的邏輯路徑進行覆蓋測試;在程序不同地方設立檢查點,檢查程序的狀態,以確定實際運行狀態與預期狀態是否一致。
黑盒測試法注重於測試軟體的功能需求,主要試圖發現功能不正確或遺漏、界面錯誤、輸入和輸出錯誤、資料庫訪問錯誤、性能錯誤和初始化和終止錯誤等幾類錯誤。
3、特點不同
白盒測試依據軟體設計說明書進行測試、對程序內部細節的嚴密檢驗、針對特定條件設計測試用例、對軟體的邏輯路徑進行覆蓋測試。
黑盒測試是以用戶的角度,從輸入數據與輸出數據的對應關系出發進行測試。
白盒測試優缺點:
優點:
1. 迫使測試人員去仔細思考軟體的實現;
2. 可以檢測代碼中的每條分支和路徑;
3. 揭示隱藏在代碼中的錯誤;
4. 對代碼的測試比較徹底;
5. 最優化。
缺點:
1. 昂貴;
2. 無法檢測代碼中遺漏的路徑和數據敏感性錯誤;
3. 不驗證規格的正確性。
2. 如何看項目代碼
問題一:剛進項目組,怎麼看代碼? 20分 先將做好的這部分項目打開操作一遍,一定要先熟悉這個項目的業務流程,否則不知道他們原來為什麼這樣寫代碼。在操作項目的時候,你也可以想想,如果是你來做這個項目,你會怎麼做,然後再看看他們是怎麼實現的。演示項目的時候可以通過鏈接地址找到相應模塊的源代碼文件。作為過來人,我只能告訴你,熟悉業務流程是最重要的。
問題二:如何讀項目代碼 (再沒有文檔這個總是有的吧?哪怕是個代號)2.這個項目的性質3.源代碼的規模有多少行(其中有多少行是注釋),總共有多少個文件(每一類文件分別有多少個,每個文件是多少行)如果是面向對象的,有多少個class,如果是面向過程的有多少個function4.功能的詳細整理功能列表函數名 功能 功能描述5.功能模塊之間的關系(哪怕沒有注釋,按名稱,調用關系一定能整理清楚)如果你把我上面列的5點搞清楚了,再來抱怨,我想應該是下面這個樣子:老大給了我一個項目源碼讓我看,注釋都沒有,是一個超級留言本,總共有10萬行代碼,就兩個文件,函數不到10個,功能就是注冊和留言,連修改刪除功能都沒有,大家說我看這樣的代碼有意思嗎?我是不是還要待在這里?如果你完成了我上面說的5步,你仍然覺得沒什麼值得學的,沒有什麼需要做的,說明你不適合干編程這一行。下邊呢就具體的介紹一下心得。當我們學習程序編碼時,首先會看一些程序代碼例子,然後學例子去修改編寫代碼;當我們剛進入一個公司,公司會把要維護修改的項目分給我們,讓我們修改維護,要想修改編寫,首先要讀懂項目主要程序;當我們去看一些優秀的開源項目,想從中學習這些項目的設計思想時,我們也要去看項目代碼…如此等等,可以說讀代碼是為了寫代碼,寫出非常優秀的代碼。因此對於程序開發人員來說,快速閱讀項目代碼是一個必需要掌握的能力。前段時間,我接手了一個php做的系統,公司要求我參閱這個項目重新做一個Demo,在讀這個系統代碼時,我積累了一些關於讀項目代碼的心得體會,主要內容如下。 清楚主要功能 想一想如何實現 首先要清楚項目的主要功能,知道它主要是干什麼用的,才可能從總體上去把握項目。可以通過向公司同事或其他人請教、或查閱項目需求分析文檔,概要設計文檔來快速獲得項目主要功能,如果沒有這些文檔,可以在網上搜索項目的功能,如果以上這些都沒有條件的話,那隻有把此項目運行起來,通過自己的實際操作來得到項目的主要功能了。清楚項目主要功能後,自己首先想一想,如果讓我做,該如果去實現呢,這樣能夠得到對自己來說的技術難點,讀源代碼時會更留意這些內容,效率也就提高上去了。 運行項目 找到實現主要功能的代碼 清楚主要功能以後,就可以去讀實現主要功能的代碼了,當然還需要找到這些功能是在那些文件,那些類來實現的。為了找到實現類,我們還要把項目運行起來,依據項目類型及特點,通過不同方法找到實現類代碼。把這些文件記錄下來,隨後只需重點看這些文件中的代碼,就可以了。 依據代碼的類層次關系 了解項目體系結構 通過其他一些工具把這些代碼的類圖導出來,比如(rational rose或powerdesigner的逆向工程),如果是java項目還可以導出Javadoc。依據導出的內容,了解每一個主要實現類的大致功能,及這些類之間相互關系,這樣也就清楚了項目的類層次結構,即項目體系結構。 清楚項目主要實現技術 依據導出的類圖和對項目了解的疑點,如果是技術方面,比如自己不知道或不清楚該怎麼實現某種功能,那就趕緊參照源代碼,找到項目主要實現技術。如果對此技術不熟悉,那就快快在Bai或Google上面搜索一把,ok,一定會很多關於此技術的資料等著你去看呢,抓緊閱讀這些資料,盡快掌握此技術的內容。 調試主要實現類,從中了解實現細節 了解了項目的體系結構,並清除項目主要實現技術後,下一步就是看實現細節了。看實現細節,也是從整體到局部,從看各個方法聲明出發,在逐步看每個方法體。當然沒有必要每個方法都要去一行一行看,只需重點看與實現此類主要功能的核心方法。對某些代碼看過一兩編後......>>
問題三:如何看一個java web 項目代碼 首先把項目跑起來,根據自己想看的功能跟下去。
比如現在我想看商品添加的功能模塊,在頁面找到添加的按鈕,找到後台請求地址,比如請求地址是localhost/sun/proct/add.do
然後再找到該java web的攔截是什麼做的,如果是原生的servlet就直接在.java類中通過search找到這個實現了該註解的並繼承了Servlet的類
如果是用spring mvc實現攔截的就找實現了spring標準的攔截位置
如果是struts等等根據該框架的標准找到後台控制層代碼
我這里全部是講的mvc模式。
如果是那種沒使用mvc開發模式的,那你就可以不用看了,沒有看的價值。因為過 了一個月他自己也看不懂自己的代碼邏輯。
找到了控制層代碼,那麼一切就迎刃而解了 ,該打斷點打斷點,該跟代碼的跟代碼。。
後台資料庫事物那種,就暫且不提了,懂的人一點就通,不懂的我解釋也解釋不清楚
問題四:C#。。如何查看項目代碼? 從你觸發的事件開始,比如頁面上有一個button按鈕,點擊後觸發該按鈕事件,如果點擊超鏈接,就分析鏈接的頁面,如果頁面上有內置的控制項,看控制項設置了哪些屬性,不過高手寫的代碼都不用去設置控制項屬性的,都是在後台代碼中寫,你直接在前台頁面按F7查看後台代碼,可以設置斷點單步調試,可以清晰的分析出程序每一步做什麼,謝謝,這是我個人心得。
問題五:java中怎麼在整個項目里查找代碼 這個就要看開發工具了,這個不是java,是開發工具里設置的MyEclipse是ctrl+h
問題六:如何閱讀一個大型項目代碼 對於程序員來說,寫代碼永遠比讀代碼來的舒服。但現實情況是,程序員常常需要閱讀其他人員寫的代碼,更多的時候這些代碼可能即沒文檔也沒注釋。不過,好象有個人說過一句話,代碼之前,了無秘密。運用適當的策略可以讓閱讀工作變的輕松很多。1. 對於常用的系統函數進行追蹤。比如ReadFile,CreateDevice,CreateWindow,在這些函數處放幾斷點,可以看到代碼的調用過程。通過這種方式可以方便地把代碼分為底層代碼和上層邏輯代碼。2.依據項目依賴關系進行閱讀。項目的依賴關系同時表明了項目的復雜程度。對於大型的項目通常都會分割成若乾子項目,根據項目的依賴關系,循序漸進的方式可以讓閱讀變的簡單。3.對於以lib形式提供的子項目。在閱讀時,可以先把lib的整個項目做為黑盒使用。根據_declspec(dllexport)或者以頭文件方式提供的調用介面,可以減少對於細節的閱讀時間。根據模塊進行大致的劃分,可以有效地對項目的結構有直接的感性認識。4.識別項目中使用的設計模式。對於大型項目來說,設計模式是必不可少的。在龐大的代碼中識別設計模式,尋找代碼中使用相似手法的代碼結構可以極大簡化需要閱讀的代碼。5.根據數據流程分析。動態職責劃分。6.修改部分代碼,進行調試。修改部分常數或者饒過某些程序執行流程,或者以簡化的數據對程序進行追蹤。
問題七:怎樣看一個SSH項目的項目代碼? 1.首先你得啟動,看登錄流程,再找一個功能點,針對增刪改查實現的技術
2.上面主要針對請求的發送響應、連接資料庫等;然後就是看前台頁面展示如何去後台數據,用到了哪些ext、或是easyUI技術
3.以上2點主要針對有任務了能快速上手;學習項目技術就得看啟動時,配置文件怎麼寫的,xml文件的配置:事物、定時器、連接池、監聽器、webservice介面等
4.最後就是項目業務流程了
問題八:如何快速看懂別人的代碼 我看了兩年,才達到看一個一個準的境界。這是一個過程。慢慢來吧。
問題九:分類匯總結果如何同時顯示項目代碼和項目名稱 利用分類匯總功能試試。應該能滿足你的要求。
具體操作:單元格選定在標題行的任一單元格如何。數據---分類匯總----分類欄位,選生產部---匯總方式,選求和---選定匯總項,選你要求和的數據列標題---確定。
問題十:如何查看一個包的源代碼 查看Eclipse中導入包的源碼:1、項目中的Web App Libraries選項2、然後找到剛導入的jar包,並3、雙擊其中的一個Class文件4、點Attach Source..按鈕,在彈出窗口中選第二項External location5、點右面的External File,選擇源文件所在路徑,選編碼格式,一般默認GBK,點OK以後雙擊這個包下面的class文件,就能直接看到源碼了:
3. 黑盒法是把軟體系統看成一個黑匣子,關注的是什麼樣的輸入有什麼樣的輸出
軟體測試的兩個方面而已。
白盒測試:是通過程序的源代碼進行測試而不使用用戶界面。這種類型的測試需要從代碼句法發現內部代碼在演算法,溢出,路徑,條件等等中的缺點或者錯誤,進而加以修正。
黑盒測試:是通過使用整個軟體或某種軟體功能來嚴格地測試, 而並沒有通過檢查程序的源代碼或者很清楚地了解該軟體的源代碼程序具體是怎樣設計的。測試人員通過輸入他們的數據然後看輸出的結果從而了解軟體怎樣工作。在測試時,把程序看作一個不能打開的黑盆子,在完全不考慮程序內部結構和內部特性的情況下,測試者在程序介面進行測試,它只檢查程序功能是否按照需求
規格說明書的規定正常使用,程序是否能適當地接收和正確的輸出
4. 如何閱讀源代碼
", 除了閱讀代碼以外, 沒有更好的方法.7.在尋找bug時, 請從問題的表現形式到問題的根源來分析代碼. 不要沿著不相關的路徑(誤入歧途).8.我們要充分利用調試器|編譯器給出的警告或輸出的符號代碼|系統調用跟蹤器|資料庫結構化查詢語言的日誌機制|包轉儲工具和Windows的消息偵查程序, 定出的bug的位置.9.對於那些大型且組織良好的系統, 您只需要最低限度地了解它的全部功能, 就能夠對它做出修改.10.當向系統中增加新功能時, 首先的任務就是找到實現類似特性的代碼, 將它作為待實現功能的模板.11.從特性的功能描述到代碼的實現, 可以按照字元串消息, 或使用關鍵詞來搜索代碼.12.在移植代碼或修改介面時, 您可以通過編譯器直接定位出問題涉及的范圍, 從而減少代碼閱讀的工作量.13.進行重構時, 您從一個能夠正常工作的系統開始做起, 希望確保結束時系統能夠正常工作. 一套恰當的測試用例(test case)可以幫助您滿足此項約束.14.閱讀代碼尋找重構機會時, 先從系統的構架開始, 然後逐步細化, 能夠獲得最大的效益.15.代碼的可重用性是一個很誘人, 但難以理解與分離, 可以試著尋找粒度更大一些的包, 甚至其他代碼.16.在復查軟體系統時, 要注意, 系統是由很多部分組成的, 不僅僅只是執行語句. 還要注意分析以下內容: 文件和目錄結構|生成和配置過程|用戶界面和系統的文檔.18.可以將軟體復查作為一個學習|講授|援之以手和接受幫助的機會.++++++++++++++++++++第二章: 基本編程元素++++++++++++++++++++19.第一次分析一個程序時, main是一個好的起始點.20.層疊if-else if-...-else序列可以看作是由互斥選擇項組成的選擇結構.21.有時, 要想了解程序在某一方面的功能, 運行它可能比閱讀源代碼更為恰當.22.在分析重要的程序時, 最好首先識別出重要的組成部分.23.了解局部的命名約定, 利用它們來猜測變數和函數的功能用途.24.當基於猜測修改代碼時, 您應該設計能夠驗證最初假設的過程. 這個過程可能包括用編譯器進行檢查|引入斷言|或者執行適當的測試用例.25.理解了代碼的某一部分, 可能幫助你理解餘下的代碼.26.解決困難的代碼要從容易的部分入手.27.要養成遇到庫元素就去閱讀相關文檔的習慣; 這將會增強您閱讀和編寫代碼的能力.28.代碼閱讀有許多可選擇的策略: 自底向上和自頂向下的分析|應用試探法和檢查注釋和外部文檔, 應該依據問題的需要嘗試所有這些方法.29.for (i=0; i30.涉及兩項不等測試(其中一項包括相等條件)的比較表達式可以看作是區間成員測試.31.我們經常可以將表達式應用在樣本數據上, 藉以了解它的含義.32.使用De Morgan法則簡化復雜的邏輯表達式.33.在閱讀邏輯乘表達式時, 問題可以認為正在分析的表達式以左的表達式均為true; 在閱讀邏輯和表達式時, 類似地, 可以認為正在分析的表達式以左的表達式均為false.34.重新組織您控制的代碼, 使之更為易讀.35.將使用條件運行符?梢醞ü�付�-w選項, 讓diff忽略空白差異, 避免由於更改了縮進層次而引入的噪音.43.do循環的循環體至少執行一次.44.執行算術運算時, 當b=2n-1時, 可以將a&b理解為a%(b+1).45.將an理解為a/k, k=2n.47.每次只分析一個控制結構, 將它的內容看作是一個黑盒.48.將每個控制結構的控製表達式看作是它所包含代碼的斷言.49.return, goto, break和continue語句, 還有異常, 都會影響結構化的執行流程. 由於這些語句一般都會終止或重新開始正在進行的循環,因此要單獨推理它們的行為.50.用復雜循環的變式和不變式, 對循環進行推理.51.使用保持含義不變的變換重新安排代碼, 簡化代碼的推理工作.+++++++++++++++++++第三章: 高級C數據類型+++++++++++++++++++52.了解特定語言構造所服務的功能之後, 就能夠更好地理解使用它們的代碼.53.識別並歸類使用指針的理由.54.在C程序中, 指針一般用來構造鏈式數據結構|動態分配的數據結構|實現引用調用|訪問和迭代數據元素|傳遞數組參數|引用函數|作為其他值的別名|代表字元串|以及直接訪問系統內存.55.以引用傳遞的參數可以用來返回函數的結果, 或者避免參數復制帶來的開銷.56.指向數組元素地址的指針, 可以訪問位於特定索引位置的元素.57.指向數組元素的指針和相應的數組索引, 作用在二者上的運算具有相同的語義.58.使用全局或static局部變數的函數大多數情況都不可重入(reentrant).59.字元指針不同於字元數組.60.識別和歸類應用結構或共用體的每種理由.61.C語言中的結構將多個數據元素集合在一起, 使得它們可以作為一個整體來使用, 用來從函數中返回多個數據元素|構造鏈式數據結構|映射數據在硬體設備|網路鏈接和存儲介質上的組織方式|實現抽象數據類型|以及以面向對象的方式編程.62.共用體在C程序中主要用於優化存儲空間的利用|實現多態|以及訪問數據不同的內部表達方式.63.一個指針, 在初始化為指向N個元素的存儲空間之後, 就可以作為N個元素的數組來使用.64.動態分配的內在塊可以電焊工地釋放, 或在程序結束時釋放, 或由垃圾回收器來完成回收; 在棧上分配的內存塊當分配它的函數退出後釋放.65.C程序使用typedef聲明促進抽象, 並增強代碼的易讀性, 從而防範可移植性問題, 並模擬C++和Java的類聲明行為.66.可以將typedef聲明理解成變數定義: 變數的名稱就是類型的名稱; 變數的類型就是與該名稱對應的類型.+++++++++++++++第四章: C數據結構+++++++++++++++67.根據底層的抽象數據類型理解顯式的數據結構操作.68.C語言中, 一般使用內建的數組類型實現向量, 不再對底層實現進行抽象.69.N個元素的數組可以被序列for (i=0; i70.表達式sizeof(x)總會得到用memset或memcpy處理數組x(不是指針)所需的正確位元組數.71.區間一般用區間內的第一個元素和區間後的第一個元素來表示.72.不對稱區間中元素的數目等於高位邊界與低位邊界的差.73.當不對稱區間的高位邊界等於低位邊界時, 區間為空.74.不對稱區間中的低位邊界代表區間的第一個元素; 高位邊界代表區間外的第一個元素.75.結構的數組常常表示由記錄和欄位組成的表.76.指向結構的指針常常表示訪問底層記錄和欄位的游標.77.動態分配的矩陣一般存儲為指向數組列的指針或指向元素指針的指針; 這兩種類型都可以按照二維數組進行訪問.78.以數組形式存儲的動態分配矩陣, 用自定義訪問函數定位它們的元素.79.抽象數據類型為底層實現元素的使用(或誤用)方式提供一種信心的量度.80.數組用從0開始的順序整數為鍵, 組織查找表.81.數組經常用來對控制結構進行高效編碼, 簡化程序的邏輯.82.通過在數組中每個位置存儲一個數據元素和一個函數指針(指向處理數據元素的函數), 可以將代碼與數據關聯起來.83.數組可以通過存儲供程序內的抽象機(abstract machine)或虛擬機(virtual machine)使用的數據或代碼, 控製程序的運作.84.可以將表達式sizeof(x) / sizeof(x[0])理解為數組x中元素的個數.85.如果結構中含有指向結構自身|名為next的元素, 一般說來, 該結構定義的是單向鏈表的結點.86.指向鏈表結點的持久性(如全局|靜態或在堆上分配)指針常常表示鏈表的頭部.87.包含指向自身的next和prev指針的結構可能是雙向鏈表的結點.88.理解復雜數據結構的指針操作可以將數據元素畫為方框|指針畫為箭頭.89.遞歸數據結構經常用遞歸演算法來處理.90.重要的數據結構操作演算法一般用函數參數或模板參數來參數化.91.圖的結點常常順序地存儲在數組中, 鏈接到鏈表中, 或通過圖的邊鏈接起來.92.圖中的邊一般不是隱式地通過指針, 就是顯式地作為獨立的結構來表示.93.圖的邊經常存儲為動態分配的數組或鏈表, 在這兩種情況下, 邊都錨定在圖的結點上.94.在無向圖中, 表達數據時應該將所有的結點看作是等同的, 類似地, 進行處理任務的代碼也不應該基於它們的方向來區分邊.95.在非連通圖中, 執行遍歷代碼應該能夠接通孤立的子圖.96.處理包含迴路的圖時, 遍歷代碼應該避免在處理圖的迴路進入循環.97.復雜的圖結構中, 可能隱藏著其他類型的獨立結構.+++++++++++++++++第五章: 高級控制流程+++++++++++++++++98.採用遞歸定義的演算法和數據結構經常用遞歸的函數定義來實現.99.推理遞歸函數時, 要從基準落伍測試開始, 並認證每次遞歸調用如何逐漸接近非遞歸基準範例代碼.100.簡單的語言常常使用一系列遵循該語言語法結構的函數進行語法分析.101.推理互遞歸函數時, 要基於底層概念的遞歸定義.102.尾遞歸調用等同於一個回到函數開始處的循環.103.將throws子句從方法的定義中移除, 然後運行Java編譯器對類的源代碼進行編譯, 就可以容易地找到那些可能隱式地生成異常的方法.104.在多處理器計算機上運行的代碼常常圍繞進程或線程進行組織.105.工作群並行模型用於在多個處理器間分配工作, 或者創建一個任務池, 然後將大量需要處理標准化的工作進行分配.106.基於線程的管理者/工人並行模型一般將耗時的或阻塞的操作分配給工人子任務, 從而維護中心任務的響應性.107.基於進程的管理者/工人並行模型一般用來重用現有的程序, 或用定義良好的介面組織和分離粗粒度的系統模塊集合, 組織和優化編譯過程, 或是用來實現應用程序各種特性的按需載入.212.大型的|分布式的系統經常實現為許多互相協作的進程.213.對於基於文本的數據儲存庫, 可以通過瀏覽存儲在其中的數據, 破譯出它的結構.214.可以通過查詢數據字典中的表, 或使用資料庫專有的SQL命令, 比如show table, 來分析關系型資料庫的模式.215.識別出重用的構架元素後, 可以查找其最初的描述, 了解正確地使用這種構架的方式, 以及可能出現的誤用.216.要詳細分析建立在某種框架之上的應用程序, 行動的最佳路線就是從研究框架自身開始.217.在閱讀向導生成的代碼時, 不要期望太高, 否則您會感到失望.218.學習幾個基本的設計模式之後, 您會發現, 您查看代碼構架的方式會發生改變: 您的視野和詞彙將會擴展到能夠識別和描述許多通用的形式.219.頻繁使用的一些模式, 但並不顯式地指出它們的名稱, 這是由於構架性設計的重用經常先於模式的形成.220.請試著按照底層模式來理解構架, 即使代碼中並沒有明確地提及模式.221.大多數解釋器都遵循類似的處理構架, 圍繞一個狀態機進行構建, 狀態機的操作依賴於解釋器的當前狀態|程序指令和程序狀態.222.多數情況下, 參考構架只是為應用程序域指定一種概念性的結構, 具體的實現並非必須遵照這種結構.+++++++++++++++++第十章: 代碼閱讀工具+++++++++++++++++223.詞彙工具可以高效地在一個大代碼文件中或者跨多個文件查找某種模式.224.使用程序編輯器和正則表達式查找命令, 瀏覽龐大的源代碼文件.225.以只讀方式瀏覽源代碼文件.226.使用正則表達式 ^function name 可以找出函數的定義.227.使用正則表達式的字元類, 可以查找名稱遵循特定模式的變數.228.使用正則表達式的否定字元類, 可以避免非積極匹配.229.使用正則表達式 symbol-1. *symbol-2, 可以查找出現在同一行的符號.230.使用編輯器的 tags 功能, 可以快速地找出實體的定義.231.可以用特定的 tag 創建工具, 增加編輯器的瀏覽功能.232.使用編輯器的大綱視圖, 可以獲得源代碼結構的鳥瞰圖.233.使用您的編輯器來檢測源代碼中圓括弧|方括弧和花括弧的匹配.234.使用 grep 跨多個文件查找代碼模式.235.使用 grep 定位符號的聲明|定義和應用.236.當您不能精確地表述要查找的內容時, 請使用關鍵單詞的詞干對程序的源代碼進行查找.237.用 grep 過濾其他工具生成的輸出, 分離出您要查找的項.238.將 grep 的輸出輸送到其他工具, 使復雜處理任務自動化.239.通過對 grep 的輸出進行流編輯, 重用代碼查找的結果.240.通過選取與噪音模式不匹配的輸出行(grep-v), 過濾虛假的 grep 輸出.241.使用 fgrep 在源代碼中查找字元串列表.242.查找注釋, 或標識符大小寫不敏感的語言編寫的代碼時, 要使用大小寫不敏感的模式匹配(grep -i).243.使用 grep –n 命令行開關, 可以創建與給定正則表達式匹配的文件和行號的檢查表.244.可以使用 diff 比較文件或程序不同版本之間的差別.245.在運行 diff 命令時, 可以使用 diff –b, 使文件比較演算法忽略結尾的空格, 用–w 忽略所有空白區域的差異, 用–i 使文件比較對大小寫不敏感.246.不要對創建自己的代碼閱讀工具心存畏懼.247.在構建自己的代碼閱讀工具時: 要充分利用現代快速原型語言所提供的能力; 從簡單開始, 根據需要逐漸改進; 使用利用代碼詞彙結構的各種試探法; 要允許一些輸出噪音或寂靜(無關輸出或缺失輸出); 使用其他工具對輸入進行預處理, 或者對輸出進行後期處理.248.要使編譯器成為您的: 指定恰當級別的編譯器警告, 並小心地評估生成的結果.249.使用C預處理器理清那些濫用預處理器特性的程序.250.要徹底地了解編譯器如何處理特定的代碼塊, 需要查看生成的符號(匯編)代碼.251.通過分析相應目標文件中的符號, 可以清晰地了解源文件的輸入和輸出.252.使用源代碼瀏覽器瀏覽大型的代碼集合以及對象類型.253.要抵制住按照您的編碼規范對外部代碼進行美化的誘惑; 不必要的編排更改會創建不同的代碼, 並妨礙工作的組織.254.優美列印程序和編輯器語法著色可以使得程序的源代碼為易讀.255.cdecl 程序可以將難以理解的C和C++類型聲明轉換成純英語(反之亦然).256.實際運行程序, 往往可以更深刻地理解程序的動作.257.系統調用|事件和數據包跟蹤程序可以增進對程序動作的理解.258.執行剖析器可以找出需要著重優化的代碼, 驗證輸入數據的覆蓋性, 以及分析演算法的動作.259.通過檢查從未執行的代碼行, 可以找出測試覆蓋的弱點, 並據此修正測試數據.260.要探究程序動態動作時的每個細節, 需要在調試器中運作它.261.將您覺得難以理解的代碼列印到紙上.262.可以繪制圖示來描繪代碼的動作.263.可以試著向別人介紹您在閱讀的代碼, 這樣做一般會增進您對代碼的理解.264.理解復雜的演算法或巧妙的數據結構, 要選擇一個安靜的環境, 然後聚精會神地考慮, 不要藉助於任何計算機化或自動化的幫助.+++++++++++++++++++++第十一章: 一個完整的例子+++++++++++++++++++++265.模仿軟體的功能時, 要依照相似實體的線路(類|函數|模