Re: [問題] 學code要看天分嗎?
※ 引述《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
12/12 00:04, 4F
推
12/12 00:07, , 5F
12/12 00:07, 5F
→
12/12 00:08, , 6F
12/12 00:08, 6F
推
12/12 00:08, , 7F
12/12 00:08, 7F
→
12/12 00:50, , 8F
12/12 00:50, 8F
→
12/12 00:53, , 9F
12/12 00:53, 9F
→
12/12 00:56, , 10F
12/12 00:56, 10F
→
12/12 01:07, , 11F
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
12/12 01:25, 14F
推
12/12 02:07, , 15F
12/12 02:07, 15F
推
12/12 02:23, , 16F
12/12 02:23, 16F
推
12/12 05:32, , 17F
12/12 05:32, 17F
推
12/12 06:36, , 18F
12/12 06:36, 18F
推
12/12 06:47, , 19F
12/12 06:47, 19F
→
12/12 07:23, , 20F
12/12 07:23, 20F
推
12/12 09:53, , 21F
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
12/12 12:26, 24F
推
12/12 12:35, , 25F
12/12 12:35, 25F
推
12/12 17:38, , 26F
12/12 17:38, 26F
推
12/16 23:50, , 27F
12/16 23:50, 27F
討論串 (同標題文章)