Re: [問題] 學code要看天分嗎?

看板C_and_CPP作者 (眠月)時間14年前 (2011/12/11 23:14), 編輯推噓17(17010)
留言27則, 22人參與, 最新討論串4/4 (看更多)
※ 引述《FableKevinS (FableKevinS)》之銘言: : 自己是初學c++ 也是相關科系生 : 每次看別人寫的code, 就覺得相當簡潔. : 相較之下,自己寫的就複雜許多. : 請問寫程式真的需要天分嗎? 之前敝人跟同事有過一段鬥嘴,爭論程式設計是不是一門「藝術」。 同事是屬於天才型的那種程式設計師,思維的速度很快,連打字都很快, 幾乎不需規劃就可以以很快的速度直接寫出中型(數千行)以上的軟體。 當時同事的論點是程式設計是一門藝術,不可以工程的角度看待。 我則是站在反方,我認為程式設計應該以工程的角度看待之, 像這種近似信仰的命題,當然我倆最後也是沒結論,只是鬥嘴鬥身體健康的。 不過後來我又花了點時間思考這個問題,我發現其實我們兩個人都是對的。 程式設計(或是說幾乎任何領域的專業)當然可以是一門藝術, 但是如果一個東西一直都是藝術,那就太可惜了,怎麼說? 什麼人可以駕馭藝術?有天份的藝術家。 如果高品質的程式碼只能透過天份來完成,那軟體設計就會發展的非常緩慢, 的確,快速的開發出高品質有彈性有擴充性的程式碼本身就是一種藝術, 但是,軟體工程經過了一段時日的發展,人們終於也找到了一些方法, 使得一般的平凡人只要經過充分的訓練也可以寫出 master piece, 而這個把「創造藝術品的過程」,仔細的分析出要素並且制式化的過程, 就叫做「工程化」,而受過訓練的人也就可以根據工程方法來生產高品質的程式碼。 我想說的是天份是有差異的沒錯, 但是現在的軟體工程已經發展到可以用堅實的訓練來彌補這點了。 所以,即使沒有天份,so what?你還是可以把程式寫好,這點毋庸置疑。 : 補上比較令我震撼的例子好了...寫一個求gcd的function : int gcd(int a, int b) : { : // Line 1 : // Line 2 : } : 兩行寫出來!!,晚點補上答案... 剛好你舉了這個例子,我也拿這例子來講軟體工程如何讓你寫出好的 gcd。 gcd 誰都會寫,普通人可以寫出 while 的版本,腦袋快一點的會想出遞迴版本, 不過不管是五行的 while,還是兩行的 recursive 其實品質都一樣差, 真正能造成品質差異的,很大部份是來自於訓練, 如果你受過訓練,你會知道你要作「測試」,於是你要寫一些測試案例, 寒風勁骨,亂世忠臣,沒有測過的軟體等於不能用的軟體。 如果你受過更好的訓練,你會知道你應該「先寫測試」才開始寫程式, 差異在於如果先寫好程式,你所做的測試會偏向「驗證」, 你會去「驗證」你已經做好的部份,忽略你沒作好的部份。 盲點之所以叫做盲點,就是因為看不見, 你一旦看過某些東西,你就更容易看不到其他東西。 這就是為什麼我們不應該先寫程式碼。 如果你先寫測試,暫時忘記自己是寫程式的人, 才能以比較客觀的角度,站在旁邊,很確實的寫出有效的測試, 就以你上面舉個的那個兩行的例子,如果請你測試,你會想要輸入什麼? gcd(2, 4); gcd(3, 5); gcd(6, 9); 差不多了,互質的,倍數的,都有測到了。 「我的程式是對的」 但是如果在你還沒寫程式碼之前,就請你先寫測試, 請你想辦法盡可能的測出這隻程式的弱點,以及可能沒有考慮到的狀況。 gdb(2, 4); gdb(1, 2); gdb(0, 1); gdb(1, 0); gdb(0, 0); gdb(-1, 0); gdb(-1, -1); gdb(-1, -2); gdb(1 << 32, 1 << 32 -1); 這就是訓練所造成的差異,跟天份無關, 你的天才同學寫出兩行的 recursive,可用性跟你五行的 while 版本一樣。 都只考慮到一半不到的測試案例。 可能有的領域天份很吃重, 而且還沒有發展出工程方法, 那種窄門沒有天份的人進不去, 不過你很幸運,因為軟體開發這個領域並不是這樣。 跟天份無關,只要努力,你也可以成為一代大師。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 182.235.170.158

12/11 23:29, , 1F
喔喔喔喔喔喔喔喔喔 我搶到頭推了
12/11 23:29, 1F

12/11 23:39, , 2F
喜歡"工程化=創造藝術品的過程" 這個說法~
12/11 23:39, 2F

12/11 23:41, , 3F
12/11 23:41, 3F

12/12 00:04, , 4F
就是把火球術弄成人人可用的打火機XD
12/12 00:04, 4F

12/12 00:08, , 6F
藝術xdd
12/12 00:08, 6F

12/12 00:08, , 7F
推 把火球術弄成人人可用的打火機XD
12/12 00:08, 7F

12/12 00:50, , 8F
為什麼gcd突然變成gdb....
12/12 00:50, 8F

12/12 00:53, , 9F
XDDDDDDDD
12/12 00:53, 9F

12/12 00:56, , 10F
gdb XDDDDD
12/12 00:56, 10F

12/12 01:07, , 11F
看到沒有,可見我gdb平常的訓練多麼充足..
12/12 01:07, 11F

12/12 01:07, , 12F
奇怪怎麼會降 =_______=
12/12 01:07, 12F

12/12 01:09, , 13F
12/12 01:09, 13F

12/12 01:25, , 14F
其實是 gdb 教學文 :)
12/12 01:25, 14F

12/12 02:07, , 15F
這篇文章 1.值得推薦
12/12 02:07, 15F

12/12 02:23, , 16F
while版本比遞迴版本難吧...
12/12 02:23, 16F

12/12 05:32, , 17F
gcd(1<<31,(1<<31)-1); 可以小修正
12/12 05:32, 17F

12/12 06:36, , 18F
我會想要輸入gcd(3.5,5.3)或gcd("ab","cd")或gcd(,)
12/12 06:36, 18F

12/12 06:47, , 19F
coding OR programing?? 藝術靠的不是天分.....是培養
12/12 06:47, 19F

12/12 07:23, , 20F
gcd明明就傳int,int 哪來double string 這些東西orz
12/12 07:23, 20F

12/12 09:53, , 21F
Literate programming XDDDDDD
12/12 09:53, 21F

12/12 10:08, , 22F
推文沒講我還沒注意到...
12/12 10:08, 22F

12/12 11:15, , 23F
推,很詳細的解釋
12/12 11:15, 23F

12/12 12:26, , 24F
GCD有人在用小數點?(是我見識太少嗎= =
12/12 12:26, 24F

12/12 12:35, , 25F
推火球術變成打火機XDDDD
12/12 12:35, 25F

12/12 17:38, , 26F
推!
12/12 17:38, 26F

12/16 23:50, , 27F
gdb XDDD
12/16 23:50, 27F
文章代碼(AID): #1EvCYvp5 (C_and_CPP)
文章代碼(AID): #1EvCYvp5 (C_and_CPP)