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




沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.