2014年5月3日 星期六
說到 code review 也有很有趣的事情
作者: sedgewick (三分熟的鬧鐘) 看板: Soft_Job
標題: Re: [請益] 年紀大的人適合進來這行嗎?
時間: Sat Mar 29 17:55:22 2014
※ 引述《sedgewick (三分熟的鬧鐘)》之銘言:
: 事後我問他, 為什麼會定義成 DATA_SET_SIZE*4 這麼大的 storage size?
: 他的答案也很妙:「提高安全係數. 」
:
: 所以實際上程式員並不確定他會用到陣列的哪個部分. :D
:
: 推 uid88:程式寫成這樣,code review怎麼會過?
: → sedgewick:整個事件的原因在於程式員的基礎知識有缺陷...
說到 code review 也有很有趣的事情.
我曾經遇過某個超級程式員.
英文非常破爛, 常常拼出莫名其妙的錯別字.
譬如會把 signal 拼成 single 之類的.
長一點的那是必敗無疑...
譬如 multicore_dispatcher 這種本來就很糊塗的字眼.
問題是他的產能是別人的十倍...
結果我就遇上其他的程式員跟我抱怨「能不能請他換一本正常的字典」.
因為錯久了, 大家都要跟著一起習慣那些怪字.
每個人都在擔心發生程式功力提升不多, 英文卻整個毀了之類的慘案.
偏偏又不能用 code review 卡住他.
他寫得更多、更快, 而且絕大部分情況都沒有問題.
寫到五維陣列都不會錯(這可以讓 99% 的 reviewer 消化不良. )
純粹就程式邏輯而言, 被派去 review 的人都不會比他好...
你手上就是生不出第二個可以「趕上他的進度並修正他的工作」的人.
他只是不會拼字而已! :P
因此大家允許他使用一個很白爛的 house rule.
int xxx;
int xxxx;
int xxxxx;
這種命名方式──我說的是 global variable naming convention!!
而且要有三個 x 以上... 當然用 a, b, y 之類的也無妨.
之後的悲劇嘛......大家可以猜猜看.
某天有個 xxxx 莫名其妙地被改掉.
當然第一個猜測都是, 「馬得這傢伙又拼錯字了. 」
但是很奇怪, 所有針對 xxxx 的存取都是正確的.
可是它就是在某些不知名的時刻會被改掉.
而且還是老問題, 只要加掛神器 gdb 的時候又一切正常.
最後查出來的結果嘛............勉強算是拼錯字.
只是他拼錯的不是 xxxx, 而是 xxx.
在某一個不起眼的角落, 有一個長得像這樣的東西...
*((someptrtype *)&xxx + 1) = 20;
這裡面的 xxx 其實應該是 xx (昏倒了沒?)
被誤寫成 xxx 的 xx 是一個 local pointer...
偏偏還有個 global 的咚咚也叫 xxx, 是一個簡單的 type int....
所以在某些 compiling condition 的情況下...
這個
&xxx + 1
會指到下一個 global variable 的位址, 也就是我們的苦主 xxxx.
到現在我還是不太確定要如何預防這一類的錯誤.
甚至我不太確定 valgrind 這種工具有沒有辦法完全識破這種錯誤.
說它是高級錯誤也不對, 明明只是拼錯字.
說它是低級錯誤嘛...
平庸一點的程式員隨便亂寫 pointer expression 那是當得一塌糊塗.
不會有什麼「明明程式跑得好好的, 就是結果怪怪的」這種.
因為連跑起來的機會都沒有.
話說這個 bug 印象中找了一個禮拜.
為了處理它, 還把整個 multi-thread 全部翻修成 single-thread.
當然是............沒用.
越高明的程式員, 犯下的錯誤越危險; 所以應該雇用猴子就好(誤).
--
新詩練習:新鮮。踩破初春裡的狗大便;不經意的滄桑,滿溢著嫩黃的喜悅。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.176.223.182
※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1396086929.A.A27.html
推 mymaydayya:Find and replace錯字就好了為什麼要走到xxx那一步... 03/29 18:29
→ sedgewick:程度差不多的團隊才有機會修補錯字... 03/29 18:34
→ sedgewick:當你跟一個別字大王共事, 整份 code 有一半以上都很糊塗 03/29 18:35
→ sedgewick:你會直接說「阿鬼, 你還是說中文吧!!」 03/29 18:35
→ sedgewick:這就是為什麼最後會跟 xxx 這種命名妥協. 03/29 18:36
推 mymaydayya:至少也用aaa, bbb, ccc吧XD 03/29 18:40
→ sedgewick:那當然, 可是這些也全被用光了... 最多可以到八九個 x. 03/29 18:43
推 liteon:看到程式進步不多,英文卻整個毀了差點笑噴..XDDD 03/29 18:50
推 johnny1972:可以用一個支援中文變數名的語言來coding..... 03/29 18:52
→ sedgewick:這很慘烈的... Orz 03/29 18:57
推 GoalBased:1F的方法感覺很好阿... 03/29 19:50
推 lichai:replace不就好了…code review的成本花在效正英文,太浪費 03/29 19:56
推 void0:不是有重構工具? 03/29 19:57
→ void0:用XXX,XXXX,XXXXX 感覺也沒拼錯字高明 03/29 19:57
→ sedgewick:這個嘛, 所有的 refactoring 都要求特定的 framework. 03/29 20:02
→ sedgewick:問題是你的團隊不見得可以接受那些 framework 的限制 03/29 20:03
→ sedgewick:至於 search and replace 哦... 當你要換的東西太多時. 03/29 20:04
→ sedgewick:會換出一大堆非常科科的結果. 03/29 20:04
→ sedgewick:而且最糟糕的是, 這些都還是沒辦法避免文中的錯誤 03/29 20:05
→ sedgewick:只是「也許」發生時比較不會眼花繚亂而已, 也許哦... 03/29 20:05
→ sedgewick:不信的話請隨便開一個程式, 一千行左右的就好... 03/29 20:07
→ sedgewick:把裡面最常出現的變數, 譬如說 t 好了, 換成 t0... 03/29 20:07
→ sedgewick:只換這樣就好了, 看看會有什麼結果... 03/29 20:08
推 lichai:這種常見的case不是find和replace的字串前後加空白不就好了 03/29 20:11
→ sedgewick:其實不是, 因為會有人寫 "t," 然後換行... 呼叫函數時. 03/29 20:15
→ sedgewick:另一件事情是要確定是不是有其他的地方藏著 t0. 03/29 20:16
→ sedgewick:當然還可以 find a word, 問題是你也會換到字串裡的 t. 03/29 20:16
→ sedgewick:然後像 macro 裡面的 t, 這個該不該換?(通常是不該) 03/29 20:18
→ sedgewick:總之如果只跑個 sed 把所有的 t 換掉, 通常是會死的. 03/29 20:19
推 lichai:變數replace真的沒有那麼複雜,百萬行的程式碼也還好 03/29 20:20
→ sedgewick:還是老問題, 有 framework 罩著的不難... 一般的很難. 03/29 20:22
→ qrtt1:請個工讀生幫他改錯字好了(默 03/29 20:32
→ sedgewick:啊咧! 有道理耶, 我當初怎麼沒想到... 03/29 20:35
→ ggg12345:可能不是沒想到,很大可能是成見太深. 03/29 20:54
→ sedgewick:科科, 繼續留著錯字這招我們也不是沒想過... 03/29 21:00
→ sedgewick:既然說這叫成見太深的話, 我想問這會引發什麼問題? 03/29 21:01
→ sedgewick:可以猜猜看, 文中我寫到一些... 但是還有另外一些沒寫的 03/29 21:01
推 y3k:XDDDDD 03/29 21:15
沒有留言:
張貼留言
您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.