→ specman:說真的, 我看不懂這篇文章再說什麼... 05/02 13:49
→ bobju:me2..我比較喜歡看[小米加步槍]系列的... 05/02 15:32
說的是一個實際發生的例子: 就是大學的選課系統, 只是這系統允許就選的
同性質課(如體育, 通識類)指定多門想選的課但有優先意願, 某些課也給某
些學生的系級身份設定優先(如體育大四優先), 有些課可以同時選上(如通識),
有些則是只能擇一(如體育). 篩選比較的條件如果都相同, 那就抽籤決定. 這
是一個選課志願分發系統.
這個系統是由老師帶學生開發的, 碰到的問題(BUG)就是會停在某個指述說有錯
誤, 然後機器停止不跑了(有錯誤), 但那行指述並沒有任何語法或語義的錯誤.
出現錯誤的位置則隨資料處理次序而不同, 如先做A班再做B班再C班,A->B->C不
同於做C->A->B時發出指述錯誤停下來的位置, 但某些資料下, 也可能都沒錯誤
發生.
→ LearnRPG:喵啊 這篇是不是英文直接丟google翻譯出來的 XD看都沒有 05/02 18:07
寫程式寫出 data depend error 這種 BUG, 也算是偉大的機遇.
相信這裡說的每行字各位都看得懂, 只是沒碰到這種 bug 的經驗下, 就串不起來
到底是怎麼回事. 這個看不懂是出在無從想像這是甚麼東東(也就是不相信).
1.這個會出錯的程式應該是有跑過 test data 驗證. 所以少量測試資料下不出錯.
大量資料下可能出錯, 但也可能不出錯.
因為找不出程式那裡有寫錯, 當時做的人就發現有下列變通方法:
2.出錯時, 把發生錯誤正處理的那個班調到最後, 再一切重做, 可能就順利跑完都不
會出錯. 但也可能後面補進的還是在其後某個班出錯.
3.有錯, 就照做2的方式, 把出錯的班調到出錯那堆後面, 依新排的次序再從頭重做.
出錯那堆那個先那個後, 也有可能都過不了關.
不管最後是否能過關? 教務處就是不肯接收這個程式, 因為不知甚麼時候會不會就跑
不出來.
==========================================================================
這個 bug 發生的現象跟有些程式發生 stack overflow 以致程式亂跑是很像的.
這些選課資料不是處理完一個班就不會再被處理, 因為一個班選該課的意願優先
未必人人相同. 假如以班為單位先按可選的人數分派, 有可能某生的低意願選課
被分派進去, 但到另一班處理時該生的高意願選課可能也中選, 如果規定同類的
課只能擇一不能複選. 先被分派的低優先就得剃除再找候補補上空位, 但補上的
候補可能引發這候補在其他同類課被先選上的低意願選課必須再被剃除. 也就是
演算法如沒事先分析好, 排除這種回溯狀況, 使之絕不發生, 就可能因資料的不
同與處理的先後次序差異, 造成回溯已處理過的班級資料需要再處理, 回溯有可
能又引發再回溯, 處理的班級就回頭引發更多的已處理過的班級. 資料或程式就
有可能回溯自己本身. 通常要正確處理這種 recursive call 就需耗用大量的
stack area 暫存中間結果. 此時若回溯太多層, stack overflow 就隨資料的處
理次序, 看狀況會發生或不發生了.
邏輯上, 寫程式者的習慣就是直接就問題解問題, 甚麼狀況就怎麼對付. 但萬一
最壞狀況碰上了, 譬如這個回溯剔除 補添候補, 補添候補又連鎖發生, 造成系統
給的 stack 或 temp 超用, 就出錯了. 而測試的資料可能沒如此巧合而測不出,
或者因引入抽籤變得程式執行更難追蹤.
→ ah7675:哪來什麼相不相信 是看不出你想表達什麼 又不是聽不清楚 05/04 11:41
→ ah7675:你把內容重復打一次意義何在? 只有內容沒有重點 05/04 11:42
bug多還是少, 可能不比 找不出 BUG 何在 還嚴重.
不是資料多少, 而是某些奇特資料或資料次序變化就出狀況, 這BUG不僅在, 還很致命.
若 bug 隨狀況才出現, 那是算多還是少?
會出 bug 的程式, 就是分析的狀況不夠深入, 根本問題就出在架構與算法.
也就是只看表面處理的邏輯好像沒錯, 但就是沒想到"怎會這樣?", 因為觸犯
到系統支援的底線, 因沒整體感覺, 所以除不了錯, 也不認識到這種錯的特點.
程式須在硬體與系統的框架裡執行, 好的程式就是 bug 最少的程式, 也就是
讓程式搭配硬體系統去擴展軟體使之配合要解決的問題型態, 不致發生系統
無法適合搭配問題, 也就是軟體加上硬體不致於發生兜不出問題的解決方案.
這種搭配就顯現在架構(Architecture)及其上的算法.
這個特色就是展現在 架構的簡潔與針對問題的有效性上.
推 atpx:其實大家都知道你在講什麼問題, 只是你的文章打完最好自己再 05/05 15:11
→ atpx:看一次, 有些語句斷頭去尾導致沒有邏輯性, 讓人不知所云 05/05 15:12
這個問題 發生的狀況與現象 就是 看起來 像是發生 data depend crash. 這在
一個成批處理的DP裡是很難被認為會發生的, 處理後的結果可能會出錯, 但不會
造成 program crash. 所以, 成因是甚麼? 我不想武斷的猜測, 敘述上是收到的
訊息原狀, 推論與矛盾是並存的.
這現象造成的原因不清楚. 這個程式並沒有被找出真正的錯誤排除, 所以很難被
界定(bug not fixed). 這系統經過多次的實際使用, 企圖去除錯是一定的, 可是
沒有達成目標, 應該就是 bug 不明. 這個程式在解決不了之下, 先以原平台系統
老舊, 要求引進新的軟硬體平台, 其中一個合理猜測就是認為硬體不穩, 容量不
足. 引進新硬體與系統的事也在進行中, 只是使用單位在換了領導人之後找了其
他的教授專家們開始檢視軟體的需求與最終在平台的實現要如何進行.
原來發展的團隊並不肯拿出原程式讓別人去測試. 只解釋了使用單位因 data
depend crash 現象, 不肯同意完全接收使用. 團隊成員只是想將運作工作交給電
算中心承接. 他們並沒有認為 program crash 是程式而起, 甚至認為學校怎麼使
用如此不可靠的 "國產讀卡機", 經常會有不同辨識結果. 但錯誤的資料只是產生
錯誤結果, 在有data type range查核下就能事先檢出, 但要造成 crash 那是另
一回事.
同條件抽籤篩選跟多拿一個條件來比較並無不同, 只要不公布是用那個條件?
在使用者搞不清楚下就如同抽籤現象. 這個發展團隊雖不明說, 但承認發生crash
時若再重新做, crash 還是發生在同一班同一指述, 所以這現象不受抽籤的亂數
影響. 這個抽籤需求, 從系統使用以來, 一直也就被質疑不是那麼無序. 換言之,
是被質疑過 crash 原因之一, 不全然就是亂碼抽籤.
事情的直轉而下, 就是該軟體被新任的課務組主任拿去找校外的單位, 透過
不同的硬體系統處理該學期的選課資料, 然後跑不出選課結果, 最後以緊急加人
的人工系統善後. 事情就演變成學校的電算中心要緊急重做一套新系統.
bug 多還是少, 那就是兩種系統的比較. 新做的放棄劃卡改用網路, 使用者要上
網查看送上的選課資料, 可以看見抽的籤號, 可以看見其他選課者與自己設定的
優先狀況與處理後結果, 也可看見最熱門的課經篩選後的情況.
新系統針對優先採用不必回溯的演算法, 每門課的條件都改為可用事先選擇的代
號與設定表設定, 以配合每門課的不同需要.
========
data depend crash 或 time depend error/crash 絕對是電腦系統要排除的狀況.
因為沒人能接受這種系統. 但軟體若觸犯硬體系統的極限, 可能就會發生, 好的
或 bug 少的系統會事先儘量排除這種可能性.
※ 編輯: ggg12345 來自: 140.115.4.90 (05/05 17:51)