給初學編程的人的新年干貨
一、這多東西啥時候能學完?
現(xiàn)在IT新技術(shù)日新月異。就常用編程語言而言,有c/c++、匯編、java,c#、Python等;操作系統(tǒng)平臺有unix/linux,windows系列;開發(fā)工具有VC、VisualStudio2008、Eclipse、NetBeans等;每個大平臺下,還有很多的的方向:如網(wǎng)絡、數(shù)據(jù)庫、腳本、HTML、動態(tài)網(wǎng)站、游戲開發(fā)等;有人還在學Dreamweaver做網(wǎng)頁、Flash做動畫、Photoshop做美工、3DMax做三維動畫…………是的,我們什么都想學。恨不得把所有的知識統(tǒng)統(tǒng)都塞到肚子里去??吹绞裁?,想學什么!
今天看這VC的書,明天又看Java,后天又看C#,東搞西搞!看到別人做網(wǎng)頁。自己興趣了來了。好,學html語言,我也做網(wǎng)頁,聽說做網(wǎng)頁要會“網(wǎng)頁三劍客”,所以又想學Dreamweaver、Flash。后來開始知道有JSP、PHP、ASP.NET做動態(tài)網(wǎng)站這玩意兒。也想去學,學學學……
這是幾乎所有在校大學生的通病。但是,這不是壞事,甚至可以說是好事。說明了你“求知欲”高!總比那些,生活沒有激情,整天知道泡妞、上網(wǎng)、打游戲、混日子的強。
但是如果你今天想學這個,明天又想學那個。這樣你就能永遠徘徊在技術(shù)的門外。很多人都有過或者正在經(jīng)歷這樣的苦悶日子:總覺得有“太多東西”要學了,然而人的精力是有限的,總有永遠學不完的感覺,所以心理特別急,整天惶惶不可終日,不知道先要學哪個,一會兒拿起這本書,一會拿起那本書,折騰了幾個月,突然發(fā)現(xiàn)自己什么都沒有學到……
每一個大方向如果沒有上幾年的學習,很難能學習出什么來。但程序設計的最根本的東西是相同的。所以我們學習要抓根本。俗話說:通一理,融百里。
學程序設計就像習武一樣,如果內(nèi)功學的好,其他功夫就很容易上手。君不見《倚天屠龍記》中的張無忌練了“九陽神功”8年,練“乾坤大挪移”只需12個時辰嗎?
習武之人,誰不想在“江湖”上揚名立萬,誰不想成為萬人敬仰的大俠?大俠之所以能成為“大俠”,當然有他們的看家本領(lǐng)。狄云的“神照神功”,金世遺的正邪融合的“喬北冥內(nèi)功心法”,張無忌的“九陽神功”,段譽的“六脈神劍”,令狐沖的“獨孤九劍”,哇,太多了...
古人歷經(jīng)千辛萬苦才能找到這些“武功秘籍”。我們現(xiàn)在這些后輩,比起古人來說:簡直太幸運了。去書店,各種各樣的心功心法,劍法,拳法,應有盡有,看得你眼花繚亂...你選什么呢?今天練“六脈神劍”幾式,明天去學“降龍十八掌”幾招,后天又去練“發(fā)暗器”,這樣何時才有個盡頭呢?你說,你什么武功都會,但是“形似而神不似”,不得要領(lǐng),不夠火候。一上擂臺,就被別人一掌打趴了。試問哪個軟件公司敢要一個號稱任何編程語言都會,而是每種語言只能寫出個“helloworld!”的程序員,你不被人家掃地出門才怪。
二、學**還是學**更有前途?
看了上面的話,有的同學已經(jīng)開始煩了,“知道了知道了,不止一個像你這樣的所謂的‘老前輩’跟我說過‘學什么都一樣,思想才是最重要’的大道理,可是你們站著說話不嫌腰疼呀,現(xiàn)實是有很多技術(shù)需要學,比如做Web開發(fā)就有JSP、PHP、ASP.NET等好多方向,我總得選一個吧!到底學哪個有前途呢?我必須要選擇一個有前途的,選錯了就麻煩了。”
其實像“學**還是學**更有前途”的話沒意義,因為“選擇JSP還是選擇PHP”的前途的差別不像“選擇英語還是選擇日語”的前途差別那樣大,不存在“選錯方向”的問題,因為都是相通的,你也不能保證你畢業(yè)以后搞的就是你學的那個方向,更不能保證你靠你學的這點東西就能吃一輩子。比如我上大學的時候一直在鉆研是Delphi語言,可是畢業(yè)校園招聘的時候我照樣在Java職位的考試取得了第一名,而且工作以后經(jīng)過簡單的學習就掌握了Java語言,并且后來還寫了三本關(guān)于Java語言的書;再如我畢業(yè)后兩年多的時間一直在用Java開發(fā),后來公司要做一套基于.NET的產(chǎn)品,我只用了一個禮拜熟悉了.NET體系以及C#的語法,然后就開始進行開發(fā)。
不過就像上邊說的“做Web開發(fā)就有JSP、PHP、ASP.NET等好多方向,我總得選一個吧!”這個問題是非常實際的,因為只有先學一個才能深入這個方向,把這個方向?qū)W通了才能想以后“一通百通”。因此我的建議就是學校教過什么語言,你就繼續(xù)深入學習這么語言,而不要去問“這么語言有沒有前途”這樣的傻問題。盡量不要去學一門所謂“有前途”的新語言,因為你去學一門新語言就要把很多精力耗費在語言、語法本身,而耽誤了編程的實戰(zhàn),而以一個已經(jīng)學過的語言來學習的話,起碼語法本身不用再去學、開發(fā)工具本身不用再去熟悉,只要研究怎么使用這門語言開發(fā)有用的程序就ok了。比如大部分同學都學過C語言(有的學校直接開了C++的課,但是C++的面向過程編程部分還是C語言),所以咱們就開了《C語言也能干大事》的課程,讓同學們把精力放到學以致用上,而不是學“有前途”的新語言上,這也是這個思想的一個體現(xiàn)。
舉幾個例子。咱們?nèi)琦i網(wǎng)的《計算機專業(yè)職業(yè)發(fā)展測評系統(tǒng)》是我用PHP開發(fā)的,但是在這之前我從來沒寫過PHP程序,但是我以前寫過JSP、ASP的程序,因為寫網(wǎng)站程序的原理都是相通的,只是語法不同而已,因此我只用了幾個小時的時間熟悉了開發(fā)PHP用的工具并且快速瀏覽了一下PHP的語法,然后用半天時間就開發(fā)出了這個測評系統(tǒng)。想像一下一個整天在今天學JSP,明天學ASP,后天學PHP,大后天仰天長嘆“到底學哪個有前途”的人能用半天時間學會一門新語言嗎?
我大學時有一個同學,他看我當時Delphi學的比較好,寫了很多程序,他就說他也想學軟件開發(fā),讓我教他Delphi,可是我們專業(yè)前一個學期已經(jīng)開了PowerBuilder的課,因此當時我就建議他還是繼續(xù)深入學習PowerBuilder,用PowerBuilder寫又實用價值的東西,而不是像上課那樣寫HelloWorld的程序。當時Delphi還是如日中天的流行的編程語言,而PowerBuilder則市場占有率比較小,他就說不想繼續(xù)學PowerBuilder,因為PowerBuilder沒前途,我就給他講了“一通百通,從自己最熟悉的入手”這個道理,然后他就踏實的深入研究PowerBuilder起來,到了畢業(yè)的時候他已經(jīng)能用PowerBuilder寫非常復雜的程序而且還學習了用PowerBuilder寫Web程序。畢業(yè)后沒多久就應公司的要求用Delphi寫程序,他只用了不到一周的時間學習了Delphi,然后就寫出了一個符合公司要求的系統(tǒng),當時他就給我打電話向我報喜。前一陣子我聽說他已經(jīng)開始指導一些新員工用Java開發(fā)一個中型規(guī)模的企業(yè)級系統(tǒng)了??梢哉f他的成功就得益于“一通百通,從自己最熟悉的入手”這個原則。
總結(jié)一下,不要管“哪門語言好就業(yè)、有前途”,因為那些“好就業(yè)、有前途”都是紙老虎。盡量不要學新語言,從自己最熟悉的語言入手,深入研究,出山后你就是被用人單位爭搶的紅人。
三、企業(yè)里都需要什么方面的才能?
這個要視用人單位的要求而定了。你現(xiàn)在還沒有畢業(yè),也不知道未來要面對什么樣的崗位。因此建議大家在上學期間不要偏科,所以的課程都要好好學,學好專業(yè)課,培養(yǎng)自己的“內(nèi)功心法”,然后進入一個大公司,那么大公司自然會為你安排一個人才培養(yǎng)計劃,在工作的環(huán)境中學習就更有目的性。
一、學什么最容易
由于現(xiàn)在的快速開發(fā)工具的不斷推出,使得軟件開發(fā)越來越容易,進入軟件開發(fā)的門檻也越來越低。很多人在IDE工具的誘騙之下,快的十天,慢的半個月就可以進入所謂“程序員”的領(lǐng)域,成了一個所謂的“程序員”。這對于IDE提供商來說是樂得合不攏嘴的事情,但是對于軟件來說卻是一個無形的打擊。由于快速工具的盛行,很多人把開發(fā)看作小菜一碟,特別是很多在校的大學生,都認為現(xiàn)在教的內(nèi)容一旦出了學校都已經(jīng)是落伍,無形中產(chǎn)生了討學的心理。
今后的軟件開發(fā)逐漸趨于兩極化,一方面有越來越多的人將從事簡單的重復性開發(fā),而且這部分的開發(fā)難度會逐漸降低;另外一方面核心部分的開發(fā)會越來越復雜,這部分的入門所涉及的知識內(nèi)容會逐步增加。所以對于今后希望從事軟件開發(fā)的同學們,需要好好的努力學習,學校的東西會有他們的用處,只要現(xiàn)在把基礎打扎實了,即后你們在軟件的領(lǐng)域會有很好的機會,不要盲目的放棄學習的機會。
二、有什么速成的辦法沒有?
有一種蛾子名叫“帝王蛾”。帝王蛾的幼蟲時期是在一個洞口極其窄小的繭中度過的。當它的生命要發(fā)生質(zhì)的飛躍時,這天定的窄小通道對它來說無疑成了鬼門關(guān)。那嬌嫩的身軀必須拼盡全力才可以破繭而出。太多太多的幼蟲在往外沖殺的時候力竭身亡,不幸成了“飛翔”這個詞的悲壯祭品。
有人懷著悲憫惻隱之心,企圖將那幼蟲的生命通道修得寬闊些。他們拿來剪刀,把繭中的洞口剪大。這樣一來,繭中的幼蟲不必費多大力氣,輕易地就從那個牢籠里鉆了出來。但是,所有因得到救助而見到天日的蛾子都不是真正的“帝王蛾”,它們無論如何也飛不起來,只能拖著喪失了飛翔功能的累贅的雙翅在地上笨拙地爬行。
原來,那“鬼門關(guān)”般的窄小繭洞恰恰是幫助帝王蛾幼蟲兩翼成長的關(guān)鍵所在。穿越的時刻,通過用力的擠壓,血液才能順利送到蛾翼的組織中去,惟有兩翼充血,帝王蛾才能振翅飛翔。人為地將繭洞剪大,翼翅就失去了充血的機會,生出來的帝王蛾便永遠與飛翔無緣。
沒有誰能夠施舍給帝王蛾一雙奮飛的翅膀。不懼怕獨自穿越狹長墨黑的隧道,不指望一雙憐恤的手送來廉價的資助,將血肉之軀鑄成一支英勇無畏的箭鏃,帶著呼嘯的風,攜著永不墜落的夢想,拼力穿透命運設置的重重險阻,義無反顧射向那寥廓美麗的長天……
讓一個“帝王蛾”速成的方式就是幫它把繭剪開;一個人學一門技術(shù)的速成方法就是不學那些“沒用”的東西,直接告訴他最終結(jié)論和操作方式,但是很多東西是在探索中、學習中才能領(lǐng)悟的,很多人在鉆研一個技術(shù)難題的過程中查資料、看書、求證,在這過程中不僅鍛煉了自己思考問題的能力,而且夯實了基礎知識,最重要的是在探索過程中收獲了很多意想不到的新東西,有很多朋友在鉆研一個問題的時候經(jīng)常能無意中的學會很多新東西。
上山的“速成”方法是直接坐纜車上去,可是你會比那些登山者少看到很多路邊的風景。那么你是愿意做一個掌握“速成”方法的人,還是愿意有機會看看路邊的風景呢?
三、成功的秘訣
古希臘大哲學家蘇格拉底,思想深邃,思維敏捷,關(guān)愛眾生又為人謙和。許多青年慕名前來向他學習,聽從他的教導,都期望成為像老師那樣有智慧的人。他們當中的很多人天賦極高,天資聰穎者濟濟一堂。大家都希望自己能脫穎而出,成為蘇格拉底的繼承者。一次蘇格拉底對學生說:“今天我們只學一件最簡單也是最容易的事,每個人都把胳膊盡量往前甩,然后再盡量往后甩。”蘇格拉底示范了一遍,說:“從今天起,每天做300下,大家能做到嗎?”學生們都笑了,這么簡單的事有什么做不到的?
第二天,蘇格拉底問學生:“誰昨天甩胳膊三百下?做到的人請舉手!”幾十名學生的手都嘩嘩地舉了起來,一個不落。蘇格拉底點頭。一周后,蘇格拉底如前所問,有一大半的學生舉手。過了一個月后,蘇格拉底問學生:“哪些學生堅持了?”有九成的學生驕傲地舉起了手。
一年后,蘇格拉底再一次問大家:“請告訴我,最簡單的甩手動作還有哪幾位同學堅持了?”這時,整個教室里,只有一個學生舉起了手,這個學生就是后來成為古希臘另一位偉大哲學家的柏拉圖。
如果說柏拉圖的故事太過遙遠,那么就再給大家講一個發(fā)生在眼前的故事。
一次英語課上,老師帶來300句高考精華句子,并且許諾說:如果能夠把這些背誦得滾瓜爛熟,高考成績一定會提高。大部分學生以為又是老師哄學生的話,但身為有一個學生卻有著迫切提高成績的壓力,對老師的話銘記在心?;厝ズ?,他把這300句話當作至寶,先翻譯成中文,又翻譯成英文,發(fā)現(xiàn)幾乎每個句子都程度不同地存在錯誤,或時態(tài)、或單詞、或結(jié)構(gòu)出現(xiàn)錯誤。他把這些知識整理在一個本子上,重點記憶。隨后的一個月,他仿佛吃了興奮劑,拼命地背誦和默寫這300句話,在付出一個個的清晨和夜晚的時光后,終于取得豐碩的成果,他能夠一字不差地默寫出這300句話。從此,這300句英文成為他的絕技,使他的英文成績很快得到了提高。這個人就是現(xiàn)在留學培訓的航母——新東方的掌門人俞敏洪。
有如鵬網(wǎng)的同學問我“學計算機有沒有什么速成的辦法”,我想說的是最好的速成的方法就是“堅持”。一切其他的速成方法學出來的東西都太容易,“越容易得到的東西越不值錢”這是一條永遠不會變的價值規(guī)律。越是厲害的武功,越是難練,需要的時間越長。很多人,都是中途退場了。
堅持是最容易的,因為每個人都可以做到;堅持又是最困難的,畢竟沒有幾個人能夠堅持下來。堅持下來的人就是成功的人。
最后一句話:切務浮沙筑高臺,練從難處練,用從易處用!無速成,唯有堅持!
同學們千萬不要犯大部分人都犯的錯誤:
- 下載了一硬盤的視頻教程、電子,幾乎沒看過,即使看過也是看看就算了,根本沒用心看過,更別說跟著老師進行代碼練習。
- 光down不看是浪費硬盤和帶寬
- 光看不練是浪費時間和青春!
- 不要光下載不看,不要光看不練!
錯誤認識1. C/C++太老了,過時了,平時用得很少,現(xiàn)在流行都Java、C#等等。
解惑:不要動不動覺得什么東西過時了,COBOL還有OO版本面世,還有FORTRAN,LISP,好古老的語言吧,現(xiàn)在還用得很廣呢。楊中科老師經(jīng)常提醒我們“一切語言都是紙老虎,一通百通”,學校已經(jīng)開了C/C++的課,并且想繼續(xù)深入學習編程,那么就繼續(xù)使用學過的語言來學習,不要再去學一門新的語言。等把C/C++弄熟了以后,回頭一看,相信你也能像楊中科老師那樣“半天學會一門新語言”了吧。
錯誤認識2.入門要從OO開始,培養(yǎng)用OO方式思考的習慣。
解惑:初學者一入門便擺弄Java、C++等很容易形成誤解,似乎OO=Java,C++...。一切編程語言的根本都是面向過程的,Java、C++等語言也是支持面向?qū)ο筇匦缘拿嫦蜻^程的語言。面向過程就是if……else……、while、for這些東西,Java、C++等語言中難道就沒有這些語句了嗎?
過程式語言(或者說結(jié)構(gòu)化方法)的精髓不會消亡,OO里面也不可能擺脫掉一條條的語句、函數(shù)調(diào)用,結(jié)構(gòu)化方法還是需要提倡的。OO方法不是那么容易學會的(OO語言的語法弄得很熟練不代表你懂OO),而結(jié)構(gòu)化那套方法,自個寫個千把行的程序就很能體會了,我是說寫個實用點的東西,比如試著自個實現(xiàn)一些數(shù)據(jù)結(jié)構(gòu)和算法,寫幾個小游戲等。寫個一千行Helloworld等于沒寫。
我覺得方法是實踐中體會出來的,不是看看書就能學會的。過程式語言的代碼一般比較簡練,我們編程序最終的目的是要解決問題,是要計算,是要獲取信息,不要被OO,設計模式等迷糊了。
錯誤認識3.過程式語言弄久了,很難轉(zhuǎn)入OO的思維模式
解惑:我以前也沒有深想過這個理由,不過時間久了,發(fā)覺自己不過是把數(shù)據(jù)和方法集中在一起而已,看著方便,其實有很多不合理的東西,這里頭就需要OO的理論指導了,還是需要時間來體會。我相信有很多用OO語言的人也不過是在框架里頭添添代碼,調(diào)用來調(diào)用去而已,把人類當作數(shù)據(jù)和操作的打包器。
個人覺得只有在用過程式方法做了十來年,編碼上十萬行后才有思維定勢,難以習慣用OO的眼光看待系統(tǒng),然而這個轉(zhuǎn)變,我仍覺得比改變一個人的惡習容易許多。OO方法不是學了個Java,C++等就能掌握的,需要實踐,需要時間。過程式語言也容易培養(yǎng)一個人嚴謹?shù)淖鍪聭B(tài)度,比如用匯編,C等寫代碼,沒有命名空間、沒有一大堆類庫,沒有模板、沒有異常,你要花很多心思處理一些細節(jié),比如警惕數(shù)組索引越界、懸掛指針、野指針等等,請不要覺得麻煩,這個就是計算機啊,底層就是這樣的啊。
錯誤認識4.別用C了,看我用Java、 VC等輕輕松松就寫了個漂亮的圖形界面
這篇文章是給初學者看的,也可以給一些浮躁的人看看,初學編程的人精力應該放在數(shù)據(jù)結(jié)構(gòu)、算法上面,盡量多看一些底層的東西,數(shù)字邏輯,操作系統(tǒng),編譯原理,計算機組成、體系結(jié)構(gòu),計算機網(wǎng)絡等等基礎知識。編寫GUI拖幾個控件有什么好吹的,既然你會拖幾個控件那么一個初中都沒畢業(yè)的也會拖控件,你和他的差異性體現(xiàn)在哪里?你知道窗口消息怎么回事么,你編的界面是把易用放在第一位呢還是把漂亮放在第一位呢,你的GUI程序容易修改嗎?比如我一會要加個button,一會去個listbox,你會不會改的瘋掉呢?你是不是在OnClick里頭寫了大段大段的代碼,做類似“從edit1.text中去掉不是數(shù)字的字符,搜索xxx再轉(zhuǎn)成16進制,再復制到edit2.text”的事?
學習還是找紙版的書老實的看比較好,想想你積攢了多少電子書而又看了多少。
底層不了解,僅多也就飄在別人上頭,別人一閃身,你就得摔下來。
初學編程的人一來就IDE, GUI,Network啥的猛搞,能不浮躁么?還是沉下心來研究一下基礎知識吧,我以腦袋擔保你有生之年會覺得他們有用的(呵呵,你轉(zhuǎn)行我就沒轍了),別看著別人弄JFC,Socket了你還在頭大這個quicksort怎么就不對呢就心里惶惶的,你要知道在一批API不被支持后不少人心里空空的沒個著落:天啊,我除了那個就啥都不會了,郁悶啊,花了我那么久時間鉆研那套API,嗚嗚。。。。
錯誤認識5. C好難啊,我入門還是從Java,C#開始吧
解惑:語言只是表達思想的工具,不要只局限于一種語言,不要狂熱于某一門語言。記住如鵬網(wǎng)的楊中科老師說那句話“價值規(guī)律就是——越是容易得到的越不值錢”。