天天看點

程式設計學習初體驗(5. 如何自學程式設計)(2)

這幾天七七八八,也不知道自己在忙什麼。似乎就是沒心情繼續到這裡寫東西。打了幾天遊戲,用java寫了一個網絡仿真軟體用來測試p2p設計的性能,改改小bug,時間就這麼過去。 希望沒人在這裡等我的下文,不然就慚愧死人了。

言 歸正傳,回來繼續講我們的正題。 翻翻前面的文章,對于資料結構和算法,我已經啰嗦了一堆他們的重要性。接下來改說哪本資料結構或者算法的書寫得好把,看看網上這類的文章文章已經論斤賣 了,再寫也沒多少意義了。況且自己不是算法狂人,所看過的算法書也就那麼基本粗淺的而已,自然不敢出來挨磚。想想能拿出來和大家分享的,依然是自己的一些 看法和認識而已。

資料結構和算法

算法這兩字其實到今天我還是稀裡糊塗的,每次讀算法書,前言或者序言第一句話肯定就有定 義。反正大學看了一回,碩士的時候學算法又看了一回。至今好像也沒再看過第三回。也不記得書上是怎麼定義的,發展覺得就是特經典,精辟的那種,但是過眼就 記不得。沒事和朋友吹牛的,三句話不離本行,十句話肯定是不離算法的:大部分口水是為“算法”噴的;碼的代碼大多數也是在解決算法問題。 但是對于算法到底是啥,我卻不願意深究其定義,因為我知道揪出來也沒意義,它能基本涵蓋一個程式員所有的有用功——就好像你問人吃啥,他說吃飯, 你絕對不會去再問一句飯吃的啥了。

在這裡,我有興趣做的,倒是如何把算法和資料結構來個“實用性”分類。所謂實用性就是我不在乎分的對不對,靓不靓,隻從合乎情理來分。從對算法和資料結構的逐漸深入了解來分,可以分為這麼三類:

(1)基本資料結構和基礎算法:程式設計語言和資料結構,針對對程式設計語言的掌握

(2)通用算法:針對理論問題的探讨

(3)專用算法:金融,路由

這 也對應三個不同學習和使用算法和資料結構的階段。 雖然這分法有點老土,但是也是經過我也是仔細琢磨,覺得最合情理的分法。 首先(1)明顯差別與(2)(3):前者是“就事論事”,屬于掌握程式設計語言的内容,換句“課堂用語”來說就是為了解決程式設計實作域中知識技能;後兩者是為了 解決實際應用問題,屬于“應用域”。會了(1),你就基本掌握了啥是程式設計了,會了(2)(3)你才算是有點“生産力”,能掙公分了。(1)是大多數學計算 機的人所要關注的,而其他學科未必注重這個。(2)主要是計算機做理論方面的人在搗鼓 ,和一些職業的應用數學家(3)則是滲透到各個行業中了。 是以能掌握(3)的人是各行業裡賺錢的;會(2)的人呢小康是有保障屬于技術工種;。剩下的隻會(1)的人,就是标榜為IT民工的各位了。這也就是為什麼 大家都說做IT都是打工的,隻能給其他行業的人當槍使。事實也的确如此,大多數人從科班出身人,能把(1)能真正掌握做好就不多,(2)就需要去花很多的 時間去看什麼《算法的藝術》 《算法導論》和有相對比較好的數學底子了。(3)就往往需要在計算機之外有數學的功力和行業的背景知識了。是以說,時下流行的:少壯不努力,老大做IT, 也是有一定道理的。

上面這堆廢話對已經入行的朋友沒有什麼意義,大家就權且一笑;但是如果正準備開始學習程式設計,那還是應該把這些記在心裡的。很多時候,決定你以後發展的并不是你學的是什麼,而在于你對全局的把握。這也是我廢話這麼多的初衷。

言 歸正傳, 如何學好第一步。答案很簡單,也很讓人失望: 學好算法和資料結構的最好辦法就是把所學的背下來,默寫出來。這有點類似英語學習,基本功就是背單詞和句型。之是以強調要背要默的原因,第一是由于這是以 後的基礎;第二是以後再也不會有這樣的機會讓你來做這些基礎功課。這點上往往是科班程式員和票友程式員之間的分水嶺。科班程式員大多在入門的時候被老師逼 着去做這樣那樣的功課, 雖然不情願但是這些基本功對以後的确意義重大;票友程式員往往沒有這樣的壓力, 在學習中回避這些基本功,其結果也是人浮于事,之後的内容也學不進去。 這裡說說我當時的學習。我的資料結構老師很不錯,上課用的是南加州大學的老教程,我喜歡把裡面的例程算法都仔細看透,琢磨是否可以優化。做作業的時候是我 最慘的時候。當時軟碟都很少用, 程式都是自己寫在作業本上交老師批改的。 女孩子們喜歡打草稿,反正他們的作業都幹淨要命。我是粗線條那種, 不喜歡做門面功夫,那就得力求一次性在作業上把程式從頭到尾都一次寫出來。這當然不可能了, 即便在計算機上程式設計,也不可能一次性把整個程式都寫出來。是以我的本子總是塗塗改改的特别惡心。 成績當然不高,即便程式是對的,老師也不願意給如此惡心的作業打高分。 為了提高成績,隻能少塗改,那隻能要求我自己在腦子裡面進行“腦中作業”,因為上機的時間實在是不多,還得自己花錢買上機票。另外一個辦法就是背住所學的 算法, 背住的越多,腦中作業的腦力花費越少。于是這無形中極大強化了我對算法的掌握。後來我看其他同學做作業都要翻書抄書上的例程再改就很不屑, 因為我做作業的時候從來不打開書的。 考試的時候是開卷,我就很牛逼的連書都不帶嘩嘩嘩的寫完交卷,爽!後來在學算法設計,作業系統,編譯原理和計算機圖形學的時候,我基本都是把書上的僞代碼 實作出來,寫成完整的系統(現在回想當年花了3個星期實作一個pascal編譯器,真是太痛苦了,後來知道有lex和yacc,真是郁悶了很久)。不過這 些東西到現在對我來言都是極大的資本。

其次,我還想在這個話題下多說一句: 不要為了算法去專業算法。很多年輕人總是在我面前炫耀自己讀完了《算法導論》第幾卷,裡面某某算法設計多難,自己都看懂了。但是我絕對不建議任何年輕的程 序員去看這種書。原因有二: 第一,這種書屬于(2)的範疇,需要了解,但是不需要去啃懂每個算法,好比是新華字典,對每個中國人都很重要,但是那是工具書,沒人會去把整本啃完,沒有 意義;第二,做程式設計這行,變化太快,等印在紙上了,那些都已經是過時的死東西了,等你啃完前人的骨頭了,你也差不多該作古了。

     本文轉自nathanxu 51CTO部落格,原文連結:http://blog.51cto.com/nathanxu/114310,如需轉載請自行聯系原作者