怎麼減少錯誤的發生

2021-08-31 08:42:32 字數 1383 閱讀 6287

錯誤,我們暫且僅對軟體開發而言。

錯誤的類別,暫且僅考慮介面錯誤實現錯誤

比如在一段公路入口有巨大的標識牌,上面寫著:前方道路,靠左行,紅燈行,綠燈停。這個大家可能覺得很荒謬,然而類似的事情在軟體開發裡面卻層出不窮,生產方認為自己已經在文件中清楚地說明了用法和用途,然而他卻沒有意識到這與使用方的常識和慣例背道而馳。舉個簡單的例子,c 標準庫裡面的兩個函式:

#include size_t fwrite(const void * ptr, size_t size, size_t count, file * stream); #include void qsort(void * base, size_t num, size_t size, int (* comparator)(const void *, const void *) );

我不知道有多少人用過這兩個函式,但是,大體上,應該是用 fwrite 的人多,而用 qsort 的人少。而用 fwrite 的人,大多數情況下,傳遞的 size 都等於 1,並且,一般情況下,size 和 count 搞反了也不會有啥大問題,除非判斷了返回值。然而,一旦用多了 fwrite,並且吧 objectsize, objectcount 這個順序當成了乙個常識,再使用 qsort 的時候,就悲劇了!

還有乙個例子:stl 的 range,一般表示為前閉後開的 [begin, end) 區間,如果你要搞乙個前開後閉的 (begin, end] 區間,大家都會瘋掉不可。我確實曾經被這樣的 (begin, end] 瘋掉過。

一般情況下,發生在版本相容問題上。我僅舉乙個簡單例子:在bash3.x中, 中的正規表示式會按bash的quoting removal 規則進行處理,也就是說對於一般的正規表示式,加單引號,雙引號,和不加引號,都沒有區別,然而到了bash4.x,如果加了引號,就悲劇了!bash4.x會把引號當成正規表示式的一部分!

最近我在擠地鐵時發現了另一類錯誤,看上去似乎不屬於這兩種:人很擠的時候,在地鐵樓梯上,經常發現,人們走的是左邊,而不是右邊,稍微用心一下,就會發現這是什麼原因——人們總是按貪心演算法走最短路徑,剛下地鐵的人,會走挨地鐵(車廂)的樓梯一側,而這一側正好是左邊,上面往下走的人,卻是走右邊。在**量不大的時候,這不是什麼問題,然而,當**洶湧時,造成的擁堵讓大家都很鬱悶。

怎麼解決這個問題呢?——那就是在設計地鐵站時,讓貪心演算法的最短路徑是右邊,而不是左邊。再general一點,就是:設計要遵守人們的思維習慣。

在程式設計上,如果我們設計的介面符合人的思維習慣,可以大大減少錯誤的發生。在 c 裡面,至少有兩處設計違反人的直覺,不過還好,這兩處早被 deprecate 了:

函式的預設返回值為 int,而非 void

f() 表示可接受任意個引數,返回值為 int 的函式。

一般情況下,就是指我們程式的邏輯錯誤

減少排序的發生

減少排序的發生 排序是資料庫中執行頻度比較大的一種操作,根據排序執行的範圍不同又可以分為內排序和外排序。我們希望資料庫中的排序操作的數量能夠被盡量的減少同時每個排序的時間能夠縮短。減少死鎖的發生 在oracle資料庫中大量的資料庫的鎖都是行級鎖,不同的會話間競爭同一條記錄的可能性較小,同時oracl...

Linux發生錯誤時怎麼產生core檔案

linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...

如何減少SQL Server死鎖發生的情況

死鎖是指在某組資源中,兩個或兩個以上的執行緒在執行過程中,在爭奪某一資源時而造成互相等待的現象,若無外力的作用下,它們都將無法推進下去,死時就可能會產生死鎖,這些永遠在互相等待的程序稱為死鎖執行緒。死鎖是指在某組資源中,兩個或兩個以上的執行緒在執行過程中,在爭奪某一資源時而造成互相等待的現象,若無外...