使役理論幫助自己,別白癡的去當理論的奴隸
我實在不懂為什麼有人會說
"雖然我不懂,但我還是覺得人家有這種理論,必定有一些神奇且深奧的地方"
"我覺得XX理論就是YYYYY,所以我們做這件事情,依照這理論,我們應該ZZZ"
拜託一下,用一下你的腦子好嗎?
這理論到底帶給你什麼好處,如果在寫程式,應該深有所感
TMD不要寫到綁手綁腳,寫到吐,然後回頭被問
"阿你這樣寫到底實際上拿到什麼收益,效率快在哪,維護方便在哪"
結果?拿不出來,而且還用一些自表理由
"(重複)因為這理論就是YYYYY,所以我依照這理論,我們可能要ZZZ,然後或許因為有點限制,還要ZZZZ"
"我雖然說不出來有什麼好處,但未來總有可能有幫助的"
可以停止欺騙自己了嗎?
有些人很確切的了解到自己幹這件事情雖然綁手綁腳,但逐漸為自己理想邁進,這樣的犧牲是有價值的
但是有些人不然,看到一些小地方為了展現自己知識,就硬是要大作文章,說我覺得這樣做比較好,你們遇到這件事情也都倒跟我效法
老實說,這樣算小事
但是,遇到方向性理論呢?
有些人自以為可以見葉知秋,以為我把這邊做好,考量別人可能會出狀況的BCD,恩我的系統超好超完美,你看,以後怎麼發生狀況我都不怕了啦
然後,才出一個狀況就倒了是怎樣
這絕非運氣不好,我用一個非常具體的程式例子來講
"單元測試"
為什麼單元測試不做邏輯測試,不做整合測試,甚至資料假的都可以測試
"因為他本來就不是給你測這些鬼東西的"
有些人自以為聰明,想說"測試總是要有點實際意義",然後就寫了落落長的"可以順便驗證資料真實性,可以確定邏輯和突發狀況的"單元測試程式,雖然說測試程式比原本程式碼多有時候是正常的,但也多太多了吧?雖然問題遠比這嚴重
你的目標是"如果發生了我預想的ABCD狀況,根據我的測試,我可以準確的防禦並抓到問題"
但是,程式根本不怕預想錯誤,就TMD怕例外,所以才有Exception,才有assert
你拿這些預想內狀況來測試,是在考驗自己,測試自己的智商水平會不會哪天手殘改壞沒注意到還上線被客戶使用結果爆出來了嗎?
在某次單元測試中的對話:
"你看,為了測試我這個程式運作沒有異常,我直接抓這必要的回傳陣列第一個值判斷是否有設值,就可以完美的讓這測試有更深遠的意義"
"異議,回傳是空字串同樣算是有設值"
"那麼就在檢驗字串長度好了"
"還是有異議,回傳是錯誤資訊也還是有設值"
"那再多個判斷是否回傳的是錯誤資訊"
"一筆資料也不能確定沒有異常吧"
"那我帶十筆測試,這樣可信度更高了吧"
"資料庫被影響怎麼辦"
"哦,那我們要自己建立專門用來測試的資料庫,確保測試期間所有程式只有我的程式在運行,所有影響都可掌控,然後每次測試完畢以後都要刪光資料表,確保上一個測試沒有影響到下一個測試,接著還有還有還有還有.........."
...TMD我到底聽到什麼神奇的對話...當場傻眼
(如果讀者認為上述的很有道理,代表客官您還不是很懂單元測試在做什麼的,建議去Google或我先前的文章有非常詳細的說明)
然後?沒有然後了,因為單元測試目的在檢驗"程式跑得動"
但有人一直在檢驗"運作完全按照自己預期,資料沒有出錯"
所以才會發生死胡同
"沒有設值,恩空字串也算有設值,不對即使意外從其他資料庫拿到錯誤的資訊還是有設值,更進一步,你中途不小心手殘去設了值...這測試程式怎麼這麼難寫!"
"我預設其他人都不會傳錯資料,只會用我預期的方式發生預想中錯誤,這樣我就可以用我的理論發揚光大,展現我程式的彈性"
抱歉,這種東西,完全是妄想
程式是要預留調整的彈性,而不是自己預想將來會發生啥狀況然後擅自認定以後把這些應對寫好
一定有人會白癡問說:"阿將來發生怎麼辦,你要負責嗎?"
我可以順你的意,按你理論,我可以多寫一百多條判斷,你不准撤,因為將來只要出錯,你撤了任何一條判斷,你就要負責
為什麼這樣說
因為這只是單純的把自己的白痴思維套用到別人身上
你擅自認定了以後可能資料庫會按照自己預想的方式修改,而且哪天手殘會不小心改到程式碼的特定某個區段,此時我寫的防禦機制,將將,漂亮的防禦了一次攻擊!
....姑且不說約有99.999%是"預想外狀況"
我可以很明確的說,如果到時候發生了你所說的狀況
"百分之百是你幹的"
你正在做這件極度自婊的事情,不過你好像沒有這個自覺
為什麼這能牽扯到理論的奴隸
這非常簡單,非常直覺,因為會幹出這種事情,不外乎自己已經被一些自己擅自認定"這東西超強"的理論框架綁架,擅自認為這東西效率最高,最好,出錯一定都別人寫錯或不會用
自己捫心自問一下,真正效益在哪,犧牲在哪
不是TMD理論的白癡講解方法,而是運行呼叫次數少了多少,維護預設遍歷少了多少,記憶體少了多少
這點我一直想說,有些人被問問題,馬上很搞笑地去GOOGLE找測試數據,找別人怎支持這理論
雖然一直藏著沒講,在這邊講一下好了,反正沒幾個人看的到
"你TMD這麼有自信,不會寫測試丟自己程式身上證明一下嗎?
有些人確實這樣幹,我非常佩服,但這些人因為自己有測過,說話都會比較保守,因為如果有正確且充分的測試,都會了解到自己現在寫的都不是最好,最萬能的
為什麼?因為常常
換個環境測數據就變了
隨便換個攻擊手段你所謂的防禦機制就崩潰了
隨便換個架構修改法你預想並擅自寫好的擴充函數根本無用結果導致得全部砍掉重做
同一個演算法無法完美套用所有運算
同一架構無法完美套用於所有狀況
同一個預防機制無法因應所有意外
這是基本常識,我們因為有腦子,所以我們懂得變通
所以絕對沒有什麼"照這樣理論就對了,絕對是最有效率,最完美的"這種蠢事
但是有些人展現100%的自信,被正面婊後還死不認錯繼續轉移焦點找理由,然後再把那些已經被打臉的又重新搬回來講一次理論
沒有經過正確消化的理論,即使講第二次也沒有更大的說服力,不如說根本是反效果
因為即使這理論真的很好用,你也沒有正確使用到,才會有這樣的表現
這種,就是百分之百的,理論奴隸
常常覺得自己很忙,做苦工,結果到頭來只是屈服於好像很好用的理論之下
我真的不知道該說什麼,因為根本不知道從何吐槽起
最崇高的設計理念,架構,永遠只是夢想
因為他本來就套不進現實狀況,硬要用只會被正面婊慘後各種拘束最後在嚴重拖慢效率
夢想是目標,但從來都不是寫程式的標準
因為照著走只有死路一條,且遇到狀況就牽就所謂的夢想,只會把事情搞複雜
這叫自殘,絕非變通
沒有能力去駕馭強大理論,就放下身段,懂多少就去用多少,這才叫踏實
因為你可以明確知道自己正在幹什麼事情,犧牲多少,得到多少
"所有能用的都要全用上,讓狀況變得非常完美"
抱歉,請在夢裡面講就好,尤其奉勸某些人找到一些看起來很強大,就自以為可以完全掌握,而實際上非常生疏,是第一次接觸的技術
請三思而後行
這裡並不是說什麼,故步自封,有新技術也不學什麼的
而是指,你學了多少,掌握多少,就用這些拿來幫助自己就好
沒有必要打腫臉充胖子,以為自己沒掌握的地方也會按自己預想的狀況下進行
這非常危險,也常常讓很多人直接走進死路
但終究還是給自己一個警惕
永遠不要擅自去認定環境該怎麼改變而擅自預先做了一堆自以為是的防禦機制
因為,預想內的基本處理是"本來就該做的事情",還去做一堆事情"預防"根本叫做"搞不清楚狀況"
要預防的是什麼?
該預防的是預想外狀況(例外)好嗎!?
沒有留言:
張貼留言