學習PHP的過程何時可以數據結構和算法

學習PHP的時候,什麼階段纔可以學數據結構?這個問題其實不只是學習PHP,也是其他語言。

學習PHP的過程何時可以數據結構和算法

關於這個問題一定不要瞎跟風,一定不要超前,也就是說不要看到網上別人說這個重要就馬上去學,也不要看到別人說它很抽象,很難,就不去學。總的來說,這個玩意是要學,而且必須學,關鍵是什麼時候學?怎麼學?

如果沒有學好該語言的基礎,就不要學數據結構和算法,否則你學了許久,不但華而不實,派不上用武之地,還極大的打擊你學習興趣。

比如舉個例子:學PHP2年多的人,你在公司開發項目中,用的是比如PHPCMS,你什麼時候用過大學教材上教的數據結構中圖的算法?或者哈夫曼算法?但是你卻可以勝任公司的許多用PHPCMS開發的項目,工資可能還不低。

反過來,你哪怕背熟了漢諾塔這些複雜的算法,但是你沒時間學PHP以及PHPCMS,你去應聘PHP開發職位,你覺得會有幾個給發麪試通知?你的簡歷上就只能寫“精通數據結構和算法”,但是拍不上實戰用途上,結局也很可能挺尷尬的。

別人學文科的連數據結構是什麼都不知道,照樣能找工作,別人就不找需要數據結構的工作嘛。這就說明了:找工作甚至是PHP之類的開發應用領域的工作是和需求直接掛鉤的,工作中用到了什麼纔會需要該方面的人才。

所以,學不學數據結構,要看你以後想找的工作崗位需要不需要。如果你是想找個PHP快速開發項目的工作各位,1年後崗位上需要的框架你用的很熟練,你是很可能當技術經理的。但你可能並沒有用到數據結構中那些複雜的算法。

所以有一個誤區,那就是:但凡要學習PHP,就得要先吃透數據結構和算法,還侷限於書本上寫的那幾個算法,如:哈夫曼算法,哈希算法,等等...誰不學這個誰就不會開發項目...之類的。

所以一聽到很多初學者,連PHP的基礎都沒學會,連面向對象都沒搞懂,連模板解析引擎也沒搞懂,連動態標籤都搞不清爲什麼要有,連Laravel都不能開發出一個完整項目出來,一來就在啃數據結構這本書,這純粹是“華而不實”的舉動。

這是學給別人看的,讓別人看到你有多麼的“高深”。其實爲什麼要學它,用在什麼地方,估計他自己也搞不清楚。這樣的學習嚴重脫離了實際,如果導致你找工作麻煩,難勝任工作需求,也是十分正常的。因爲你學歪了。就像你精通歷史,但是卻是在找或者在做化學的工作,然後你跟別人說“歷史很重要...”。

所以:上面得出的建議就是:工作或者未來的工作用不到,那就暫時不需要學數據結構。

  那麼,什麼時候應該學數據結構呢?

那自然是用到了才需要學。什麼時候用到?像數據結構中的排序,這些在PHP中都已經對數組集成了這些方法,一個sort()即可搞定,你還有必要自己來寫個嗎?相信你要做個對從數據庫中提取的結果集進行排序的時候,你首選的會是那些庫函數吧,不會自己再寫個排序的算法吧,因爲你在重複造輪子了。

很多人大誇特誇那些複雜算法如何如何的重要,試問你工作了幾年PHP,你何曾用到哈夫曼算法在你的項目中?哈希算法?漢諾塔算法?在PHP中你自己寫過鏈表嗎?寫了你用在了什麼地方?你不需要寫,因爲都寫好了。

PHP的數組就是動態的,就是鏈表實現的,你還用得着寫嗎?別人庫函數寫的比你高效很多,考慮了更多的情況。你寫的'那種只考慮一般的動態數組能派上用場嗎?除非沒有,你才必要去寫。比如對網站欄目的遞歸處理。在開發領域中很多都是拿來主義,因爲就是要減少重複造輪子。

只有當你從頭到尾的寫一個框架的時候,你纔可能用到。但是又有幾個在寫自己的框架呢?到真正需要的地方又會看到很多人這樣的言論:框架不是有了嗎?如:TP,如:Laravel;就連開源系統都可以舉出十多個常用的優秀的。知道這個,那麼試問:你學的那些複雜算法又有什麼意義?

所以:上面得出的建議就是:如果你想鑽研框架的開發,開源系統的開發,那再去學數據結構和算法的深入的東西。否則,學了,你根本用不到。還是把它該學的先學會吧,如面向對象,如面向切面,如模板解析引擎,如緩存處理,如負載均衡,如集羣,如Linux。

  至於怎麼學數據結構?

當你可以到要學數據結構的時候了,該怎麼學呢?其實它就融在了你的日常生活中......

比如:如果你開發一個項目的過程中需要對提取的文章進行從1開始的打印。而你遍歷的時候索引是從0開始,那麼你只要加個1就可以實現。

在需要對偶數行進行標紅的時候,你只要對2取餘,看結果是0還是1,這其實就是算法,那麼何謂算法?就是解決問題的思考途徑,這樣纔會出現僞算法的概念,那就是用中文或者英文把解決過程先寫出來,然後纔會去用某種語言去實現。

至於書上描述的那些算法,是用在比如開發編譯性能,操作系統隊列任務的分配等底層領域,你以後要做底層驅動開發嗎?你要寫編譯器嗎?你要寫瀏覽器嗎?如果不想,那你死啃那些書籍有什麼現實意義?

所以:不要狹隘的認爲數據結構和算法就是某本大學教材上羅列的那幾個抽象的解題代碼。這太狹隘了。那些其實更多的被許多“不學無術”的人用來做“學術顯擺”罷了,這也侮辱了真正編程前輩們的宗旨。相信你周圍也有那些人,對,就是那些人。

得不到就說一堆你聽不懂的專業術語,讓你聽的雲裏霧裏,方能獻出他比你優秀許多。讓你“崇拜不已”。這就達到了他“虛榮”的目的。其實很多公司裏的技術人員很多都是這樣的漂浮心態。總喜歡拿那些讓你聽不懂的來震懾你,這樣你就不敢繼續深究他的技術實力了...僅此而已。

其實這也涉及到了技術教學和技術開發是兩個不同的發展方向。前者就是要用通俗易懂的內容讓你學的容易,後者就是要讓你看不懂,才能顯出他比你優秀。這就是很多技術高手爲什麼不懂技術教學的原因。這個話題以後在說。

那麼,什麼是真正的數據結構和算法呢?真正有實際意義的數據結構和算法其實是你身邊所用到而沒注意到的。這麼說吧,你在開發中所創造的數據類型,如:int,char,字符串類型,結構體類型,類類型就是數據結構。

而你對他們的增刪改查,排序,構造出鏈表從而形成動態數組,如何提取某個成員,其實就是算法。更往上走就是組合這些基礎的去和實際問題的解決方案去結合。所以:那些比如漢諾塔算法其實也就是一種應用罷了。