給初學程式設計的人的新年乾貨

任家輝的簡書發表於2016-01-07

一、這多東西啥時候能學完?

現在IT新技術日新月異。就常用程式語言而言,有c/c++、彙編、java,c#、Python等;作業系統平臺有unix /linux,windows系列;開發工具有VC、VisualStudio2008、Eclipse、NetBeans等;每個大平臺下,還有很多的 的方向:如網路、資料庫、指令碼、HTML、動態網站、遊戲開發等;有人還在學Dreamweaver做網頁、Flash做動畫、Photoshop做美 工、3DMax做三維動畫…………是的,我們什麼都想學。恨不得把所有的知識統統都塞到肚子裡去。看到什麼,想學什麼!

\" width=

今天看這VC的書,明天又看Java,後天又看C#,東搞西搞!看到別人做網頁。自己興趣了來了。好,學html語言,我也做網頁,聽說做 網頁要會“網頁三劍客”,所以又想學Dreamweaver、Flash。後來開始知道有JSP、PHP、ASP.NET做動態網站這玩意兒。也想去學, 學學學……

這是幾乎所有在校大學生的通病。但是,這不是壞事,甚至可以說是好事。說明了你“求知慾”高!總比那些,生活沒有激情,整天知道泡妞、上網、打遊戲、混日子的強。

但是如果你今天想學這個,明天又想學那個。這樣你就能永遠徘徊在技術的門外。很多人都有過或者正在經歷這樣的苦悶日子:總覺得有“太多東 西”要學了,然而人的精力是有限的,總有永遠學不完的感覺,所以心理特別急,整天惶惶不可終日,不知道先要學哪個,一會兒拿起這本書,一會拿起那本書,折 騰了幾個月,突然發現自己什麼都沒有學到……

每一個大方向如果沒有上幾年的學習,很難能學習出什麼來。但程式設計的最根本的東西是相同的。所以我們學習要抓根本。俗話說:通一理,融百里。

學程式設計就像習武一樣,如果內功學的好,其他功夫就很容易上手。君不見《倚天屠龍記》中的張無忌練了“九陽神功”8年,練“乾坤大挪移”只需12個時辰嗎?

習武之人,誰不想在“江湖”上揚名立萬,誰不想成為萬人敬仰的大俠?大俠之所以能成為“大俠”,當然有他們的看家本領。狄雲的“神照神功”,金世遺的正邪融合的“喬北冥內功心法”,張無忌的“九陽神功”,段譽的“六脈神劍”,令狐沖的“獨孤九劍”,哇,太多了…

古人歷經千辛萬苦才能找到這些“武功祕籍”。我們現在這些後輩,比起古人來說:簡直太幸運了。去書店,各種各樣的心功心法,劍法,拳法,應 有盡有,看得你眼花繚亂…你選什麼呢?今天練“六脈神劍”幾式,明天去學“降龍十八掌”幾招,後天又去練“發暗器”,這樣何時才有個盡頭呢?你說,你 什麼武功都會,但是“形似而神不似”,不得要領,不夠火候。一上擂臺,就被別人一掌打趴了。試問哪個軟體公司敢要一個號稱任何程式語言都會,而是每種語言 只能寫出個“helloworld!”的程式設計師,你不被人家掃地出門才怪。

二、學**還是學**更有前途?

看了上面的話,有的同學已經開始煩了,“知道了知道了,不止一個像你這樣的所謂的‘老前輩’跟我說過‘學什麼都一樣,思想才是最重要’的大 道理,可是你們站著說話不嫌腰疼呀,現實是有很多技術需要學,比如做Web開發就有JSP、PHP、ASP.NET等好多方向,我總得選一個吧!到底學哪 個有前途呢?我必須要選擇一個有前途的,選錯了就麻煩了。”

其實像“學**還是學**更有前途”的話沒意義,因為“選擇JSP還是選擇PHP”的前途的差別不像“選擇英語還是選擇日語”的前途差別那 樣大,不存在“選錯方向”的問題,因為都是相通的,你也不能保證你畢業以後搞的就是你學的那個方向,更不能保證你靠你學的這點東西就能吃一輩子。比如我上 大學的時候一直在鑽研是Delphi語言,可是畢業校園招聘的時候我照樣在Java職位的考試取得了第一名,而且工作以後經過簡單的學習就掌握了Java 語言,並且後來還寫了三本關於Java語言的書;再如我畢業後兩年多的時間一直在用Java開發,後來公司要做一套基於.NET的產品,我只用了一個禮拜 熟悉了.NET體系以及C#的語法,然後就開始進行開發。

不過就像上邊說的“做Web開發就有JSP、PHP、ASP.NET等好多方向,我總得選一個吧!”這個問題是非常實際的,因為只有先學一 個才能深入這個方向,把這個方向學通了才能想以後“一通百通”。因此我的建議就是學校教過什麼語言,你就繼續深入學習這麼語言,而不要去問“這麼語言有沒 有前途”這樣的傻問題。儘量不要去學一門所謂“有前途”的新語言,因為你去學一門新語言就要把很多精力耗費在語言、語法本身,而耽誤了程式設計的實戰,而以一 個已經學過的語言來學習的話,起碼語法本身不用再去學、開發工具本身不用再去熟悉,只要研究怎麼使用這門語言開發有用的程式就ok了。比如大部分同學都學 過C語言(有的學校直接開了C++的課,但是C++的程式導向程式設計部分還是C語言),所以我們們就開了《C語言也能幹大事》的課程,讓同學們把精力放到學以 致用上,而不是學“有前途”的新語言上,這也是這個思想的一個體現。

舉幾個例子。我們們如鵬網的《計算機專業職業發展測評系統》是我用PHP開發的,但是在這之前我從來沒寫過PHP程式,但是我以前寫過 JSP、ASP的程式,因為寫網站程式的原理都是相通的,只是語法不同而已,因此我只用了幾個小時的時間熟悉了開發PHP用的工具並且快速瀏覽了一下 PHP的語法,然後用半天時間就開發出了這個測評系統。想像一下一個整天在今天學JSP,明天學ASP,後天學PHP,大後天仰天長嘆“到底學哪個有前 途”的人能用半天時間學會一門新語言嗎?

我大學時有一個同學,他看我當時Delphi學的比較好,寫了很多程式,他就說他也想學軟體開發,讓我教他Delphi,可是我們專業前一 個學期已經開了PowerBuilder的課,因此當時我就建議他還是繼續深入學習PowerBuilder,用PowerBuilder寫又實用價值的 東西,而不是像上課那樣寫HelloWorld的程式。當時Delphi還是如日中天的流行的程式語言,而PowerBuilder則市場佔有率比較小, 他就說不想繼續學PowerBuilder,因為PowerBuilder沒前途,我就給他講了“一通百通,從自己最熟悉的入手”這個道理,然後他就踏實 的深入研究PowerBuilder起來,到了畢業的時候他已經能用PowerBuilder寫非常複雜的程式而且還學習了用PowerBuilder寫 Web程式。畢業後沒多久就應公司的要求用Delphi寫程式,他只用了不到一週的時間學習了Delphi,然後就寫出了一個符合公司要求的系統,當時他 就給我打電話向我報喜。前一陣子我聽說他已經開始指導一些新員工用Java開發一箇中型規模的企業級系統了。可以說他的成功就得益於“一通百通,從自己最 熟悉的入手”這個原則。

總結一下,不要管“哪門語言好就業、有前途”,因為那些“好就業、有前途”都是紙老虎。儘量不要學新語言,從自己最熟悉的語言入手,深入研究,出山後你就是被用人單位爭搶的紅人。

三、企業裡都需要什麼方面的才能?

這個要視用人單位的要求而定了。你現在還沒有畢業,也不知道未來要面對什麼樣的崗位。因此建議大家在上學期間不要偏科,所以的課程都要好好學,學好專業課,培養自己的“內功心法”,然後進入一個大公司,那麼大公司自然會為你安排一個人才培養計劃,在工作的環境中學習就更有目的性。

學什麼最容易

由於現在的快速開發工具的不斷推出,使得軟體開發越來越容易,進入軟體開發的門檻也越來越低。很多人在IDE工具的誘騙之下,快的十天,慢的半個月就可以進入所謂“程式設計師”的領域,成了一個所謂的“程式設計師”。這對於IDE提供商來說是樂得合不攏嘴的事情,但是對於軟體來說卻是一個無形的打擊。由於快速工具的盛行,很多人把開發看作小菜一碟,特別是很多在校的大學生,都認為現在教的內容一旦出了學校都已經是落伍,無形中產生了討學的心理。

今後的軟體開發逐漸趨於兩極化,一方面有越來越多的人將從事簡單的重複性開發,而且這部分的開發難度會逐漸降低;另外一方面核心部分的開發會越來越複雜,這部分的入門所涉及的知識內容會逐步增加。所以對於今後希望從事軟體開發的同學們,需要好好的努力學習,學校的東西會有他們的用處,只要現在把基礎打紮實了,即後你們在軟體的領域會有很好的機會,不要盲目的放棄學習的機會。

有什麼速成的辦法沒有?

有一種蛾子名叫“帝王蛾”。帝王蛾的幼蟲時期是在一個洞口極其窄小的繭中度過的。當它的生命要發生質的飛躍時,這天定的窄小通道對它來說無疑成了鬼門關。那嬌嫩的身軀必須拼盡全力才可以破繭而出。太多太多的幼蟲在往外衝殺的時候力竭身亡,不幸成了“飛翔”這個詞的悲壯祭品。

有人懷著悲憫惻隱之心,企圖將那幼蟲的生命通道修得寬闊些。他們拿來剪刀,把繭中的洞口剪大。這樣一來,繭中的幼蟲不必費多大力氣,輕易地就從那個牢籠裡鑽了出來。但是,所有因得到救助而見到天日的蛾子都不是真正的“帝王蛾”,它們無論如何也飛不起來,只能拖著喪失了飛翔功能的累贅的雙翅在地上笨拙地爬行。

原來,那“鬼門關”般的窄小繭洞恰恰是幫助帝王蛾幼蟲兩翼成長的關鍵所在。穿越的時刻,通過用力的擠壓,血液才能順利送到蛾翼的組織中去,惟有兩翼充血,帝王蛾才能振翅飛翔。人為地將繭洞剪大,翼翅就失去了充血的機會,生出來的帝王蛾便永遠與飛翔無緣。

沒有誰能夠施捨給帝王蛾一雙奮飛的翅膀。不懼怕獨自穿越狹長墨黑的隧道,不指望一雙憐恤的手送來廉價的資助,將血肉之軀鑄成一支英勇無畏的箭鏃,帶著呼嘯的風,攜著永不墜落的夢想,拼力穿透命運設定的重重險阻,義無反顧射向那寥廓美麗的長天……

讓一個“帝王蛾”速成的方式就是幫它把繭剪開;一個人學一門技術的速成方法就是不學那些“沒用”的東西,直接告訴他最終結論和操作方式,但是很多東西是在探索中、學習中才能領悟的,很多人在鑽研一個技術難題的過程中查資料、看書、求證,在這過程中不僅鍛鍊了自己思考問題的能力,而且夯實了基礎知識,最重要的是在探索過程中收穫了很多意想不到的新東西,有很多朋友在鑽研一個問題的時候經常能無意中的學會很多新東西。

上山的“速成”方法是直接坐纜車上去,可是你會比那些登山者少看到很多路邊的風景。那麼你是願意做一個掌握“速成”方法的人,還是願意有機會看看路邊的風景呢?

成功的祕訣

古希臘大哲學家蘇格拉底,思想深邃,思維敏捷,關愛眾生又為人謙和。許多青年慕名前來向他學習,聽從他的教導,都期望成為像老師那樣有智慧的人。他們當中的很多人天賦極高,天資聰穎者濟濟一堂。大家都希望自己能脫穎而出,成為蘇格拉底的繼承者。一次蘇格拉底對學生說:“今天我們只學一件最簡單也是最容易的事,每個人都把胳膊儘量往前甩,然後再儘量往後甩。”蘇格拉底示範了一遍,說:“從今天起,每天做300下,大家能做到嗎?”學生們都笑了,這麼簡單的事有什麼做不到的?

第二天,蘇格拉底問學生:“誰昨天甩胳膊三百下?做到的人請舉手!”幾十名學生的手都嘩嘩地舉了起來,一個不落。蘇格拉底點頭。一週後,蘇格拉底如前所問,有一大半的學生舉手。過了一個月後,蘇格拉底問學生:“哪些學生堅持了?”有九成的學生驕傲地舉起了手。

一年後,蘇格拉底再一次問大家:“請告訴我,最簡單的甩手動作還有哪幾位同學堅持了?”這時,整個教室裡,只有一個學生舉起了手,這個學生就是後來成為古希臘另一位偉大哲學家的柏拉圖。

如果說柏拉圖的故事太過遙遠,那麼就再給大家講一個發生在眼前的故事。

一次英語課上,老師帶來300句高考精華句子,並且許諾說:如果能夠把這些背誦得滾瓜爛熟,高考成績一定會提高。大部分學生以為又是老師哄學生的話,但身為有一個學生卻有著迫切提高成績的壓力,對老師的話銘記在心。回去後,他把這300句話當作至寶,先翻譯成中文,又翻譯成英文,發現幾乎每個句子都程度不同地存在錯誤,或時態、或單詞、或結構出現錯誤。他把這些知識整理在一個本子上,重點記憶。隨後的一個月,他彷彿吃了興奮劑,拼命地背誦和默寫這300句話,在付出一個個的清晨和夜晚的時光後,終於取得豐碩的成果,他能夠一字不差地默寫出這300句話。從此,這300句英文成為他的絕技,使他的英文成績很快得到了提高。這個人就是現在留學培訓的航母——新東方的掌門人俞敏洪。
有如鵬網的同學問我“學計算機有沒有什麼速成的辦法”,我想說的是最好的速成的方法就是“堅持”。一切其他的速成方法學出來的東西都太容易,“越容易得到的東西越不值錢”這是一條永遠不會變的價值規律。越是厲害的武功,越是難練,需要的時間越長。很多人,都是中途退場了。

堅持是最容易的,因為每個人都可以做到;堅持又是最困難的,畢竟沒有幾個人能夠堅持下來。堅持下來的人就是成功的人。

最後一句話:切務浮沙築高臺,練從難處練,用從易處用!無速成,唯有堅持!

同學們千萬不要犯大部分人都犯的錯誤:

下載了一硬碟的視訊教程、電子,幾乎沒看過,即使看過也是看看就算了,根本沒用心看過,更別說跟著老師進行程式碼練習。

光down不看是浪費硬碟和頻寬
光看不練是浪費時間和青春!
不要光下載不看,不要光看不練!

錯誤認識1.  C/C++太老了,過時了,平時用得很少,現在流行都Java、C#等等。

解惑:不要動不動覺得什麼東西過時了,COBOL還有OO版本面世,還有FORTRAN,LISP,好古老的語言吧,現在還用得很廣呢。楊中科老師經常提醒我們“一切語言都是紙老虎,一通百通”,學校已經開了C/C++的課,並且想繼續深入學習程式設計,那麼就繼續使用學過的語言來學習,不要再去學一門新的語言。等把C/C++弄熟了以後,回頭一看,相信你也能像楊中科老師那樣“半天學會一門新語言”了吧。

錯誤認識2.入門要從OO開始,培養用OO方式思考的習慣。

解惑:初學者一入門便擺弄Java、C++等很容易形成誤解,似乎OO=Java,C++…。一切程式語言的根本都是程式導向的,Java、C++等語言也是支援物件導向特性的程式導向的語言。程式導向就是if……else……、while、for這些東西,Java、C++等語言中難道就沒有這些語句了嗎?

過程式語言(或者說結構化方法)的精髓不會消亡,OO裡面也不可能擺脫掉一條條的語句、函式呼叫,結構化方法還是需要提倡的。OO方法不是那麼容易學會的(OO語言的語法弄得很熟練不代表你懂OO),而結構化那套方法,自個寫個千把行的程式就很能體會了,我是說寫個實用點的東西,比如試著自個實現一些資料結構和演算法,寫幾個小遊戲等。寫個一千行Helloworld等於沒寫。

我覺得方法是實踐中體會出來的,不是看看書就能學會的。過程式語言的程式碼一般比較簡練,我們程式設計序最終的目的是要解決問題,是要計算,是要獲取資訊,不要被OO,設計模式等迷糊了。

錯誤認識3.過程式語言弄久了,很難轉入OO的思維模式

解惑:我以前也沒有深想過這個理由,不過時間久了,發覺自己不過是把資料和方法集中在一起而已,看著方便,其實有很多不合理的東西,這裡頭就需要OO的理論指導了,還是需要時間來體會。我相信有很多用OO語言的人也不過是在框架裡頭添添程式碼,呼叫來呼叫去而已,把人類當作資料和操作的打包器。

個人覺得只有在用過程式方法做了十來年,編碼上十萬行後才有思維定勢,難以習慣用OO的眼光看待系統,然而這個轉變,我仍覺得比改變一個人的惡習容易許多。OO方法不是學了個Java,C++等就能掌握的,需要實踐,需要時間。過程式語言也容易培養一個人嚴謹的做事態度,比如用匯編,C等寫程式碼,沒有名稱空間、沒有一大堆類庫,沒有模板、沒有異常,你要花很多心思處理一些細節,比如警惕陣列索引越界、懸掛指標、野指標等等,請不要覺得麻煩,這個就是計算機啊,底層就是這樣的啊。

錯誤認識4.別用C了,看我用Java、 VC等輕輕鬆鬆就寫了個漂亮的圖形介面

這篇文章是給初學者看的,也可以給一些浮躁的人看看,初學程式設計的人精力應該放在資料結構、演算法上面,儘量多看一些底層的東西,數字邏輯,作業系統,編譯原理,計算機組成、體系結構,計算機網路等等基礎知識。編寫GUI拖幾個控制元件有什麼好吹的,既然你會拖幾個控制元件那麼一個初中都沒畢業的也會拖控制元件,你和他的差異性體現在哪裡?你知道視窗訊息怎麼回事麼,你編的介面是把易用放在第一位呢還是把漂亮放在第一位呢,你的GUI程式容易修改嗎?比如我一會要加個button,一會去個listbox,你會不會改的瘋掉呢?你是不是在OnClick裡頭寫了大段大段的程式碼,做類似“從edit1.text中去掉不是數字的字元,搜尋xxx再轉成16進位制,再複製到edit2.text”的事?

學習還是找紙版的書老實的看比較好,想想你積攢了多少電子書而又看了多少。

底層不瞭解,僅多也就飄在別人上頭,別人一閃身,你就得摔下來。

初學程式設計的人一來就IDE, GUI,Network啥的猛搞,能不浮躁麼?還是沉下心來研究一下基礎知識吧,我以腦袋擔保你有生之年會覺得他們有用的(呵呵,你轉行我就沒轍了),別看著別人弄JFC,Socket了你還在頭大這個quicksort怎麼就不對呢就心裡惶惶的,你要知道在一批API不被支援後不少人心裡空空的沒個著落:天啊,我除了那個就啥都不會了,鬱悶啊,花了我那麼久時間鑽研那套API,嗚嗚。。。。

錯誤認識5. C好難啊,我入門還是從Java,C#開始吧

解惑:語言只是表達思想的工具,不要只侷限於一種語言,不要狂熱於某一門語言。記住如鵬網的楊中科老師說那句話“價值規律就是——越是容易得到的越不值錢”。

最後祝大家新年快樂

相關文章