java Ubuntu Firefox apache 编程 程序员 linux php 开源 centos shell 云计算 Python 微软 Windows mysql nginx wordpress Android google

對‘初學者應該選擇哪種編程語言’的回答——計算機達人成長之路(38)

7、PASCAL語言(一)一門通,門門通

在計算機學習問題排行版上,有一個問題絕對是穩居榜首,每次提出都能在各大論壇掀起一股頂帖風暴,而各大網站的每個網絡大牛,都會收到無數學院小弟發來弱弱的提問,這個排行榜第一的問題就是:
“我是一名XXXX學院的學生,我們學校……(此處省去一百字),有同學去參加了JAVA的培訓,現在可以編寫很多Java程序。但是我特別喜歡C++語言,希望可以深入學習C++。不過又有幾個畢業的學長說,懂“.net”更容易找工作,……(此處省去二十字),請問X老師,我該怎麽辦?”
是不是覺得特熟悉,是不是都曾有過類似的疑問,作為一個所謂的網絡大牛,木鴻飛就曾無數次的接收到如此的郵件,請看他的回答。
答:對大學生而言,不要糾結於學習哪一門語言好,也不要去思考哪一門語言容易找工作。計算機語言是相通的,學習若幹門排名靠前的流行語言,然後選擇其中一個或兩個最感興趣的深入編程即可。
如果木鴻飛將以上內容發為帖子,各位同學的回信作為應答,那麽這個帖子可能是這樣的:
一樓:沙發!
二樓:好東西,可以圍觀!
三樓:謝謝,老師真給力!
…….
N樓:老師,學習若幹門排名靠前的流行語言,不就是全部都學習嗎?哪裏有時間啊!
N+1樓:還是只學習一門語言,專一比較好吧。
……
M樓:嚴重同意N樓的意見,如果全部都學我們還來問樓豬幹什麽!
M+1樓:9494,難道樓豬會那麽多語言嗎?
M+2樓:樓上的,老師好厲害的,你嫉妒羨慕恨吧。
……
看來很多同學還是不明白,總結大家的觀點,無外乎兩個極端:
極端一:弱水三千,只取一瓢。持該觀點的同學認為,學習語言就如同娶老婆,都需要細細品味。因為計算機語言博大精深,究其人的一生,能精通一門語言就很不錯了,至於癡心妄想者妄圖左擁右抱,腳踏兩只船,其下場必定是雞飛蛋打,鎩羽而歸。
極端二:遍地開花,蜻蜓點水。此該觀點的同學認為,為了將來找工作方便,必須了解所有的最新最流行的以及將來可能流行的語言,總之必須保證在計算機軟件業界永葆時髦,才能在日新月異的技術更新和激烈的職場競爭中立於不敗之地。
由此極端想法不是同學們錯,而是語言惹得禍,誰讓現在的語言太多太強大,網絡攻勢太猛太熱烈,就算心如鋼鐵也會眼花繚亂從而不知如何是好。
相對而言,木鴻飛那個時代就要幸運的多,沒有多如牛毛的語言供選擇,也沒有所謂新穎的概念利用互聯網地毯式的轟炸,學校只開設了Pascal語言課程,數據結構使用的也是Pascal版本,同學們只能乖乖的使用Pascal編寫各種課程設計。但在當時的IT業界,這門語言幾乎毫無立錐之地,幾乎沒有公司使用其作為編程工具。按照世俗的眼光,只開設了Pascal語言的學校培養的必將是一群老古董,必定一畢業就失業。
不過事實並非如此,木鴻飛清楚的記得,那年夏天,除去考研的、轉行的和真的不學習的,同學們幾乎都找到了與計算機軟件開發相關的工作,而工作涉及的開發語言或工具則五花八門,VC、VB、Unix、Delphi、C++Builder、ASP、PHP、Java等等應有盡有。曾幾何時,同學們居然學會了這麽多種類的語言,學校根本沒有開設這些課程,他們是怎麽做到的?
其實並不神秘,“一門通,門門通”而已。由於環境的限制,同學們在大一大二只能老老實實的使用Pascal編寫各種課程設計,表面上看起來很落後,很OUT。但實際上長期使用同一個簡單的編程工具設計程序,免去了編程工具本身使用方法的學習,可以集中一切力量投入到程序本身的設計上去,在一個、兩個、若幹個課程設計的完成過程中,逐漸熟練的掌握了編程思想與技巧,牢固了編程基礎知識。待到大三或者大四之時,編程能力有了相當水準。同時外界網絡趨於發達,見識逐漸擴大,發現外面的事件如此精彩,外面的編程語言和工具如此爭鳴。於是紛紛選擇自習喜歡的或者傳說中最強大的語言。學習之初,大家也曾高唱神曲忐忑,畢竟沒有老師教,咱不專業啊。但是過程卻出人意料的簡單,結局卻出人意料的美好,新的語法似曾相識,編程方法大同小異,即使有所不明白,回想Pascal編程,從熟悉到未知,大家如有神助般迅速掌握了新的語言和工具。
木鴻飛的歷程正是如此,從QBasic到Pascal,再到C、VB、C++、ASP、Java……,一步步走來,木鴻飛掌握了如此之多的編程語言和工具,但並非每一個都是從頭開始,並非每一個都是真正意義上的深入精通。其中有的,木鴻飛紮紮實實的學習了、使用了、理解了一年、兩年、若幹年;有的,木鴻飛只是快速一瞥,匆匆而過,但也能談論的頭頭是道,不懼設計程序;有的,雖然是第一次接觸,還未熟練掌握,卻也能夠開發、設計程序,甚至修改別人的代碼。
語言是相通的,“一門通,門門通”,精通一門編程語言後,很容易掌握其他的編程語言。這並不是天方夜譚,它沒有想象中的那麽神秘,讓我們撥開其神秘的面紗,見見其廬山真面目。
成功開發軟件,拋開外在因素不算,其核心有五要素,一曰分析,二曰語法,三曰系統,四曰設計,五曰工具。
分析者,系統分析也。開發項目伊始,總要分析該項目的前前後後左左右右,收集需求,區分對象,劃分模塊,建立最適合的模型,選擇最合適的設計方法,這一切與語言無關,其分析能力卻又能在多次項目設計中累計和增長。
語法者,具體編程語言的用法也。比如賦值語句,在C語言中為“=”,而在Pascal中為“:=”;比如選擇語句,在某些語言中是“if …….else……”,而在另外一些語言中卻為“if … then begin ……end else begin ….. end”;再比如一個完整的語句,在某些語言中以“;”結尾,而在另外一些語言中無需添加任何符號。再比如訪問數據庫,普通情況下將sql語句存儲為字符串後再執行,但在嵌入式數據庫編程中卻直接在程序中執行,而無論C/C++程序、Java程序、delphi程序還是asp/php程序,其操作數據庫的sql語句都是一樣的。所以說,不同的語言,其語法描述雖然有所不同,但其邏輯結構卻大致相同。大家都有分支語句、都有賦值語句、都有表達式等等,不同的僅僅是具體的描述而已。而即使這為數不多的特性描述,也逐漸大同小異起開。君不見賦值語句中都有等號,表達式都有加減乘除和括號,分支語句都有“if”,類都叫“class”,公有都是“public”。同學們,當大家學習一門新的語言時,卻發現其語法邏輯結構相似,還有很多的老朋友各司其職,怎能不迅速上手呢。
系統者,操作系統或者設計平臺也。比如在Unix下常常使用消息隊列、共享內存,而在Windows下則可直接調用Win32 API,這些都是操作系統的異同導致,與語言也無關。
設計者,編程代碼之技巧也。采用什麽數據結構,使用何種遍歷方式,調用哪些函數過程,慣用何種編碼習慣,這些都是在編寫代碼時需要具體考慮的問題,在不同的語言中雖然它們的具體表達有所不同,但不同點也僅限於此而已,體現在代碼下的思想和邏輯不會隨著語言的更改而更改,最多不過改個命名,換湯不換藥。
工具者,編程軟件也,包括集成開發環境、提供的獨特設計類庫以及多如牛毛的第三方控件和API接口等。這部分內容才是使用一門新語言真正的攔路虎。理由三:
其一,一般來說,每一種語言都有一種或者若幹種由不同公司生產的集成開發環境,而不同語言之間很少有相同的集成開發環境,這就導致學習語言時必須花費大量時間去熟悉集成開發環境上。最可氣的是,當你換一種開發工具時,又需要重新熟悉新的內容,比如VC、C++Builder與DEV C++的IDE界面就大相徑庭,這也導致很多同學誤解,常常將VC、CB還有C++相提並論,誤稱為三種C++語言。
其二,每個公司在提供習慣完全不同的開發工具的同時,也會提供獨特的設計(類)庫。比如微軟公司提供了MFC庫,寶蘭公司則開發VCL與其抗衡,這兩個產品本身就是一個宏大而復雜的類庫結構,估計程序員中少有如庖丁解牛般全量精通每一個細節者。
其三,軟件系統的開放性使第三方控件成為可能,於是這些控件如雨後春筍般冒出頭來。本來,控件多是好事,可以降低開發強度和避免重復性開發。但不同的控件由不同的公司開發,實現著不同的功能,所以其使用方法大不相同,程序員要牢記每一個控件的用法確屬不易。而且一些軟件開發公司還會針對其特有的領域提供專門的函數庫,當你進入這些公司時,除了學習新的語言和新的編程工具外,還得學習這些獨特的庫函數,這在無形之中也增加學習新語言的難度。
綜上所述,編程開發語言的五要素中,語法、分析、系統和設計皆不足為懼,唯獨工具最難,很多人學習新語言不順就敗在工具上,所以產生怯意,不願學習新的語言。
其實大錯特錯,語法、分析、系統和設計這些才是編程設計的內涵,而工具只是工具,它終究應為人所用,不可奴禦人們。那麽怎樣才能笑傲工具,其實也是有方法的,今天就一並奉上。
笑傲工具第一招,三十六計,走為上計。惹不起還躲不起嗎。大學生在學習一門新語言時,要盡量避免使用哪些花俏的、時髦的但是卻相當復雜的東東。比如用VC學習C或C++時,就不要陷入MFC的復雜類庫中,盡量使用SDK編程。習作習作,學習才是核心,沒有人會去關心皮膚界面的。
笑傲工具第二招,好讀書,不求甚解。某些功能或界面,雖然盡量避免但有時真的需要,比如編寫一個帶各種控件的Windows界面程序,還使用SDK就真屬不智,不如大膽的使用各種可視化編程工具,比如VC、VB等。但是切記,僅僅使用即可,千萬別刨根問底。例如拖曳了一個按鈕控件,雙擊之,然後窗口會自動跳轉至該控件的單擊響應函數,直接在裏面填寫代碼即可,別自找煩惱,去思考為什麽這個函數能夠在單擊按鈕控件後執行之類的問題。
笑傲工具第三招,慧眼識珠,重點突破。在前兩招中,第一招用於初學階段,第二招適合與學有小成階段,但是它們都有一個共同的缺點,就是逃避,逃避困難的東西,當然也可以稱之為戰略性撤退,聚集力量準備攻擊。但無論是逃避也好,撤退也罷,有一個事實卻無法回避,那就是總會有與這些回避的東西正面交鋒的時候,畢竟出來混總是要還的。尤其是大家進入公司,開發生產軟件時,不可避免的需要使用開發工具所提供的類庫、第三方控件、甚至公司獨有的類庫,此時必須正面應對!
但正面應對不是全面應對,切忌不可胡子眉毛一把抓,力圖把所有的東西爛熟於心。可以在眼花繚亂的世界中分清敵我,找出本次應用所需要的東西,然後予以重點突破。打個比方,假設某項目使用VC編程,需要操作數據庫,於是捧來了若幹本諸如“VC++編程從入門到精通”之類的大部頭書籍,翻開第一本書的第一頁,開始沒日沒夜的加班,沒日沒夜的苦讀,……,打住,打住!這樣子做是不會有好下場的!恐怕你的書還沒有讀完,老板就已經炒你魷魚了。其實完全可以這樣做:翻開某本書籍的目錄,一般會有二、三十章,拋開其他內容,只查詢數據庫相關章節,一般為ODBC、ADO和OLE三章,於是這三章就是你學習的目標,再也不必從頭到尾每頁紙都一一啃完。更進一步,還可以確定本次使用ODBC編程,於是拋棄ADO和OLE,這樣厚厚的一本書就退化為一章了,此時集中所有火力,全力攻擊此章內容,就能迅速突破了。
相同的道理,具體學習時也應切記,務必需要從洋洋灑灑的內容中選擇並鉆研與ODBC相關的知識,至於其它程序設計所必須但與數據庫編程相關不大的內容囫圇吞棗即可。比如配置數據源、重載數據庫類、配置數據庫連接語句、準備SQL語句、執行SQL的函數、遊標控制方法等等內容需要細細研磨,而其它諸如為了顯示表格內容而對ListView控件進行設置之類的代碼,一筆帶過,真有需要,直接拷貝即可。
再舉一個例子,應項目需要,木鴻飛曾經要求一個學生設計sybase數據庫中的存儲過程。該生畢業已有1年,平時木鴻飛朋友的公司裏做一些數據庫查詢工作,所以SQL語句還是比較熟悉的。木鴻飛拿了一本《sybase數據庫大全》給該學生自學。一周後,木鴻飛查看結果,才知道該生尚未開始設計。木鴻飛怒之,該生卻翻開《大全》,一臉興奮的說道:“這本書真的是太好了!講述的相當詳細,有創建數據庫,有BCP的用法,還講述了在C語言程序中訪問數據庫!當然我的水平有限,看的比較慢,現在只看了不到50頁,不過我都做了筆記,等我看完就可以編程存儲過程了!”
木鴻飛默不吭聲的拿起《大全》,翻到最後一頁,指著頁碼,故意大聲的念到:“總共562頁。”又接過該生的筆記本,翻開看看,密密麻麻記滿了內容,很詳細很認真,不由嘆口氣說道:“唉!首先承認,你這幾天學習真的很認真,很辛苦,學習態度值得表揚。不過你要記住,現在你是公司的員工,不再是學生,首要任務是工作,而不是學習!我安排你編寫存儲過程,你本身就很熟練SQL語言,所以你只需要看書的這一章,設計存儲過程即可。至於創建數據庫、BCP操作、乃至數據庫調優、嵌入式程序設計等等,這些內容的確很重要,但你必須在完成安排的任務之後再卻主動學習。”
講到這裏,可能有人會提出疑義:“老師是過來人,自然可以慧眼識珠,知道哪些內容是學習的關鍵,但一般學生或者剛畢業者,在從未接觸某項知識時,根本沒有相關概念,除了從頭到尾全面學習一遍外,沒有任何可行方案。
誠然,學習陌生的知識,尤其是快速的掌握陌生的知識是一種能力,一種高素質的能力。但不可否認,要想在當今社會立足就必須具備這種能力!公司不會給員工一年甚至是幾年的時間去熟悉某項業務,老板也不會有耐心花費一年或者幾年的時間送員工學習,競爭對手更不會放棄這個難得的機遇。記住,在IT行業,不是大魚吃小魚,而是快魚吃慢魚。所有你必須具備這些能力,才能在未來的競爭中立於不敗之地。
值得興慶的是,能力是可以培養的,要具備快速學習的能力,需要從兩個方面著手:
其一:基礎、基礎、又見基礎。道理不多說,當把笑傲工具前兩招運用的爐火純青時,再使用第三招,會如有神助。
其二:練習、練習、還是練習。平時刻意多做此方面的練習,自然而然會達到慧眼識珠的效果。比如學習某某編程實例或者編程技巧書籍時,不要總是想著要把書全部拿下,你可以翻開目錄,直指目的地,少走彎路。最後,給大家提供幾個練習的實例:
練習一:設計中文輸入法。
現在的輸入法滿天飛,什麽清華紫光輸入法、搜狗輸入法等等,貌似一個比一個漂亮,一個比一個更支持模糊拼音,是不是很心動,也想設計屬於自己的輸入法,那麽現在就開始吧。其實所謂輸入法就是一個動態鏈接庫程序,裏面必須提供某種符合規則的API函數而已。到網上搜索“輸入法設計”或者“IME”就可以得到豐富的內容。我們不需要多少漂亮的界面,也不需要高級的算法,能夠輸入漢字就行。
練習二:設計代理服務器軟件。
所謂代理,其實就是具備若幹套接字的軟件,把這邊接收到的信息轉發到那邊而已。但是轉發的信息必須要具備某種格式,標準文件RFC1928定義了SOCK5代理的轉發格式,標準文件RFC1945和RFC2616則定義HTTP的協議格式,其中包含HTTP代理的轉發格式,仔細閱讀這幾個文件,就可以設計出自己的代理服務器軟件。
練習三:設計本機網絡通信竊聽程序。
偷窺別人貌似是種不道德的行為,但是偷窺自己的計算機與外界交換的數據貌似毫無道德問題,但問題是,你有能力偷窺嗎?獲取你的計算機與外界的交流信息,你能嗎?能,太能,太陽能!這是必須的。這裏介紹一種簡單的方法,到谷歌上搜索“API鉤子”,你就能得到想要的答案。屆時你還可以將此程序專業化,設計其升級版本,比如設計程序監聽網絡鬥地主遊戲的出牌記錄等。
以上練習所需知識均比較偏僻,完全可確保其陌生性,又均可以在網絡上搜索獲得,多做此類練習可以極大的提高自學陌生知識能力。但在練習時切記“不求完美”,只是練習而已,培養的是自學能力,而不真的是要在該個項目上深入發展或者開發生產軟件,所以程序點到為止,時間以一周為限,過期不做。最後,特別特別要聲明的是:以上實例難度很大,只建議基礎牢固,課程設計優異,力圖更進一步的讀者練習,否則會動搖某些人好不容易才積累起來的信心,打擊其弱小的心靈。對於不聽勸告而造成的後果,本書不予負責!
 

延伸阅读

评论