Re: [請益] 年紀大的人適合進來這行嗎?

看板Soft_Job作者 (三分熟的鬧鐘)時間10年前 (2014/03/29 03:34), 編輯推噓11(11014)
留言25則, 14人參與, 最新討論串8/14 (看更多)
※ 引述《sedgewick (三分熟的鬧鐘)》之銘言: : 我就寫一段小小的程式碼, 來說明為什麼 C coder 需要經驗. : : unsigned char myarray[1000], *s, n; : : n = 4; : s = myarray + 100; : s[-n] = 4; : : 把其中的 n 從 type char 改成 type short 就可能會當. : 請問為什麼?(以上是我從某個鳥程式所取出來並化簡過的魔物. ) : : 但是也可能不會當, 請問又是為什麼? : : 推 tyc5116:能不能公佈一下那段程式的答案,很詭異XD 那個答案倒還好, 前因後果才有趣... 話說這段 code 來自於某個大概 5,000 行左右的 C codes. 算是一個不大不小的東西... 某天有個程式員跟我抱怨他的程式一直當. 也特別強調本來好好的. 這傢伙從來不用 version control system, 版本差異全部靠紙筆作業. 當然, 外加滿滿的 myproject-20140320-1.bak/ myproject-20140323-1.bak/ myproject-20140326-1.bak/ myproject-20140326-2.bak/ myproject-20140329-1.bak/ 這種老派程式員其實寫起程式來還是有模有樣的. 裡面有 #define DATA_SET_SIZE 200 typedef unsigned char datatype; typedef datatype mycounter; typedef datatype dataset[DATA_SET_SIZE*4]; struct dataencaps { mycounter n; dataset s; }; struct dataencaps mydata; 像這樣的東西, 而且會很乾淨地放在一個 .h 的 header file. 換句話說, 你根本不會特別研究這個 mydata.n 是什麼 data type. 因為這種寫法會讓人覺得「其實他對資料結構已經考慮得很清楚了」. 我花了很久的時間才領悟「華麗的草包依舊是草包」(此話鮮血淋漓. ) 這是其中一個例子. 然後他有這樣的迴圈, 寫在另一個遙遠的 .c file 裡面: mydata.n = DATA_SET_SIZE/2; t = &mydata.s[mydata.n]; while (mydata.n) { t[-mydata.n] = my_reversed_first_half(...); mydata.n--; } 這個迴圈真是非常正常........如果不看 .h 裡面的東西. 前面有鄉民指出 s[-(unsigned int)1] 這種東西不正確...... 當然這寫法不太合理(如今的記憶體已經巨大到不能肯定這不正確. ) 但就有天才可以把它「調整到會動」. 寫法就像這個迴圈(迴圈倒著寫並不詭異, 算是常見的技巧. ) 只要一直用同樣的 index domain, 加上夠大的 t[]. 那一定會產生同樣的結果──雖然資料並不是存在預期中的 t[0]~t[99]. 但總而言之, 它不但不會當, 而且只要寫法一致, 怎麼測都是正確的. 但是把 typedef unsigned char datatype; 改成 typedef unsigned short datatype; 就當了. 糟糕的是他忘了他改過什麼(每份 backup 都改了一大沱... ) 此外他非常喜歡亂用 malloc()/new() 這些東西... 更好玩的是只要開了 gdb 就不會當. 所以當 printf() 一行一行找到當掉的位置在 t[-X] = ... 但 t 是對的, X 是對的, -X 是對的, 連 t - X 也是對的... 而且 *(t - X) 正確, 至於 t[-X] 則是一印就當... 把附檔名從 .c 改成 .cpp 之後, 寫成 t[-X] 卻又沒事. 這種情形你會怎麼猜?(幸好這不是 multi-threaded program. ) 花一個禮拜把 malloc()/free() 全部重查過... 大概是這樣吧? 真正印得出問題的 expression 是 &t[-X] 這種寫法. 事後我問他, 為什麼會定義成 DATA_SET_SIZE*4 這麼大的 storage size? 他的答案也很妙:「提高安全係數. 」 所以實際上程式員並不確定他會用到陣列的哪個部分. :D -- 新詩練習:新鮮。踩破初春裡的狗大便;不經意的滄桑,滿溢著嫩黃的喜悅。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.176.223.182 ※ 文章網址: http://www.ptt.cc/bbs/Soft_Job/M.1396035240.A.473.html

03/29 07:25, , 1F
Valgrind或許抓得到?
03/29 07:25, 1F

03/29 08:10, , 2F
感覺他根本來亂的,加了那麼多不可預測的寫法
03/29 08:10, 2F

03/29 08:12, , 3F
同樓上 XD
03/29 08:12, 3F

03/29 08:32, , 4F
程式設計師裡的預言家
03/29 08:32, 4F

03/29 10:19, , 5F
能夠把程式寫得像不定時炸彈但又恰恰好能運作
03/29 10:19, 5F

03/29 10:19, , 6F
這也是一種技能 XD
03/29 10:19, 6F

03/29 10:36, , 7F
"提高安全係數" <- 答的真妙
03/29 10:36, 7F

03/29 11:03, , 8F
這就是所謂的把我火掉了就沒人能維護這些程式碼 這個意思吧
03/29 11:03, 8F

03/29 11:05, , 9F
要知道能埋很多地雷又不會炸開 這是高等技巧阿XD
03/29 11:05, 9F

03/29 11:19, , 10F
把程式寫成恐怖平衡也不簡單
03/29 11:19, 10F

03/29 12:00, , 11F
是很多公司都會用.h包那資料結構嗎?我們公司也是耶
03/29 12:00, 11F

03/29 15:07, , 12F
那樣包沒有問題, 請不用擔心... 而且還非常正確.
03/29 15:07, 12F

03/29 15:07, , 13F
程式寫成這樣,code review怎麼會過?
03/29 15:07, 13F

03/29 15:07, , 14F
整個事件的原因在於程式員的基礎知識有缺陷...
03/29 15:07, 14F

03/29 15:08, , 15F
這個靠 code review 不夠, 因為 reviewer 通常不查 .h
03/29 15:08, 15F

03/29 15:10, , 16F
至於 valgrind 這個倒是好建議, 我忘了... 科科.
03/29 15:10, 16F

03/29 22:19, , 17F
該組沒有程式紀律。結案
03/29 22:19, 17F

03/29 22:25, , 18F
啊咧, 不妥不妥, 就這樣結案會少一隻代罪羔羊...
03/29 22:25, 18F

03/29 22:37, , 19F
我不是說那樣包有問題,而是我覺得那樣寫法很不好
03/29 22:37, 19F

03/29 22:37, , 20F
剛好看到這種包法跟我們公司差不多,想問是很多公司都這樣?
03/29 22:37, 20F

03/29 22:55, , 21F
呃, 「那樣包」指的是?如果是 typedef 的話很常見哦.
03/29 22:55, 21F

03/29 22:56, , 22F
如果是說那個包得密密麻麻的 struct 就比較難說...
03/29 22:56, 22F

03/29 22:56, , 23F
因為我看到 a.b.c.d.e.x0.coord 也是會昏倒的.
03/29 22:56, 23F

03/30 00:15, , 24F
typedef unsigned int mycounter; //instead of datatype
03/30 00:15, 24F

03/30 22:03, , 25F
同意二樓
03/30 22:03, 25F
文章代碼(AID): #1JDSweHp (Soft_Job)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文 (最舊先):
完整討論串 (本文為第 8 之 14 篇):
文章代碼(AID): #1JDSweHp (Soft_Job)