精華區beta Programming 關於我們 聯絡資訊
※ 引述《alostw.bbs@bbs.wretch.cc》之銘言: > 我自認為自已的程式底子還不錯~ > 可是我的程式卻無法從頭到尾全部的寫出來(我會完全沒有頭緒XD...) > 可是只要是交作業或是上機考~我郤有辨法交出東西來~ > 我們的程式老師說~上機考你任何的程式都能帶~ > 我就是用那些程式中拼湊出我的分數的~ㄏㄏ > 老師的意義應該是要我們的懂的怎麼用那些程式吧~而不是死背 > (我是屬於無法自已單獨寫出一支程式的人...XD) > 其實我覺的只要底子打的好~任何程式都只是語法不太同而已說 這樣的說法是不對的, 如果你還是處於拘泥在語法的階段.... 並不代表你真的會使用這個語言, 語法這種東西,在任何語言中都只是初步, 更進一步應該理解的東西是語義, 透過對語義的理解你才能把語言本身變成你的, 以 C/C++ 來說, int x = 10; 和 x = 5; 這兩道 statement 中的 = 號, 具有不同的語義,前者叫初始化,後者叫指定, 4 / 10 和 4.0 / 10 的 / 號, 也具有不同的語義, 前者是整數除法,後者是雙精度浮點數除法, 其中還隱含了整數-浮點數轉換,會把 10 換成 10.0。 C++ 本身複雜的不只是語法,還有語義的部分, 這是很多學 C++ 的人忽略掉的一點, 明明寫的東西符合語法,但是結果卻不是自己想要的。 而 C 通常比較不會有這種事, 除了剛剛講的運算子語義常造成所謂的月經題。 語言熟悉以後你還必須學會使用函式庫, 就基本原則而言, 你熟悉一個語言之後便不應該再翻書, 就能寫出「不使用函式庫」的簡單程式, 而使用函式庫這種東西大多時候需要翻書或翻線上文件, 因為這種東西通常比較難記,除非你真的很常用。 要把程式寫好, 你首先當然要瞭解語言的語法跟語義, 其次就是熟悉附在語言標準裡的標準函式庫, 而後你應該學習去網路上找其它函式庫來用, 你也應該漸漸將自己常用的程式碼整理成自己的函式庫。 表面上看起來做到這樣已經是很強了... 沒錯,在學校裡看起來或許已經擁有數一數二的實力, 但在現實嚴苛殘酷的社會裡, 這只算是從入門走到基礎打穩而已, 一切才剛開始。 接下來就是你要嘗試去累積解決各種問題的經驗, 而這個經驗的累積方式,不一定要寫程式, 但是絕對不能不寫程式。 方法大致上有三種:讀書、看別人的程式、自己寫程式。 自己寫程式,這很直觀,我想就不必多說了。 讀書很重要,不要小看書所累積下來的前人智慧, 「資料結構」跟「演算法」隸屬資工本科系必修課程, 主要原因也在於這裡面有很多解決問題的方式, 別人解決過的問題你不需要再解一遍, 你也能看看前人是怎樣在解決問題的, 順便自己也學起來。 看別人的程式,這也很重要.... 你想要變強,你至少必須看懂國產 bbs 的原始碼這種規模的程式, 事實上這類 bbs 程式屬於小型系統,所以很適合當成練習對象, 要把程式寫好,想辦法看懂一個小型系統原始碼也是很重要的一環。 一個小型系統至少解決了數十種問題, 而它所解決的問題並不像書上所說的那麼抽象, 通常都是很實際的問題,因為這是實際在運作的程式, 除此之外,以 bbs 為例, 你還能學到基本的 network programming 技巧, telnet 通訊協定,甚至 smtp 協定, 或許你還能瞭解怎樣去跟 DNS Server 查詢, 你也能瞭解 news group 是怎樣運作的.... 如果你看的是 web 形式的 forum 系統, 你可能還學得到怎樣使用 database 以及 SQL 語言... 但是如果你看這些的目的只是為了模仿, 只是在有需求的時候才去看這些程式的片段然後改成自己的, 那麼這樣做只是將你自己逼回還在打基礎的階段, 即使表面上看起來你能寫的程式種類的確變多了, 但是你的程式能力只是廣向拓展,而非深度擴展.... 這兩者的差異相當大, 以現實而論,這決定了你在一間公司的可取代與不可取代性, 也許現在你可能還聽不懂,不過也沒關係。 那充分累積這些解決問題的經驗,這樣就算寫好程式了嗎? 還沒有,知道怎樣解決問題,但是程式還是得有效率的執行, 你應該要學習怎樣寫出有效率、省資源的程式, 甚至是在特殊環境下必須要能夠順利執行的程式。 要達到這個目的除了動手實驗, 最重要的還是讀書跟逛討論區, 這種東西和程式語言本身也有一定程度的相依, 如果到這個階段還說「程式語言只是工具,所以我不必那麼強」, 那又是一種劃地自限,又是一種讓自己退步的理由。 同樣的我舉 C++ 為例, 它在語言本身就有累積業界工程師的書籍存在, 像是 Effective C++、More Effective C++、Exceptional C++、More Exceptional C++, 事實上這些書籍有的是作者收集和重整過網路討論的內容彙編而成的, 所以逛討論區也很重要,參與討論更是重要... Inside C++ Object Model 這類的書更會探討語言上某些特性的效率問題, 諸如此類,其實很多東西都跟語言特性相依, 甚至某些情況下你還必須有能力選擇正確的語言來開發你的程式。 在很多情形下, 語言本身的特性將影響到演算法是否能真正發揮它理論上應有的威力, 同樣是時間複雜度 O(nlogn) 的程式, 某些語言寫起來是 300 * O(nlgn), 某些語言寫起來是 50 * O(nlgn), 如果是做純理論的人看到這個, 會很不屑的說還不都嘛是 O(nlgn), 前面的常數比較小又沒什麼屁用, 然而現實環境是很殘酷的,它就是有差。 不只是時間複雜度,空間複雜度也是類似的狀況... 所以程式要寫好還有一個原則,就是不能讀死書。 程式要寫好,跟「可以寫出的程式種類比較多」是兩碼子事... 所以我不會跟你說,要多去修一修外系的課程, 知道如何使用他們的知識解決他們的問題等等的話, 雖然這也很重要,但這不是這個討論的核心, 而且其實大家都懂,就不多說了。 -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Chung Cheng University Department: Computer Science and Information Engineering Researching: Porting GCC and Implementing VLIW instruction scheduler in GCC Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:218-171-151-242.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 -- * Modify: tinlans 05/04/03 4:44:11 <218-171-151-242.dynamic.hinet.net>
keany:good article! 59.115.146.223 04/03
kewang:借轉 220.135.159.16 04/04
alentek:寫的很好 推 59.104.131.18 04/05