『壹』 各位程序員都有過哪些令人哭笑不得的改bug經歷
其實程序員確實也遇到過很多的這個因素,比如說他們要把一些軟體改的好用一點,要不然時間長了人多了以後就出現卡頓,不改的話就會讓這個用戶流失,所以說這些bug我覺得挺有趣的
『貳』 程序員如何讓自己的程序少出BUG(轉)
軟體測試心得
,而且還經常寫一些工作上的事,現在感覺自己老了似的,開始轉型了,會選擇寫一些總結而不是瑣碎,也許這是我以後當領導的徵兆吧。
程序員是善於思考的一個職業,做過這行的都知道,寫一個程序的過程都要經過構思、設計、寫代碼、測試到最後運行這幾個步驟。慢慢地,這個習慣也被搬到了生活中,現在我才覺得,我平時做事這么的冷靜善思考原來是工作影響的原因。
象我一樣,大多程序員都有一個毛病,或者說一個習慣,自己編寫過的代碼都不願意測試,他們憑著自己的習慣,理論上完成了代碼的編寫就認為自己的工作結束了,剩下的工作應該交給測試人員了。但實際上來講,如果代碼存在BUG,造成軟體在運行期出錯,那麼測試人員和客戶肯定會發現這些BUG的,再等到測試人員或者客戶把BUG反饋回來的時候代價就已經很大了,不僅僅是時間的浪費,更重要的還有1、影響了客戶對產品以及公司的信任度,2、影響了程序員自己的聲譽,3、影響了代碼的可讀性以及質量,4、增加 了DEBUG的難度,5、對程序員的心理造成一定的影響。
首先,程序員應該克服自己身上的一些缺點,這是很重要的一點,因為每個程序員都有自己的編程習慣,而且每個程序員對自己剛剛完成的程序都會信心百倍的說「絕對沒問題」,實際上這種想法很正常,因為每段代碼都是通過程序員認真謹慎的思考和設計之後才寫出來的,在設計時已經排除了很多問題,所以程序員不會將自己認為不正確的判斷寫到程序里,但這僅僅是理論上的想法,但人哪有不反錯的時候。其實程序員在讀其他人寫的程序的時候,就會很謹慎,仔細找到程序上的錯誤,但對自己的代碼就很難這樣做,如果把這種謹慎應用到自己的代碼上來,BUG會減少到最少。軟體工程所說的各階段工作想必大家都清楚,前期的設計以及需求分析才是一個軟體工程的重點,這里也是花費時間最多的地方,當對要寫的程序有了一個清晰的輪廓之後再動手編寫代碼。
第二,剛剛提到的前期設計,是指在編寫代碼之前所作的工作,這要求程序員對系統的整個結構以及邏輯有很清楚的理解,這也要求對系統的需求做到位。我沒有寫過文檔,所以這里不談文檔了。思路清晰很重要,但每個人並不能將系統的整個設計思路都記在腦袋裡,那最好就寫下來,特別是一些復雜的邏輯結構關系還有復雜的演算法。
第三,代碼的編寫,要盡量減少拼寫的錯誤,嚴禁使用關鍵字作為變數來使用,要盡量做到代碼模塊化,並且保證其正確性和可重復使用性。因為是模塊組成的,寫過之後可以將每個模塊部分單獨測試,因為代碼量少了質量自然提高了。對順序執行要求很高的函數盡量不採用調用子函數的方法,讓程序按順序走吧。
第四:代碼檢查以及系統功能測試,這是保證代碼質量的最後一步了,我們可以寫一些代碼模塊或者小工具來進行測試工作,跟蹤變數值的變化,使用一些小技巧在這個階段都是必要的,這里和測試人員的測試不同之處在於:仍然讓程序員的注意力放在其自己的代碼范圍內,減小了排錯的難度。
按照如上步驟來走的話,那麼我想你的系統應該足夠健壯了。
把對待別人代碼的態度放到自己的代碼上來,也就是反復的Review自己的代碼檢查邏輯錯誤也是相當好的辦法。別把自己辛苦寫的代碼看的很值錢,在團隊中盡量與別人分享、Review代碼這是實際工作的經驗。
作為一個優秀的程序員要具備這些習慣,看自己的代碼就象對待自己的一樣,愛惜、呵護是必須的,同時也要象園丁一樣及時修剪多於的樹枝來讓自己的代碼走正確的道路。
『叄』 應用程序錯誤怎樣解決
運行某些程序的時候,有時會出現內存錯誤的提示,然後該程序就關閉。
「0x????????」指令引用的「0x????????」內存。該內存不能為「read」。
「0x????????」指令引用的「0x????????」內存,該內存不能為「written」。
不知你出現過類似這樣的故障嗎?(0x後面內容有可能不一樣。)
一般出現這個現象有方面的,一是硬體,即內存方面有問題,二是軟體,這就有多方面的問題了。
下面先說說硬體:
一般來說,內存出現問題的可能性並不大,主要方面是:內存條壞了、內存質量有問題,還有就是2個不同牌子不同容量的內存混插,也比較容易出現不兼容的情況,同時還要注意散熱問題,特別是超頻後。你可以使用MemTest 這個軟體來檢測一下內存,它可以徹底的檢測出內存的穩定度。
假如你是雙內存,而且是不同品牌的內存條混插或者買了二手內存時,出現這個問題,這時,你就要檢查是不是內存出問題了或者和其它硬體不兼容。如果都沒有,那就從軟體方面排除故障了。
先簡單說說原理:內存有個存放數據的地方叫緩沖區,當程序把數據放在其一位置時,因為沒有足夠空間,就會發生溢出現象。舉個例子:一個桶子只能將一斤的水,當你放入兩斤的水進入時,就會溢出來。而系統則是在屏幕上表現出來。這個問題,經常出現在windows2000和XP系統上,Windows 2000/XP對硬體的要求是很苛刻的,一旦遇到資源死鎖、溢出或者類似Windows 98里的非法操作,系統為保持穩定,就會出現上述情況。另外也可能是硬體設備之間的兼容性不好造成的。
下面我從幾個例子給大家分析:
例一:打開IE瀏覽器或者沒過幾分鍾就會出現"0x70dcf39f"指令引用的"0x00000000"內存。該內存不能為「read」。要終止程序,請單擊「確定」的信息框,單擊「確定」後,又出現「發生內部錯誤,您正在使用的其中一個窗口即將關閉」的信息框,關閉該提示信息後,IE瀏覽器也被關閉。 解決方法:修復或升級IE瀏覽器,同時打上補丁。看過其中一個修復方法是,Win2000自升級,也就是Win2000升級到Win2000,其實這種方法也就是把系統還原到系統初始的狀態下。比如你的IE升級到了6.0,自升級後,會被IE5.0代替。
例二:在windows xp下雙擊光碟裡面的「AutoRun.exe」文件,顯示「0x77f745cc」指令引用的「0x00000078」內存。該內存不能為「written」,要終止程序,請單擊「確定」,而在Windows 98里運行卻正常。 解決方法:這可能是系統的兼容性問題,winXP的系統,右鍵「AutoRun.exe」文件,屬性,兼容性,把「用兼容模式運行這個程序」項選擇上,並選擇「Windows 98/Me」。win2000如果打了SP的補丁後,只要開始,運行,輸入:regsvr32 c:\\winnt\\apppatch\\slayerui.dll。右鍵,屬性,也會出現兼容性的選項。
例三:RealOne Gold關閉時出現錯誤,以前一直使用正常,最近卻在每次關閉時出現「0xffffffff」指令引用的「0xffffffff」內存。該內存不能為「read」 的提示。 解決方法:當使用的輸入法為微軟拼音輸入法2003,並且隱藏語言欄時(不隱藏時沒問題)關閉RealOne就會出現這個問題,因此在關閉RealOne之前可以顯示語言欄或者將任意其他輸入法作為當前輸入法來解決這個問題。
例四:我的豪傑超級解霸自從上網後就不能播放了,每次都提示「Ox060692f6」(每次變化)指令引用的「Oxff000011」內存不能為「read」,終止程序請按確定。 解決方法:試試重裝豪傑超級解霸,如果重裝後還會,到官方網站下載相應版本的補丁試試。還不行,只好換就用別的播放器試試了。
例五:雙擊一個游戲的快捷方式,「Ox77f5cdO」指令引用「Oxffffffff」內 存,該內存不能為「read」 ,並且提示Client.dat程序錯誤。 解決方法:重裝顯卡的最新驅動程序,然後下載並且安裝DirectX9.0。
例六:一個朋友發信息過來,我的電腦便出現了錯誤信息:「0*772b548f」指令引用的「0*00303033」內存,該內存不能為「written」,然後QQ自動下線,而再打開QQ,發現了他發過來的十幾條的信息。 解決方法:這是對方利用QQ的BUG,發送特殊的代碼,做QQ出錯,只要打上補丁或升級到最新版本,就沒事了。
通過上面的幾個例子,可以看到,出現故障的原因有好多種,在這里把已經提到和有可能發生的原因列個表,方便查閱。
解決方法
1、內存條壞了更換內存條
2、雙內存不兼容使用同品牌的內存或只用一條內存
3、內存質量問題更換內存條
4、散熱問題加強機箱內部的散熱
5、內存和主板沒插好或和其它硬體不兼容等重插內存或換個插糟
6、硬碟有問題更換硬碟
7、驅動問題重裝驅動。如果是新系統,要先安裝主板驅動
8、軟體損壞重裝軟體
9、軟體有BUG打補丁或用最新的版本。
10、軟體和系統不兼容給軟體打上補丁或者試試系統的兼容模式
11、軟體和軟體之間有沖突如果最近安裝了什麼新軟體,卸載了試試
12、軟體要使用到其它相關的軟體有問題重裝相關軟體。比如播放某一格式的文件時出錯,可能是這個文件的解碼器有問題
13、病毒問題殺毒
14、殺毒軟體與系統或軟體沖突由於殺毒軟體是進入底層監控系統的,可能與一些軟體沖突,卸載了試試
15、系統本身有問題有時候操作系統本身也會有BUG,要注意安裝官方發行的升級程序,像SP的補丁,最好要打上。如果還不行重裝系統或更換其它版本的系統了。
使用Windows出現藍色屏幕是經常的事,而且每每因為不清楚錯誤的來源而頻繁重新安裝系統,勞神費時。下列收集了一些windows死機密碼,供大家參考。
數值 敘述
0 0x0000 作業完成。
1 0x0001 不正確的函數。
2 0x0002 系統找不到指定的檔案。
3 0x0003 系統找不到指定的路徑。
4 0x0004 系統無法開啟檔案。
5 0x0005 拒絕存取。
6 0x0006 無效的代碼。
7 0x0007 儲存體控制區塊已毀。
8 0x0008 儲存體空間不足,無法處理這個指令。
9 0x0009 儲存體控制區塊位址無效。
10 0x000a 環境不正確。
11 0x000b 嘗試載入一個格式錯誤的程式。
12 0x000c 存取碼錯誤。
13 0x000d 資料錯誤。
14 0x000e 儲存體空間不夠,無法完成這項作業。
15 0x000f 系統找不到指定的磁碟機。
16 0x0010 無法移除目錄。
17 0x0011 系統無法將檔案移到 其他的磁碟機。
18 0x0012 沒有任何檔案。
19 0x0013 儲存媒體為防寫狀態。
20 0x0014 系統找不到指定的裝置。
21 0x0015 裝置尚未就緒。
22 0x0016 裝置無法識別指令。
23 0x0017 資料錯誤 (cyclic rendancy check)
24 0x0018 程式發出一個長 度錯誤的指令。
25 0x0019 磁碟機在磁碟找不到 持定的磁區或磁軌。
26 0x001a 指定的磁碟或磁片無法存取。
27 0x001b 磁碟機找不到要求的磁區。
28 0x001c 印表機沒有紙。
29 0x001d 系統無法將資料寫入指定的磁碟機。
30 0x001e 系統無法讀取指定的裝置。
31 0x001f 連接到系統的某個裝置沒有作用。
32 0x0020 the process cannot access the file because it is being used by another process.
33 0x0021 檔案的一部份被鎖定, 現在無法存取。
34 0x0022 磁碟機的磁片不正確。 請將 %2 (volume serial number: %3) 插入磁碟機 %1。
36 0x0024 開啟的分享檔案數量太多。
38 0x0026 到達檔案結尾。
39 0x0027 磁碟已滿。
50 0x0032 不支援這種網路要求。
51 0x0033 遠端電腦無法使用。
52 0x0034 網路名稱重復。
53 0x0035 網路路徑找不到。
54 0x0036 網路忙碌中。
55 0x0037 the specified network resource or device is no longer available.
56 0x0038 the network bios command limit has been reached.
57 0x0039 網路配接卡發生問題。
58 0x003a 指定的伺服器無法執行要求的作業。
59 0x003b 網路發生意外錯誤。
60 0x003c 遠端配接卡不相容。
61 0x003d 印表機佇列已滿。
62 0x003e 伺服器的空間無法儲存等候列印的檔案。
63 0x003f 等候列印的檔案已經刪除。
64 0x0040 指定的網路名稱無法使用。
65 0x0041 拒絕存取網路。
66 0x0042 網路資源類型錯誤。
67 0x0043 網路名稱找不到。
68 0x0044 超過區域電腦網路配接卡的名稱限制。
69 0x0045 超過網路 bios 作業階段的限制。
70 0x0046 遠端伺服器已經暫停或者正在起始中。
71 0x0047 由於連線數目已達上限,此時無法再連線到這台遠端電腦。
72 0x0048 指定的印表機或磁碟裝置已經暫停作用。
80 0x0050 檔案已經存在。
82 0x0052 無法建立目錄或檔案。
83 0x0053 int 24 失敗
84 0x0054 處理這項要求的儲存體無法使用。
85 0x0055 近端裝置名稱已經在使用中。
86 0x0056 指定的網路密碼錯誤。
87 0x0057 參數錯誤。
88 0x0058 網路發生資料寫入錯誤。
89 0x0059 此時系統無法執行其他行程。
100 0x0064 無法建立其他的系統 semaphore。
101 0x0065 屬於其他行程專用的 semaphore 。
102 0x0066 semaphore 已經設定,而且無法關閉。
103 0x0067 無法指定 semaphore 。
104 0x0068 在岔斷時間無法要求專用的 semaphore 。
105 0x0069 此 semaphore 先前的擁有權已經結束。
106 0x006a 請將磁片插入 %1。
107 0x006b 因為代用的磁片尚未插入,所以程式已經停止。
108 0x006c 磁碟正在使用中或被鎖定。
109 0x006d pipe 已經中止。
110 0x006e 系統無法開啟指定的 裝置或檔案。
111 0x006f 檔名太長。
112 0x0070 磁碟空間不足。
113 0x0071 沒有可用的內部檔案識別字。
114 0x0072 目標內部檔案識別字不正確。
117 0x0075 由應用程式所執行的 ioctl 呼叫 不正確。
118 0x0076 寫入驗證參數值不正確。
119 0x0077 系統不支援所要求的指令。
120 0x0078 此項功能僅在 win32 模式有效。
121 0x0079 semaphore 超過逾時期間。
122 0x007a 傳到系統呼叫的資料區域 太小。
123 0x007b 檔名、目錄名稱或儲存體標簽語法錯誤。
124 0x007c 系統呼叫層次不正確。
125 0x007d 磁碟沒有設定標簽。
126 0x007e 找不到指定的模組。
127 0x007f 找不到指定的程序。
128 0x0080 沒有子行程可供等待。
129 0x0081 %1 這個應用程式無法在 win32 模式下執行。
130 0x0082 attempt to use a file handle to an open disk partition for an
operation other than raw disk i/o.
131 0x0083 嘗試將檔案指標移至檔案開頭之前。
132 0x0084 無法在指定的裝置或檔案,設定檔案指標。
133 0x0085 join 或 subst 指令 無法用於 內含事先結合過的磁碟機。
134 0x0086 嘗試在已經結合的磁碟機,使用 join 或 subst 指令。
135 0x0087 嘗試在已經替換的磁碟機,使 用 join 或 subst 指令。
136 0x0088 系統嘗試刪除 未連結過的磁碟機的連結關系。
137 0x0089 系統嘗試刪除 未替換過的磁碟機的替換關系。
138 0x008a 系統嘗試將磁碟機結合到已經結合過之磁碟機的目錄。
139 0x008b 系統嘗試將磁碟機替換成已經替換過之磁碟機的目錄。
140 0x008c 系統嘗試將磁碟機替換成已經替換過之磁碟機的目錄。
141 0x008d 系統嘗試將磁碟機 subst 成已結合的磁碟機 目錄。
142 0x008e 系統此刻無法執行 join 或 subst。
143 0x008f 系統無法將磁碟機結合或替換同一磁碟機下目錄。
144 0x0090 這個目錄不是根目錄的子目錄。
145 0x0091 目錄仍有資料。
146 0x0092 指定的路徑已經被替換過。
147 0x0093 資源不足,無法處理這項 指令。
148 0x0094 指定的路徑這時候無法使用。
149 0x0095 嘗試要結合或替換的磁碟機目錄,是已經替換過的的目標。
150 0x0096 config.sys 檔未指定系統追蹤資訊,或是追蹤功能被取消。
151 0x0097 指定的 semaphore事件 dosmuxsemwait 數目不正確。
152 0x0098 dosmuxsemwait 沒有執行;設定太多的 semaphore。
153 0x0099 dosmuxsemwait 清單不正確。
154 0x009a 您所輸入的儲存媒體標 元長度限制。
155 0x009b 無法建立其他的執行緒。
156 0x009c 接收行程拒絕接受信號。
157 0x009d 區段已經被舍棄,無法被鎖定。
158 0x009e 區段已經解除鎖定。
159 0x009f 執行緒識別碼的位址不正確。
160 0x00a0 傳到 dosexecpgm 的引數字串不正確。
161 0x00a1 指定的路徑不正確。
162 0x00a2 信號等候處理。
164 0x00a4 系統無法建立執行緒。
167 0x00a7 無法鎖定檔案的部份范圍。
170 0x00aa 所要求的資源正在使用中。
173 0x00ad 取消范圍的鎖定要求不明顯。
174 0x00ae 檔案系統不支援自動變更鎖定類型。
180 0x00b4 系統發現不正確的區段號碼。
182 0x00b6 作業系統無法執行 %1。
183 0x00b7 檔案已存在,無法建立同一檔案。
186 0x00ba 傳送的旗號錯誤。
187 0x00bb 指定的系統旗號找不到。
188 0x00bc 作業系統無法執行 %1。
189 0x00bd 作業系統無法執行 %1。
190 0x00be 作業系統無法執行 %1。
191 0x00bf 無法在 win32 模式下執行 %1。
192 0x00c0 作業系統無法執行 %1。
193 0x00c1 %1 不是正確的 win32 應用程式。
194 0x00c2 作業系統無法執行 %1。
195 0x00c3 作業系統無法執行 %1。
196 0x00c4 作業系統無法執行 這個應用程式。
197 0x00c5 作業系統目前無法執行 這個應用程式。
198 0x00c6 作業系統無法執行 %1。
199 0x00c7 作業系統無法執行 這個應用程式。
200 0x00c8 程式碼的區段不可以大於或等於 64kb。
201 0x00c9 作業系統無法執行 %1。
202 0x00ca 作業系統無法執行 %1。
203 0x00cb 系統找不到輸入的環境選項。 \r
205 0x00cd 在指令子目錄下,沒有任何行程有信號副處理程式。
206 0x00ce 檔案名稱或副檔名太長。
207 0x00cf ring 2 堆疊使用中。
回答者: 我思故我問 - 高級經理 六級 12-9 01:24
修改答復: 我思故我問,您要修改的答復如下: 積分規則 關閉
該內存不能read written常見原因
使用Windows操作系統的人有時會遇到這樣的錯誤信息:「0X????????指令引用的0x00000000內存,該內存不能written」,然後應用程序被關閉。如果去請教一些「高手」,得到的回答往往是「Windows就是這樣不穩定」之類的義憤和不屑。其實,這個錯誤並不一定是Windows不穩定造成的。本文就來簡單分析這種錯誤的常見原因。
一、應用程序沒有檢查內存分配失敗
程序需要一塊內存用以保存數據時,就需要調用操作系統提供的「功能函數」來申請,如果內存分配成功,函數就會將所新開辟的內存區地址返回給應用程序,應用程序就可以通過這個地址使用這塊內存。這就是「動態內存分配」,內存地址也就是編程中的「指針」。
內存不是永遠都招之即來、用之不盡的,有時候內存分配也會失敗。當分配失敗時系統函數會返回一個0值,這時返回值「0」已不表示新啟用的指針,而是系統向應用程序發出的一個通知,告知出現了錯誤。作為應用程序,在每一次申請內存後都應該檢查返回值是否為0,如果是,則意味著出現了故障,應該採取一些措施挽救,這就增強了程序的「健壯性」。
若應用程序沒有檢查這個錯誤,它就會按照「思維慣性」認為這個值是給它分配的可用指針,繼續在之後的運行中使用這塊內存。真正的0地址內存區保存的是計算機系統中最重要的「中斷描述符表」,絕對不允許應用程序使用。在沒有保護機制的操作系統下(如DOS),寫數據到這個地址會導致立即死機,而在健壯的操作系統中,如Windows等,這個操作會馬上被系統的保護機制捕獲,其結果就是由操作系統強行關閉出錯的應用程序,以防止其錯誤擴大。這時候,就會出現上述的「寫內存」錯誤,並指出被引用的內存地址為「0x00000000」。
內存分配失敗故障的原因很多,內存不夠、系統函數的版本不匹配等都可能有影響。因此,這種分配失敗多見於操作系統使用很長時間後,安裝了多種應用程序(包括無意中「安裝」的病毒程序),更改了大量的系統參數和系統文件之後。
二、應用程序由於自身BUG引用了不正常的內存指針
在使用動態分配的應用程序中,有時會有這樣的情況出現:程序試圖讀寫一塊「應該可用」的內存,但不知為什麼,這個預料中可用的指針已經失效了。有可能是「忘記了」向操作系統要求分配,也可能是程序自己在某個時候已經注銷了這塊內存而「沒有留意」等等。注銷了的內存被系統回收,其訪問權已經不屬於該應用程序,因此讀寫操作也同樣會觸發系統的保護機制,企圖「違法」的程序唯一的下場就是被操作終止運行,回收全部資源。計算機世界的法律還是要比人類有效和嚴厲得多啊! 像這樣的情況都屬於程序自身的BUG,你往往可在特定的操作順序下重現錯誤。無效指針不一定總是0,因此錯誤提示中的內存地址也不一定為「0x00000000」,而是其他隨機數字。
如果系統經常有所提到的錯誤提示,下面的建議可能會有幫助:
1.查看系統中是否有木馬或病毒。這類程序為了控制系統往往不負責任地修改系統,從而導致操作系統異常。平常應加強信息安全意識,對來源不明的可執行程序絕不好奇。
2.更新操作系統,讓操作系統的安裝程序重新拷貝正確版本的系統文件、修正系統參數。有時候操作系統本身也會有BUG,要注意安裝官方發行的升級程序。
3.試用新版本的應用程序。
『肆』 優秀的程序員是如何處理技術 Bug 的
從初入職場菜鳥到職場大咖,很多程序員在努力充實自己,有時候我們需要對自己進行一次能力定位,了解自己的優勢和沒有掌握的技術。芯學苑列出幾點作為初入職場的新手評估自己,明了前進學習的方向。
1、技術能力(解決問題的能力)
這是非常重要的事;過硬的技術能讓你得到面試機會,並在工作中游刃有餘。當公司招聘一個Java開發人員時,是會優先考慮能力因素的。在實際的項目開發中,一個程序員的技術能力等於其解決問題的能力。
如果拿一個尺度來衡量這個能力的話,一個程序員的能力可以用能完成任務的數量和難度來衡量。一個程序員能基本無誤的完成項目中的一個功能算是合格,但在此之前,他對項目的生產力為負,為他布置的任務,中間環節的溝通,修補bug的時間其實要多於自己直接完成該功能的時間的。能較好完成一個完整模塊的程序員才算是較好的程序員,也是項目中的主要開發者。能獨立完成整個項目才是優秀的程序員。
2、專業基礎(知識的積累)
一個程序員的知識積累很大程度上決定了其解決問題的能力。知道如何編寫代碼是基本的技能,但是知道Java編程語言的原理,知道代碼背後的演算法將使你從人群中脫穎而出。
3、主流編程工具
今天,事實是,你不能成為一個樣樣都懂的人(雜而不精)。你必須選擇你要掌握的工具。有時這是由工作的環境決定的,但是按照下面說的去做也是一個很好的選擇:
構建工具:Maven或Gradle。
SCM:Git(不是GitHub。大不相同)。
構建自動化:Jenkins。
IDE:Netbeans或Eclipse——不僅用於編寫代碼,而且還從IDE中重構和調試代碼。我遇到了很多沒有如何從他們最喜歡的IDE調試的開發人員。
Bug跟蹤:Bugzilla或Jira。
4、JSF的知識
應用程序伺服器
所有Java開發人員應該知道如何在Apache Tomcat中部署。
當Glassfish開發停止時,下一個最好的事情是J Boss Wild Fly。
5、溝通的能力
溝通是我們做好一切事情的關鍵。我們必須與我們周圍的環境保持互動,無論是在我們的私人還是職業生活中。一個良好的程序員知道如何在各種團體面表達自己。也許對你來說顯而易見的東西在他人的角度來看並非如此。
從大的尺度(比如一個人的工作生涯)來看,一個程序員知識積累的多少只決定於其自學能力和他對編程本身的興趣。
在一個分工明確的項目中,程序員需要理解產品,和領導溝通理解自己的任務,和同事們溝通以正確的方式進行合作。無論哪一個方面溝通出了問題都不是小事情,同時,程序員還需要正確的傳達設計的實現難度,以及讓別人正確的理解自己設計模塊的介面。在不寫文檔時,正確的口頭溝通非常重要,需要寫文檔時,良好的編輯能力也算做是溝通能力的一部分。
6、自學能力
這是一個非常重要的技能,在你自己的空閑時間學習新的技能。不要等待公司為你提供培訓。你需要自己去學習新技術,提升自己在相關領域的水平。從Java後端開發到架構模式,總是有一些新事物值得學習。經常閱讀博客和論壇,嘗試加入本地聚會小組。你學到的東西可以幫助你的事業。知識刷新頻率極快讓人無法追趕的這個時代,難免會有超出自己知識范圍的時候,此時你的自學能力決定了你能多快的完成任務。
7、良好的團隊合作精神
無論是部分編程還是大型項目,所有開發人員都是作為團隊的一部分在協同工作。你需要致力於團隊的目的,或幫助新的團隊成員克服障礙。不要存在這種「我只要做好我的本職工作,下班就直接回家」的態度。成為團隊的一部分,幫助周圍的同事,對自己的能力也是不小的提升。
就像拿破崙說的不想當元帥的士兵不是好士兵,追求參與一個大型軟體系統的開發,是每個程序員的夢想。在此之前,應該學習更多的專業知識,達到優秀程序師的標准。最後希望各位程序員閱讀本文後能夠得到一些裨益,在這條路上走得更好。
『伍』 如何有效地報告 Bug
然而並不是所有的bug報告都令人生厭:我在業余時間維護自由軟體,有時我會收到非常清晰、有幫助並且「有內容」的bug報告。在這里我會盡力闡明如何寫一個好的bug報告。我非常希望每一個人在報告bug之前都讀一下這篇短文,當然我也希望用戶在給我報告bug之前已經讀過這篇文章。簡單地說,報告bug的目的是為了讓程序員看到程序的錯誤。您可以親自示範,也可以給出能導致程序出錯的、詳盡的操作步驟。如果程序出錯了,程序員會收集額外的信息直到找到錯誤的原因;如果程序沒有出錯,那麼他們會請您繼續關注這個問題,收集相關的信息。在bug報告里,要設法搞清什麼是事實(例如:「我在電腦旁」和「XX出現了」)什麼是推測(例如:「我想問題可能是出在……」)。如果願意的話,您可以省去推測,但是千萬別省略事實。當您報告bug的時候(既然您已經這么做了),一定是希望bug得到及時修正。所以此時針對程序員的任何過激或褻瀆的言語(甚至謾罵)都是與事無補的——因為這可能是程序員的錯誤,也有可能是您的錯誤,也許您有權對他們發火,但是如果您能多提供一些有用的信息(而不是激憤之詞)或許bug會被更快的修正。除此以外,請記住:如果是免費軟體,作者提供給我們已經是出於好心,所以要是太多的人對他們無禮,他們可能就要「收起」這份好心了。「程序不好用」程序員不是弱智:如果程序一點都不好用,他們不可能不知道。他們不知道一定是因為程序在他們看來工作得很正常。所以,或者是您作過一些與他們不同的操作,或者是您的環境與他們不同。他們需要信息,報告bug也是為了提供信息。信息總是越多越好。許多程序,特別是自由軟體,會公布一個「已知bug列表」。如果您找到的bug在列表裡已經有了,那就不必再報告了,但是如果您認為自己掌握的信息比列表中的豐富,那無論如何也要與程序員聯系。您提供的信息可能會使他們更簡單地修復bug。本文中提到的都是一些指導方針,沒有哪一條是必須恪守的准則。不同的程序員會喜歡不同形式的bug報告。如果程序附帶了一套報告bug的准則,一定要讀。如果它與本文中提到的規則相抵觸,那麼請以它為准。如果您不是報告bug,而是尋求幫助,您應該說明您曾經到哪裡找過答案,(例如:我看了第四章和第五章的第二節,但我找不到解決的辦法。)這會使程序員了解用戶喜歡到哪裡去找答案,從而使程序員把幫助文檔做得更容易使用。「演示給我看」報告bug的最好的方法之一是「演示」給程序員看。讓程序員站在電腦前,運行他們的程序,指出程序的錯誤。讓他們看著您啟動電腦、運行程序、如何進行操作以及程序對您的輸入有何反應。他們對自己寫的軟體了如指掌,他們知道哪些地方不會出問題,而哪些地方最可能出問題。他們本能地知道應該注意什麼。在程序真的出錯之前,他們可能已經注意到某些地方不對勁,這些都會給他們一些線索。他們會觀察程序測試中的每一個細節,並且選出他們認為有用的信息。這些可能還不夠。也許他們覺得還需要更多的信息,會請您重復剛才的操作。他們可能在這期間需要與您交流一下,以便在他們需要的時候讓bug重新出現。他們可能會改變一些操作,看看這個錯誤的產生是個別問題還是相關的一類問題。如果您不走運,他們可能需要坐下來,拿出一堆開發工具,花上幾個小時來好好地研究一下。但是最重要的是在程序出錯的時候讓程序員在電腦旁。一旦他們看到了問題,他們通常會找到原因並開始試著修改。「告訴我該怎麼做」如今是網路時代,是信息交流的時代。我可以點一下滑鼠把自己的程序送到俄羅斯的某個朋友那裡,當然他也可以用同樣簡單的方法給我一些建議。但是如果我的程序出了什麼問題,我不可能在他旁邊。「演示」是很好的辦法,但是常常做不到。如果您必須報告bug,而此時程序員又不在您身邊,那麼您就要想辦法讓bug重現在他們面前。當他們親眼看到錯誤時,就能夠進行處理了。確切地告訴程序員您做了些什麼。如果是一個圖形界面程序,告訴他們您按了哪個按鈕,依照什麼順序按的。如果是一個命令行程序,精確的告訴他們您鍵入了什麼命令。您應該盡可能詳細地提供您所鍵入的命令和程序的反應。把您能想到的所有的輸入方式都告訴程序員,如果程序要讀取一個文件,您可能需要發一個文件的拷貝給他們。如果程序需要通過網路與另一台電腦通訊,您或許不能把那台電腦復制過去,但至少可以說一下電腦的類型和安裝了哪些軟體(如果可以的話)。「哪兒出錯了?在我看來一切正常哦!」如果您給了程序員一長串輸入和指令,他們執行以後沒有出現錯誤,那是因為您沒有給他們足夠的信息,可能錯誤不是在每台計算機上都出現,您的系統可能和他們的在某些地方不一樣。有時候程序的行為可能和您預想的不一樣,這也許是誤會,但是您會認為程序出錯了,程序員卻認為這是對的。同樣也要描述發生了什麼。精確的描述您看到了什麼。告訴他們為什麼您覺得自己所看到的是錯誤的,最好再告訴他們,您認為自己應該看到什麼。如果您只是說:「程序出錯了」,那您很可能漏掉了非常重要的信息。如果您看到了錯誤消息,一定要仔細、准確的告訴程序員,這確實很重要。在這種情況下,程序員只要修正錯誤,而不用去找錯誤。他們需要知道是什麼出問題了,系統所報的錯誤消息正好幫助了他們。如果您沒有更好的方法記住這些消息,就把它們寫下來。只報告「程序出了一個錯」是毫無意義的,除非您把錯誤消息一塊報上來。特殊情況下,如果有錯誤消息號,一定要把這些號碼告訴程序員。不要以為您看不出任何意義,它就沒有意義。錯誤消息號包含了能被程序員讀懂的各種信息,並且很有可能包含重要的線索。給錯誤消息編號是因為用語言描述計算機錯誤常常令人費解。用這種方式告訴您錯誤的所在是一個最好的辦法。在這種情形下,程序員的排錯工作會十分高效。他們不知道發生了什麼,也不可能到現場去觀察,所以他們一直在搜尋有價值的線索。錯誤消息、錯誤消息號以及一些莫名其妙的延遲,都是很重要的線索,就像辦案時的指紋一樣重要,保存好。如果您使用UNIX系統,程序可能會產生一個內核輸出(coremp)。內核輸出是特別有用的線索來源,別扔了它們。另一方面,大多數程序員不喜歡收到含有大量內核輸出文件的EMAIL,所以在發郵件之前最好先問一下。還有一點要注意:內核輸出文件記錄了完整的程序狀態,也就是說任何秘密(可能當時程序正在處理一些私人信息或秘密數據)都可能包含在內核輸出文件里。「出了問題之後,我做了……」當一個錯誤或bug發生的時候,您可能會做許多事情。但是大多數人會使事情變的更糟。我的一個朋友在學校里誤刪了她所有的Word文件,在找人幫忙之前她重裝了Word,又運行了一遍碎片整理程序,這些操作對於恢復文件是毫無益處的,因為這些操作搞亂了磁碟的文件區塊。恐怕在這個世界上沒有一種反刪除軟體能恢復她的文件了。如果她不做任何操作,或許還有一線希望。這種用戶彷彿一隻被逼到牆角的鼬(黃鼠狼、紫貂一類的動物——譯者注):背靠牆壁,面對死亡的降臨奮起反撲,瘋狂攻擊。他們認為做點什麼總比什麼都不做強。然而這些在處理計算機軟體問題時並不適用。 不要做鼬,做一隻羚羊。當一隻羚羊面對料想不到的情況或受到驚嚇時,它會一動不動,是為了不吸引任何注意,與此同時也在思考解決問題的最好辦法(如果羚羊有一條技術支持熱線,此時占線。)。然後,一旦它找到了最安全的行動方案,它便去做。當程序出毛病的時候,立刻停止正在做的任何操作。不要按任何健。仔細地看一下屏幕,注意那些不正常的地方,記住它或者寫下來。然後慎重地點擊「確定」 或「取消」,選擇一個最安全的。學著養成一種條件反射——一旦電腦出了問題,先不要動。要想擺脫這個問題,關掉受影響的程序或者重新啟動計算機都不好,一個解決問題的好辦法是讓問題再次產生。程序員們喜歡可以被重現的問題,快樂的程序員可以更快而且更有效率的修復bug。「我想粒子的躍遷與錯誤的極化有關」並不只是非專業的用戶才會寫出拙劣的bug報告,我見過一些非常差的bug報告出自程序員之手,有些還是非常優秀的程序員。有一次我與另一個程序員一起工作,他一直在找代碼中的bug,他常常遇到一個bug,但是不會解決,於是就叫我幫忙。「出什麼毛病了?」我問。而他的回答卻總是一些關於bug的意見。如果他的觀點正確,那的確是一件好事。這意味著他已經完成了工作的一半,並且我們可以一起完成另一半工作。這是有效率並有用的。但事實上他常常是錯的。這就會使我們花上半個小時在原本正確的代碼里來回尋找錯誤,而實際上問題出在別的地方。我敢肯定他不會對醫生這么做。「大夫,我得了Hydroyoyodyne(真是怪病——譯者),給我開個方子」,人們知道不該對一位醫生說這些。您描述一下症狀,哪個地方不舒服,哪裡疼、起皮疹、發燒……讓醫生診斷您得了什麼病,應該怎樣治療。否則醫生會把您當做疑心病或精神病患者打發了,這似乎沒什麼不對。做程序員也是一樣。即便您自己的「診斷」有時真的有幫助,也要只說「症狀」。「診斷」是可說可不說的,但是「症狀」一定要說。同樣,在bug報告裡面附上一份針對bug而做出修改的源代碼是有用處的,但它並不能替代bug報告本身。如果程序員向您詢問額外的信息,千萬別應付。曾經有一個人向我報告bug,我讓他試一個命令,我知道這個命令不好用,但我是要看看程序會返回一個什麼錯誤(這是很重要的線索)。但是這位老兄根本就沒試,他在回復中說「那肯定不好用」,於是我又花了好些時間才說服他試了一下那個命令。用戶多動動腦筋對程序員的工作是有幫助的。即使您的推斷是錯誤的,程序員也應該感謝您,至少您想去幫助他們,使他們的工作變的更簡單。不過千萬別忘了報告「症狀」,否則只會使事情變得更糟。「真是奇怪,剛才還不好用,怎麼現在又好了?」「間歇性錯誤」著實讓程序員發愁。相比之下,進行一系列簡單的操作便能導致錯誤發生的問題是簡單的。程序員可以在一個便於觀察的條件下重復那些操作,觀察每一個細節。太多的問題在這種情況下不能解決,例如:程序每星期出一次錯,或者偶然出一次錯,或者在程序員面前從不出錯(程序員一離開就出錯。——譯者)。當然還有就是程序的截止日期到了,那肯定要出錯。大多數「間歇性錯誤」並不是真正的「間歇」。其中的大多數錯誤與某些地方是有聯系的。有一些錯誤可能是內存泄漏產生的,有一些可能是別的程序在不恰當的時候修改某個重要文件造成的,還有一些可能發生在每一個小時的前半個小時中(我確實遇到過這種事情)。同樣,如果您能使bug重現,而程序員不能,那很有可能是他們的計算機和您的計算機在某些地方是不同的,這種不同引起了問題。我曾寫過一個程序,它的窗口可以蜷縮成一個小球呆在屏幕的左上角,它在別的計算機上只能在 800x600 的解析度工作,但是在我的機器上卻可以在 1024x768 下工作。程序員想要了解任何與您發現的問題相關的事情。有可能的話您到另一台機器上試試,多試幾次,兩次,三次,看看問題是不是經常發生。如果問題出現在您進行了一系列操作之後,不是您想讓它出現它就會出現,這就有可能是長時間的運行或處理大文件所導致的錯誤。程序崩潰的時候,您要盡可能的記住您都做了些什麼,並且如果您看到任何圖形,也別忘了提一下。您提供的任何事情都是有幫助的。即使只是概括性的描述(例如:當後台有EMACS運行時,程序常常出錯),這雖然不能提供導致問題的直接線索,但是可能幫助程序員重現問題。最重要的是:程序員想要確定他們正在處理的是一個真正的「間歇性錯誤」呢,還是一個在另一類特定的計算機上才出現的錯誤。他們想知道有關您計算機的許多細節,以便了解您的機器與他們的有什麼不同。有許多細節都依仗特定的程序,但是有一件東西您一定要提供——版本號。程序的版本、操作系統的版本以及與問題有關的程序的版本。「我把磁碟裝進了 Windows……」表意清楚在一份bug報告里是最基本的要求。如果程序員不知道您說的是什麼意思,那您就跟沒說一樣。我收到的bug報告來自世界各地,有許多是來自非英語國家,他們通常為自己的英文不好而表示歉意。總的來說,這些用戶發來的bug報告通常是清晰而且有用的。幾乎所有不清晰的bug報告都是來自母語是英語的人,他們總是以為只要自己隨便說說,程序員就能明白。精確。如果做相同的事情有兩種方法,請說明您用的是哪一種。例如:「我選擇了『載入』」,可能意味著「我用滑鼠點擊『載入』」或「我按下了『ALT+L』」,說清楚您用了哪種方法,有時候這也有關系。詳細。信息寧多毋少!如果您說了很多,程序員可以略去一部分,可是如果您說的太少,他們就不得不回過頭再去問您一些問題。有一次我收到了一份bug報告只有一句話,每一次我問他更多事情時,他每次的回復都是一句話,於是我花了幾個星期的時間才得到了有用的信息。慎用代詞。諸如「它」,「窗體」這些詞,當它們指代不清晰的時候不要用。來看看這句話:「我運行了FooApp,它彈出一個警告窗口,我試著關掉它,它就崩潰了。」這種表述並不清晰,用戶究竟關掉了哪個窗口?是警告窗口還是整個FooApp程序?您可以這樣說,「我運行FooApp程序時彈出一個警告窗口,我試著關閉警告窗口,FooApp崩潰了。」這樣雖然羅嗦點,但是很清晰不容易產生誤解。檢查。重新讀一遍您寫的bug報告,您覺得它是否清晰?如果您列出了一系列能導致程序出錯的操作,那麼照著做一遍,看看您是不是漏寫了一步。小結:bug報告的首要目的是讓程序員親眼看到錯誤。如果您不能親自做給他們看,給他們能使程序出錯的詳細的操作步驟。如果首要目的不能達成,程序員不能看到程序出錯。這就需要bug報告的第二個目的來描述程序的什麼地方出毛病了。詳細的描述每一件事情:您看到了什麼,您想看到什麼,把錯誤消息記下來,尤其是「錯誤消息號」。當您的計算機做了什麼您料想不到的事,不要動!在您平靜下來之前什麼都別做。不要做您認為不安全的事。盡量試著自己「診斷」程序出錯的原因(如果您認為自己可以的話)。即使做出了「診斷」,您仍然應該報告「症狀」。如果程序員需要,請准備好額外的信息。如果他們不需要,就不會問您要。他們不會故意為難自己。您手頭上一定要有程序的版本號,它很可能是必需品。表述清楚,確保您的意思不能被曲解。總的來說,最重要的是要做到精確。程序員喜歡精確。聲明:我從沒有真的看見過鼬和羚羊,我的比喻可能不恰當。
『陸』 為什麼總有無數的Bug困擾著程序員 – 碼農網
下面就是為什麼我們的軟體之所以依然充滿漏洞的5大原因:
1.人的天性
大多數——當然不是全部——軟體bug源於我們自己犯的錯誤。雖然有些是因為軟體編碼工具和編譯器發生了意外,但是大部分的錯誤得歸咎於我們自己。
無論我們受到的SDL培訓和安全工具有多麼強大,只要我們還是人,我們就會犯錯。如果你想問為什麼電腦軟體會有這么多的漏洞,歸根到底是因為,人的天性就是容易犯錯。
也就是說,我們在減少人為錯誤方面做得還不夠。有很多程序員因為沒有受到足夠的SDL培訓(有的甚至乾脆就沒有培訓),所以根本就沒有安全編程的理念。有時候我特別奇怪:有那麼多的程序員以寫安全軟體為生,卻居然不懂如何安全地編程。別不信,我敢打賭,你正在運行的銀行安全軟體中的bug不會比它能提供的保護措施少,搞不好甚至更多。
但是即使是那些經過嚴格訓練的程序員還是不可避免出現bug。舉個例子,前不久有個自鳴得意的傢伙發明的使用HTML標記欄位確定顏色的緩沖區在瀏覽器中溢出了。不像以前還要輸入FFFFFh之類的東西,黑客甚至可以直接執行顏色域的代碼,從而導致瀏覽器過度消耗資源、緩沖區溢出。看到沒有,這就是漏洞!而且很少會有人能預料到這種情況。
2.不斷增加的軟體復雜性
就其本質而言,軟體越復雜,就意味著代碼行數越多。只要你在編程,那麼即使你有多擅長寫代碼,也一定會有錯誤和bug出現。有人曾說,如果你能做到每50行代碼中只出現一個錯誤,那你就已經做得相當好了。大多數程序員差不多每隔5至15行就會犯錯。想像一下,這么說吧,一般性的Linux內核擁有超過1500萬行的代碼,有多少bug你自己算吧!
即使沒有編碼錯誤,互聯網時代應用程序的整體互動性也是漏洞被攻擊的途徑。大多數程序員不得不和其他API協作,保存和檢索文件,在多種設備上正常工作。所有這些過程都會增加被成功擊破的概率。
而要防守的話,則需要寫更多的代碼,因為得抵禦各種不同的攻擊渠道。這么說吧,如果有一個只有30條匯編語言指令的惡意程序,那麼針對相應的防守,你可能至少得寫50000條匯編語言指令!
3.Fuzzers也是人寫出來的
新近冒出來的Fuzzers軟體主要用於掃描軟體漏洞。Fuzzers——以及其他用於尋找編碼錯誤和漏洞的任何程序——都是人寫出來的,還是這句話,是人就會犯錯誤。例如Fuzzers是不會發現顏色屬性的緩沖區溢出這種情況的,這是因為我們在寫Fuzzers的時候沒有考慮這一方面。不過當我們意識到這一點並對Fuzzers進行更新之後,就能做到去查找各種類似的緩沖區溢出條件的欄位。簡而言之,我們要Fuzzers做什麼,它才會去做什麼。
4.缺乏對供應商的問責
許多安全專家抱怨,只要我們不能找到證據起訴供應商的軟體缺陷,我們就永遠不會變得更安全。我贊同這一點,增加對供應商的問責有助於降低安全風險,但是同時卻有可能會減緩進度。不過如果軟體公司比現在更能擔當起責任來,那麼我想我們能在手機上、電腦上能自由自在沖浪的感覺會更爽。
但是成功源於功能和速度,而非安全。社會現狀決定了我們必須犧牲一部分安全和保障去換取新鮮感。這不一定是壞事——因為能讓我們成功得更快。但是這樣一來我們就不得不承擔這樣做的後果。不過到目前為止,我們還是心甘情願為了添加更酷的新鮮玩意兒而面對更多的風險。
5.缺乏對黑客的問責
現實是上面沒有一條能很快解決。但是軟體出現漏洞就其本身而言,真不是什麼大問題。說它脆弱是因為這些軟體在面對惡意攻擊的時候毫無抵擋之力。除非我們能制止黑客的猖獗行徑,否則惡意軟體將會一直困擾著我們。
但是我依然深信,將來有一天我們的互聯網會有更好的普遍標准出台,我們能在現實中及時地將那些損害大家利益的傢伙繩之以法。不過在此之前,我們還是得不斷地寫補丁,在黑客的狂轟濫炸下苟延殘喘。
『柒』 身為程序員,當程序出現bug時,是一種怎樣的體驗
當程序出現bug的時候,程序員會有兩種感覺,一種是終於可以提現自己的價值了,當自己把bug修復好的時候,就會有一種成就感,但是如果很難修復的話,就會很頭疼,所有很多程序員很早就有一部分發際線就會變高。
『捌』 又遇到Bug了,程序員會怎麼反應
開發應用程序是一個非常有壓力的工作。沒有人是完美的,因此在這個行業中,代碼中出現 bug 是相當普遍的現象。面對 bug,一些程序員會生氣,會沮喪,會心煩意亂,甚至會灰心喪氣,而另一些程序員會依然保持冷靜沉著。因此,如何處理修復 bug 的過程也值得我們細細琢磨。
『玖』 作為一個程序員,我發現同事寫的代碼有Bug,怎麼辦
作為一個程序員,你發現同事寫的代碼有Bug,你會告訴他嗎?講真的,這個事情對我來講,很難,因為我在這個事情上吃過苦頭!
看待這個問題首先得看對方脾氣咋樣,如果對方脾氣不好,或者很難搞,還是想想其他辦法。直接跟他講可能會遭到對方的白眼!
別看我們程序員一個個傻傻獃獃的,其實自尊心特別強!除非你是他的領導,否則即使你發現了他代碼里的Bug,他也不會服你!雖然還是會改,但內心一定在想:「就你能?自己管好你自己就成,看我代碼幹啥?」
其實我也是這樣的心理,好像程序員除非自己願意,否則都不怎麼喜歡別人去研究自己的代碼,好像對方故意找自己茬的意思。
但是不管咋樣,不管是有意無意,我們既然發現了同事寫的代碼有問題,就不能坐視不管!
我最近在調一個小夥伴的介面時,因為涉及到數據回滾,所以就想知道他的代碼有沒有做回滾操作。如果沒有,可能我這邊數據已經回滾了,他那邊沒回滾就會導致數據前後不一致。所以我也不是有意要審查他的代碼。
然後我就發現他不光沒有做回滾操作,也沒有做批處理。幾個涉及到修改數據的代碼就這樣一行一行走下來,看著直讓人撓後腦勺。
於是我就把這個事情告訴了他,讓他要麼做事物(如果操作有問題,可以自動回滾),要麼做主動回滾。否則我在調他介面時,如果我這邊撤銷了數據修改,他那邊卻提交了修改,就會導致數據丟失或前後不一致。
當我告訴他這個情況和解決方案以後,我能很明顯地感受到他有點不愉快。但事實擺在眼前,也只能修改。可修改歸修改,他還是有點脾氣的。於是他寫了一個事物,將大部分涉及到增刪改的語句全部包在了裡面,唯一把一個刪日誌的語句留在了外面。
我看到這個情況,就委婉地跟他說:「」好像這個刪日誌的語句也要包在事物裡面哦!」
但是他卻說,這個無關緊要,他特意放在外面的。
我跟他說,既然這里有數據存在,就不是無關緊要的。不管咋樣,也不能無緣無故就把數據給刪了。但是他很倔強,執意不改,還說如果我覺得這個數據有用,那就讓我自己「順手」把這里的代碼改一下。
此時我能明顯地感受到他已經有點煩我了!無奈之下,我把這段代碼給移動到了事物裡面。
而我為什麼說我因為發現同事代碼有Bug告訴同事而吃過虧呢?
原因在於我之前待過的一家公司,有一個工作了幾年的程序員同事,而我當時是個萌新。因為我專門培訓過,所以代碼能力還行。可這個同事雖然工作了幾年,但寫出來的程序代碼卻Bug一堆,常規測試手段還測不出來。
我是在偶然之間發現他寫的一個程序是有Bug,但是又不確定,所以就想看看他代碼是咋寫的。不看不知道,一看嚇一跳,他寫的好大一部分代碼都有問題!
我當時初生牛犢不怕虎,發現一個跟他說一個,結果最後把他給惹毛了,當場就要跟我動手,說我專門針對他。我哪有針對他的心呀!我當時想的是把這些Bug找出來,讓他改掉,否則對公司也不好。
但是他想的估計是被我這個萌新發現了一堆Bug很丟人。我總是針對他的代碼找Bug,他就是脾氣再好也綳不住啊!
後來我們的部門經理為了不讓他難堪,也為了給他個台階下,找了我寫的程序里的一個缺點,猛批了下,然後跟大家說:「我剛才看了看,大家寫的代碼有好多問題。這樣,大家都各自檢查一下自己的代碼,看看有沒有問題,有問題盡快改過來,然後我們統一測試!」
直到現在,我也沒學會當發現同事代碼有Bug以後,在不讓同事產生不愉快的心理的情況下,委婉地告訴同事他代碼寫的有問題的方法。
『拾』 程序員寫的程序里的bug,會不會是鬼造成的
但大部分程序員都有一個問題就是不太願意測試自己的代碼。他們草草的調式完成以後就認為工作結束,測試那是測試人員的工作。
1. 影響了程序員自己的聲譽
2. 影響了產品的質量
3. 影響了客戶的信任度
4. 這個時候再 DEBUG 難度增大了許多。
大的不說,就說多自己聲譽的影響吧。如果你的程序總會有這樣那樣的 BUG ,你得到收益會減少,即使你寫了很多代碼。
程序員必須克服一些自身的致命缺點才能夠從根本上解決這個問題。那麼這個問題是什麼?前面我們已經提到,程序員對自己的代碼都非常寬容,認為那是正確的沒有問題。實際上這種想法比較正常,程序是通過程序員思考和設計之後才寫出來,程序員不會將自己認為不正確的東西寫到代碼里,而到這個時候都一直假設程序是正確的;但人非聖賢,怎麼可能不犯錯誤來。實際上程序員在對待其他程序員時候的態度就很好,帶著一種挑剔和學習的態度;但一旦對待自己的代碼就很難這么做;這就是最致命的。程序員也必須對自己的代碼帶著挑剔和學習的態度;這個基礎是假設自己的代碼是錯誤的,然後需要做的是怎麼樣證明自己的代碼是正確的。程序員自身可以在程序生成的每個階段做這些工作:仔細的設計(這個時候畫點時間是值得的,必須保證我們對自己的程序有清晰的輪廓後才能開始動手寫)、編寫代碼時、單元測試(單元測試的重要性就不在贅婿了)、功能測試。
仔細的設計:這個的仔細是說在程序員編寫代碼之前,其必須對代碼的整個結構以及邏輯結構有明確的清晰的了解,只有這個時候才可以去寫代碼。這里沒有談到文檔,但我說到了一定要清晰的思路,但清晰的思路不是每個人都可以在腦袋中直接形成的,很多人都是普通人,沒有辦法在腦袋瓜中把所有問題都想清楚,那麼就記下來,特別對於復雜的邏輯。
編寫代碼:對於沒有把握的代碼,例如:新設計的演算法,最好保證其正確性。可以單獨將這部分測試,這可以讓代碼模塊化的同時又保證了代碼的正確性。一句話:少量的代碼保證質量還是比較簡單的。
單元測試:單元測試的重要性不在贅敘了,現在也有許多工具可以幫助程序員並減少工作量。
功能測試:程序員保證自己代碼質量的最後一關;為了做這樣的工作我們可能必須寫一些代碼來測試,甚至是測試工作。使用大量的 CASE 來測試,以及錯誤的 CASE 。這里和測試人員的測試不同之處在於:仍然讓程序員的注意力放在其自己的代碼范圍內,減小了排錯的難度。
如果你通過了以上的步驟都找不出你程序中有任何問題的話,那麼我想你的程序應該足夠健壯了。其實還有一點必須說明的就是:代碼 REVIEW 。
前面說道了程序員對待別人代碼的態度是挑剔和學習的態度,所以讓其他程序員來 REVIEW 你的代碼也是檢查程序有沒有邏輯錯誤的很好的辦法。團隊中應該交叉 REVIEW 代碼,這是實踐的經驗。
作為一個好的程序員必須有以上的習慣,以及對待自己代碼象孩子一樣,我們要愛惜我們的代碼,同時也要讓代碼走正確的路。