看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《truesword ( )》之銘言: : 標題: Re: [問題] 何謂寫得漂亮? : 時間: Sun Jan 17 20:59:11 2010 : : ※ 引述《tinlans ( )》之銘言: : : 你說的很好,但我不完全同意 : 我認為寫程式還是有一些優美之處所在,用藝術這字眼來形容也不為過 : : 還記得大一首次學寫程式的時候,要寫個作業產生費伯納西數列 : (就是以 0, 1為起點,後面的每個數都是其前兩項數值的和) : : 當初想了老半天,打算用一個數值紀錄index,進而計算index+1所存的數字 : 後來發現課本用遞迴可以寫出很簡潔的程式,但缺點是速度慢 : : 然後一個天才室友,跟我一樣也是初學,看了看題目,也沒google,想了幾秒之後 : int a=0,b=1; : for(...){a=a+b; b=b+a;} 你說的很好, 但我完全不同意 請問這種程式跟 int an_2 = 0; // an-2 int an_1 = 1; // an-1 int a_n; // an for(...) { a_n = an_1 + an_2; an_2 = an_1; an_1 = a_n; } 本質上有差嗎? 我是不知道你們的作業是什麼, 但是光你要使用你產生數列的值就要分奇數項偶數項. 除此之外, 我想你 ... 填出來內容應該也真的是讓人點點點 你還活在記憶體不能多花4個byte, 一個 loop cpu 不能多跑一個指令的年代嗎? 這種程式你一個月後看到還可以馬上看出他是 fibonacci ? 你要不要考慮參加國際c語言混亂代碼大賽阿 ... : : 兩行搞定,簡潔速度又快 : : 雖然這題目現在看起來並不難,或許網路上也有這樣的答案 : 但當時我真的感受到很大的震撼,僅僅數秒鐘,竟然可以寫的這麼優美... : : 附帶一提,我覺得資料結構及演算法也蘊含許多藝術成份 : 現今,雖然這些幾乎都被視為基礎知識,lib也大量被使用 : 但我覺得,當初發明出這些使用方法,以至於大家將它標準化的人,真的稱得上為藝術家 : : -- : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.115.73.87 : ※ 編輯: truesword 來自: 140.115.73.87 (01/17 21:00) : 推 YCK:同感 01/17 21:01 : 推 in09:說得很好 01/17 21:01 : 推 ledia:這.... 有特別美嗎 @__@ 01/17 21:03 : → truesword:你不覺得這樣的想法既簡潔又能命中要害嗎XD 01/17 21:04 : → ledia:不會耶 XD 不是一般人都會這樣寫嗎 ? 01/17 21:05 : → ledia:遞迴的寫法反而是需要練習的 01/17 21:05 : 推 loveme00835:是很美阿, 藝術需要你用不同的觀點去看的, 有成見的人 01/17 21:09 : → loveme00835:就不覺得藝術是重要的 01/17 21:09 : 推 ledia:如果到處看到的都是同等級的東西, 就不會覺得特別美了 01/17 21:15 : → ledia:就像第一次學 functional language 時也覺得各種用法都很美 01/17 21:16 : → ledia:現在看起來只會覺得寫得好的程式很流暢, 反而不太有驚喜 01/17 21:17 : → ledia:因為已經成為必要的標準了 01/17 21:17 : → loveme00835:樓上怎麼會想就程式碼來劃分等級呢 ? 01/17 21:18 : → ledia:回應 tinlans 所說, 變成一種 engineer 了 01/17 21:18 : → ledia:前一篇說很多了, 我就不獻醜了, 至少先從 patterns 開始看吧 01/17 21:19 : → ledia:我的表達能力沒有上一篇 t 大好, 如果他的文章你看不懂... 01/17 21:20 : → ledia:那我大概更難解釋得更好 orz 01/17 21:20 : → loveme00835:"那些艱澀難懂的舊時代程式碼早就變成垃圾和毒瘤了" 01/17 21:22 : → loveme00835:我最不同意這句話, 因為說話的人必須考慮時空背景 01/17 21:23 : → loveme00835:以及寫程式的人的用意, 他那篇文章讓我覺得好像是現在 01/17 21:23 : → loveme00835:的人笑古代拿弓箭打仗很愚蠢一樣 01/17 21:24 : → in09:樓上可不可以show幾段你看到的"一般人的寫法" 01/17 21:24 : → in09:是樓樓上 01/17 21:25 : → loveme00835:我倒覺得一般人好像是是用矩陣乘法來做, 等級不同? 01/17 21:27 : → tinlans:每個人對藝術的堅持和觀點不同,team work 易起爭執和歧見 01/17 21:27 : → tinlans:往往同樣功能的 function 每個 programmer 就各自在同一個 01/17 21:28 : → tinlans:專案裡維護自己看得順眼的版本,讀的人看到明明是不同名稱 01/17 21:28 : → tinlans:的 function,但是其實做的是同一件事。 01/17 21:28 : → tinlans:藝術應用在程式裡常常帶來這些爭執。 01/17 21:29 : → tinlans:而那句話在說的是把弓箭拿到現代來打仗很愚蠢的意思。 01/17 21:30 : → loveme00835:那就是不同情況下囉, 又不是工程和藝術不能共存 01/17 21:30 : → loveme00835:其實工程學本身就算是門藝術 01/17 21:31 : → loveme00835:我覺得思想的延續是必要的, 但是不要固執於實現就好 01/17 21:32 : 推 ledia:工程學如果能當成藝術的話, 就沒有所謂的工程標準可言了 01/17 21:32 : → ledia:畢竟藝術個型式是很難有個舉世皆準的標準的 01/17 21:33 : 推 ledia:頂多是新技術進展太快 "尚未" 將標準型塑出來 01/17 21:35 : → loveme00835:怎不想成大家用不同的思維, 實踐標準呢 ? 01/17 21:36 : → ledia:用什麼思維來達成標準並不重要, 重要的是藝術沒有這種標準 01/17 21:37 : → ledia:而這是工程和藝術最格格不入的地方 01/17 21:37 : 推 yoco315:不衝突啦,ㄎㄎ... 01/17 21:38 : → ledia:簡單的說, 藝術沒有一個評分的標準, 但成熟的工程裡通常有 01/17 21:38 : → tinlans:今天如果你寫的程式出現錯誤會死十萬個人,你想選擇用自己 01/17 21:41 : → tinlans:覺得很有創意極具藝術價值的程式碼,還是已經經過千錘百鍊 01/17 21:41 : → tinlans:都沒出過問題的程式碼或設計方法? 01/17 21:41 : → tinlans:我倒是認為藝術跟工程是先後關係,工程是從早期的藝術裡挑 01/17 21:43 : → tinlans:選出最適合、通用、有效、穩定的一種,但被選上的未必讓人 01/17 21:44 : → tinlans:覺得它富有藝術價值。 01/17 21:44 : → tinlans:有時候也未必是挑選,而是妥協和結合,這點從近代 OO 的發 01/17 21:47 : → tinlans:展和演進就可以看出來。 01/17 21:47 : → ksmrt0123:就說the art of... 的art 不應該譯成藝術了... 01/17 22:06 : 推 StubbornLin:工藝 01/17 22:11 : 推 StubbornLin:藝術本來就沒有標準可言,極致的工程也是一種美 01/17 22:16 : 推 Savate:好強大的思維啊!!!!!!!!!!!!!!!!!!!!(崩潰) 01/17 22:19 : 推 Savate:原波這篇的答覆跟我原本的解讀一致呀 01/17 22:30 : → final01:那個費柏納 你室友是用數學的方法吧 01/17 23:31 : → final01:其實l大是你室友? 01/17 23:34 : 推 Savate:看到你這強大的室友 我開始也懷疑自己是否有天份了 ~.~ 01/17 23:43 : 推 cplusplus:個人也覺得大架構如果設計得很好也是一種美~ 但是那種 01/17 23:48 : → cplusplus:美是由設計得當的架構顯現出來的~ 我覺得說一個程式架構 01/17 23:49 : → cplusplus:是藝術不代表那些程式碼不工程化(?)~ 而且有些設計 01/17 23:50 : → cplusplus:並不是照標準流程就可以生出來的~ 個人看法 01/17 23:50 : → tinlans:我是覺得現代的好程式,就是你的程式長得跟 pseudo code 01/17 23:53 : → tinlans:幾乎一樣,中間沒有其它冗餘的雜質,甚至能當英文文章來唸 01/17 23:53 : → tinlans:,這樣就很好了。 01/17 23:53 : → tinlans:不過要做到這樣,背後要付出的努力遠比上面三句話多。 01/17 23:56 : → tinlans:說起來這篇好像是回我的。其實不是我故意不回應對那兩行程 01/18 00:05 : → tinlans:式碼的看法,而是我苦思了很久不知道怎麼回才比較不會傷人 01/18 00:06 : → tinlans:和給人打擊... 01/18 00:06 : → softwind:不用再漂亮了 早點下班陪老婆小孩比較"漂亮" 01/18 00:22 : → loveme00835:pseudo code + 1 01/18 00:24 : 推 Savate:以前我上資料結構都講到用遞廻 我沒想到 天哪不行 01/18 00:28 : → Savate:那一行 for(...){a=a+b; b=b+a;} 一直在我腦中盤旋啊 01/18 00:28 : → sunneo:-.- ... 你在反諷嗎 01/18 00:28 : → tinlans:其實工業界解決這類效率問題真正的殺招是查表法,一行搞定 01/18 00:36 : → tinlans:而且時間複雜度 O(1),只是 effort 都在其它地方了。 01/18 00:37 : → tinlans:有人跑迴圈寫從 1 加到 100,有人直接寫 (1+100)*100/2, 01/18 00:45 : → tinlans:這個東西其實不在「程式面」,而是在更之前的東西,跟我前 01/18 00:46 : → tinlans:篇要講的東西是在不同的點上。 01/18 00:46 : 推 yayarice:這個code讓你絕得? 實用? 新奇? 生氣? 無聊? 01/18 00:50 : → tinlans:等到你接觸到百萬行級的程式碼並成功駕馭它之後,你可以再 01/18 00:51 : → tinlans:回頭來看看現在寫的東西。我大概只能這樣回了... 01/18 00:51 : 推 Savate:應該是說他室友想出一個比課本還簡單的那種思維讓我震撼 01/18 00:51 : 推 Savate:奇怪!是我少見多怪嗎? 我覺得它室友當時是初學者卻能想出 01/18 01:14 : → Savate:化繁為簡的寫法 真的很了不起啊 別忘了他那時是初學者 01/18 01:15 : → Savate:如果又讓它擁有更多看程式碼的經驗 起不是強到飛天了? 01/18 01:16 : → tinlans:我是沒有別的意思啦。只是在想,藝術這東西在每個人眼中果 01/18 01:51 : → tinlans:然有極其巨大的落差。我也不打算否定別人對藝術價值的觀感 01/18 01:53 : → tinlans:,反正這東西還是會隨著時間流逝和經驗的累積而改變的。 01/18 01:55 : 推 Savate:嗯嗯 ^^ 01/18 02:20 : 推 dexders:遞迴只應天上有,凡人該當用迴圈。 01/18 03:14 : → loveme00835:樓上...XD 01/18 03:27 : 推 forcetod:其實我覺得執行效率和易讀性有時不可兼得 而大量的註解和 01/18 10:21 : → forcetod:輔助圖形也可能增加理解程式碼的時間 一點淺見.. 01/18 10:22 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.243.43
twnin:角度不同而已,解問題要精簡,寫程式要易懂。 04/23 18:31