前幾天重讀Eric S. Raymond的How to become a hacker,看到他推薦編程入門(mén)選用Python,突然覺(jué)得很壓抑,有了些想法。我建議編程入門(mén)的人學(xué)C或者Pascal,如果更進(jìn)一步的話(huà)可以用匯編語(yǔ)言,因為這樣能更清楚的了解底層。
下面針對一些支持選用Java, Python, C++(指用了非C特性的C++)等高級的OO語(yǔ)言入門(mén)的人可能的原因作些說(shuō)明。
1. Pascal, C太老了,過(guò)時(shí)了,平時(shí)用得很少,現在流行Java等等。
標準Pascal的確是比較老了,不過(guò)有Delphi后繼呢,說(shuō)C老恐怕就是無(wú)知了,C現在用得很廣泛,似乎sourceforge.net上的項目還是C的最多。推薦Pascal不是因為Delphi。選擇Pascal, C是覺(jué)得兩個(gè)現在很常見(jiàn),語(yǔ)法很有代表性,簡(jiǎn)潔明了。
不要動(dòng)不動(dòng)覺(jué)得什么東西過(guò)時(shí)了,COBOL還有OO版本面世,還有FORTRAN,LISP,好古老的語(yǔ)言吧,現在還用得很廣呢。
2.入門(mén)要從OO開(kāi)始,培養用OO方式思考的習慣。
首先要說(shuō)明,OO是方法,不是語(yǔ)言,初學(xué)者一入門(mén)便擺弄Java, Python, Delphi等很容易形成誤解,似乎OO=Java, Python, C++...
其次,過(guò)程式語(yǔ)言(或者說(shuō)結構化方法)的精髓不會(huì )消亡,OO里面也不可能擺脫掉一條條的語(yǔ)句、函數調用,結構化方法還是需要提倡的。OO方法不是那么容易學(xué)會(huì )的(OO語(yǔ)言的語(yǔ)法弄得很熟練不代表你懂OO),而結構化那套方法,自個(gè)寫(xiě)個(gè)千把行的程序就很能體會(huì )了,我是說(shuō)寫(xiě)個(gè)實(shí)用點(diǎn)的東西,比如試著(zhù)自個(gè)實(shí)現一些數據結構和算法,寫(xiě)幾個(gè)小游戲等。寫(xiě)個(gè)一千行Hello world等于沒(méi)寫(xiě)。
我覺(jué)得方法是實(shí)踐中體會(huì )出來(lái)的,不是看看書(shū)就能學(xué)會(huì )的,你看Design Patterns等把模式背的滾瓜爛熟很可能會(huì )陷入過(guò)度設計的泥潭,你寫(xiě)了幾千行代碼,然后再去讀一讀,改改調試調試,慢慢增加功能,你就會(huì )發(fā)現自己代碼寫(xiě)的有多么臭了,然后看看書(shū)聽(tīng)聽(tīng)別人意見(jiàn)你就知道什么叫Best practice了,最好的經(jīng)驗就是在焦頭爛額之際得到的。
過(guò)程式語(yǔ)言的代碼一般比較簡(jiǎn)練,我們編程序最終的目的是要解決問(wèn)題,是要計算,是要獲取信息,不要被OO, pattern, EJB, Web Services等迷糊了(我不是反對這些技術(shù)).
強烈建議各位多讀代碼,你去看看萊昂氏的那本UNIX v6源碼分析,仔細看,慢慢看,你就能體會(huì )到什么叫精致的代碼了,然后嘗試按照那個(gè)風(fēng)格寫(xiě)代碼。
3.過(guò)程式語(yǔ)言弄久了,很難轉入OO的思維模式
我以前也沒(méi)有深想過(guò)這個(gè)理由,不過(guò)時(shí)間久了,發(fā)覺(jué)自己不過(guò)是把數據和方法集中在一起而已,看著(zhù)方便,其實(shí)有很多不合理的東西,這里頭就需要OO的理論指導了,還是需要時(shí)間來(lái)體會(huì )。我相信有很多用OO語(yǔ)言的人也不過(guò)是在框架里頭添添代碼,調用來(lái)調用去而已,把人類(lèi)當作數據和操作的打包器。
個(gè)人覺(jué)得只有在用過(guò)程式方法做了十來(lái)年,編碼上十萬(wàn)行后才有思維定勢,難以習慣用OO的眼光看待系統,然而這個(gè)轉變,我仍覺(jué)得比改變一個(gè)人的惡習容易許多。OO方法不是學(xué)了個(gè)Java, Python, C++等就能掌握的,需要實(shí)踐,需要時(shí)間。過(guò)程式語(yǔ)言也容易培養一個(gè)人嚴謹的做事態(tài)度,比如用Pascal, C等寫(xiě)代碼,沒(méi)有namespace,沒(méi)有function overload, 沒(méi)有reference(Pascal有,呵呵,我喜歡),沒(méi)有template, 沒(méi)有exception, 你要花很多心思處理一些細節,比如警惕數組索引越界,懸掛指針,野指針等等,請不要覺(jué)得麻煩,這個(gè)就是計算機啊,底層就是這樣的啊。 4.別用C, Pascal了,看我用Java, Python, Delphi, VB, VC等輕輕松松就寫(xiě)了個(gè)PP的GUI,NB的分布式應用...
這篇文章是給初學(xué)者看的,也可以給一些浮躁的人看看(我也反省,呵呵),初學(xué)編程的人精力應該放在數據結構、算法上面,盡量多看一些底層的東西,數字邏輯,操作系統,編譯原理,計算機組成、體系結構,計算機網(wǎng)絡(luò )等等基礎知識。編寫(xiě)GUI拖幾個(gè)控件有什么好吹的,你懂界面設計的原則么,你知道窗口消息怎么回事么,你編的界面是把易用放在第一位呢還是把漂亮放在第一位呢,你的GUI程序容易修改嗎?比如我一會(huì )要加個(gè)button,一會(huì )去個(gè)listbox,你會(huì )不會(huì )改的瘋掉呢?你是不是在OnClick里頭寫(xiě)了大段大段的代碼,做類(lèi)似“從edit1.text中去掉不是數字的字符,搜索xxx再轉成16進(jìn)制,再復制到edit2.text”的事?
嗯,你socket弄得熟練,recv來(lái),send去,可是如果你不懂tcp/ip協(xié)議那就有點(diǎn)可笑了,除了用別人做好的函數庫你還能搞出什么新花樣?弄分布式應用的知道“分布式”怎么回事嗎,
你是否只是在用API堆砌代碼呢?倘若有一天這個(gè)函數庫沒(méi)人支持了,你是不是就傻眼了?
比如編游戲,沒(méi)看過(guò)3D圖形學(xué)便搞DirectX,也是比較可笑的。
我并不是說(shuō)你編比較高層的東西就必須先得透徹了解底層怎么實(shí)現的,我只是建議你好歹把底層的東西混個(gè)臉熟,遇到問(wèn)題時(shí)心里有個(gè)譜,查查資料,別動(dòng)不動(dòng)撲某個(gè)論壇求救。以前在BBS上看到某人的話(huà),說(shuō)BBS不是學(xué)習的地方,是開(kāi)拓眼界的地方。深以為然。
學(xué)習還是找紙版的書(shū)老實(shí)的看比較好,想想你積攢了多少電子書(shū)而又看了多少。
底層不了解,僅多也就飄在別人上頭,別人一閃身,你就得摔下來(lái)。
初學(xué)編程的人一來(lái)就IDE, GUI, Network啥的猛搞,能不浮躁么?還是沉下心來(lái)研究一下基礎知識吧,我以腦袋擔保你有生之年會(huì )覺(jué)得他們有用的(呵呵,你轉行我就沒(méi)轍了),別看著(zhù)別人弄JFC, Socket了你還在頭大這個(gè)quick sort怎么就不對呢就心里惶惶的,你要知道在一批API不被支持后不少人心里空空的沒(méi)個(gè)著(zhù)落:天啊,我除了那個(gè)就啥都不會(huì )了,郁悶啊,花了我那么久時(shí)間鉆研那套API,嗚嗚。。。。
5. C好難啊,我入門(mén)還是從Java,Python開(kāi)始吧
首先,是自個(gè)要做程序員的嗎?是想編程還是想賺錢(qián)???
其次,我們來(lái)比較一下難易:
C: k&r那本書(shū)真的不算厚,經(jīng)典的C的書(shū)很少,說(shuō)C難,大概是傳說(shuō)中C的指針很難吧,C的語(yǔ)法很簡(jiǎn)明的,就是指針,只要你認真看看書(shū),寫(xiě)幾個(gè)程序試一試,那幾個(gè)指針的用法不難掌握,另外大家千萬(wàn)不要去死鉆*++ ++*之類(lèi)的語(yǔ)法,關(guān)于這點(diǎn)在《開(kāi)發(fā)高手》最后一期上裘宗燕老師有一篇精彩的文章。大家記住寫(xiě)代碼是要維護的,別耍弄語(yǔ)法技巧給自己或后人制造麻煩,你想想自己看別人寫(xiě)的天書(shū)代碼是贊嘆還是咒罵?
Java: 書(shū)太多了啊,就說(shuō)Gosling(沒(méi)拼錯吧)那本,相當厚,學(xué)Java的人一開(kāi)始都被classpath和package的問(wèn)題煩過(guò)吧,還有Java的關(guān)鍵字,語(yǔ)法,Sun鼓搗出來(lái)的一堆堆Java技術(shù)名詞,是不是有點(diǎn)暈了?
C++的確有難度,你可以看看C++語(yǔ)言的設計和演化,就可以知道C++怎么這個(gè)德行了,呵呵。有意思的是Java現在加入模版,而且因為偽模版的實(shí)現被人詬病,還有那個(gè)EJB的轉變,有意思,大家可以思考一下“復雜”、“實(shí)用”這些詞。
Python的確比較清爽,不過(guò)深入一點(diǎn)后其內部對象模型也不簡(jiǎn)單,想想操作一個(gè)列表有多少方法,各種功能強大的操作符,而且現在的OO語(yǔ)言逼著(zhù)你OO, 結果往往是語(yǔ)法OO而已,沒(méi)多大新意,我還是欣賞Perl, C++這類(lèi)語(yǔ)言,你想怎么就怎么,重要的是要用合適方法,趁手工具,最少的時(shí)間做有價(jià)值的東西,把你鉆研語(yǔ)言的語(yǔ)法的時(shí)間拿來(lái)鍛煉一下身體,泡杯茶看看小說(shuō)我覺(jué)得更好一些。
語(yǔ)言只是表達思想的工具,不要只局限于一種語(yǔ)言,不要狂熱于某一門(mén)語(yǔ)言。
學(xué)編程時(shí)選書(shū)最好先看一看書(shū)中的代碼,是取自實(shí)際應用中的嗎?寫(xiě)的漂亮嗎?(指代碼自身的精致,以及排版是否工整)代碼中有語(yǔ)法錯誤嗎?(鄙視某些沒(méi)編譯試試就把代碼copy到書(shū)里的作者)
有本Essential C#,取的是.Net類(lèi)庫的代碼,很棒,講delegate(希望沒(méi)拼錯,好久沒(méi)弄這個(gè)了)時(shí)舉的例子很清楚地讓人看到這個(gè)東西該怎么用。
另外推薦Learning Perl,我個(gè)人覺(jué)得是我看過(guò)的最好的關(guān)于編程的書(shū),該講么,不該講什么,按什么順序講,很好,也許是Perl的精神的感染吧,當初看這本書(shū)很有震驚的感覺(jué),原來(lái)程序設計語(yǔ)言還可以這么使!爽!
斷斷續續寫(xiě)了這么長(cháng),xxx的xx布,又x又長(cháng),呵呵,希望大家踏實(shí)一些,不要浮躁。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。