天天看點

我對程式設計的思考

思考的由來

最近想深入研究JavaScript這門語言,自然免不了找來許多被奉若聖經的書,比如《JavaScript精粹》、《JavaScript忍者秘籍》、《精通JavaScript》等,這些書中主要探讨的問題諸如閉包、詞法作用域、this指向問題、原型繼承等問題,着實是我在深入學習這門語言之前所未曾預料到的。就像很多國内的教育訓練機構在給來教育訓練Web前端的學生講的一樣:JavaScript是用來給頁面添加行為的。類似

getElementById()

等是最常見的,随後又是

jQuery

等架構,當然是流行什麼教育訓練機構就教什麼,最近尤其

Vue

React

等也已經成為了各大機構的必備。但實際上這門語言内部有着非常複雜的機制,當然其中很大一部分原因是因為當初設計的問題,但也正是因為這樣,在各種的解決方案中又出現了許多優秀的思想跟設計。之前我并未考慮這門語言的面向對象程式設計,因為與我們常見的以“類”為基礎來進行面向對象程式設計不同,典型的代表便是我們常用的

Java

對象與對象之間可以通過某種機制實作互相的繼承、一個值也可以作為一個對象…這些在JavaScript中到處存在的神奇讓我開始思考:我們習以為常直接使用的程式設計語言,我們是否真的了解它?也許你會說可以通過讀源碼去了解它的設計原理,甚至可以自己去實作一個編譯器的設計,但在它設計之上的東西呢?比如我們習慣了以類聲明來實作對象繼承,而在JavaScript中便不同了。相似的功能卻都是為了實作“代碼複用”等這些功能。作為開發者,尤其是前端的開發者,經常因為庫的流行而不得不去更新自己的技能,但我們是否能夠擺脫這種窘境呢?也許你會說這是因為庫的設計理念和思想都有了進步,也許你會說去讀源碼,但實際上當你讀懂一個流行庫的源碼之後新的庫已經代替了之前的庫,而且設計的思想和架構也出現了很大的改變。

Node

之前可能你說讀懂

jQuery

就行了,其他的設計思想都差不多,但後來的這些流行庫卻完全推翻了這個說法。我們是否總是在學習新的技術呢?這看起來真是個愚蠢的題,PHP更新到了7.3,我們要去學習新特性;Java9也已經釋出,可能成為将來的趨勢;前端又有新的庫流行了,我們要趕緊去看文檔、看源碼…我們究竟是在不停的更新工具,還是在學習技能呢?

技術不是隻用來解決一個問題的

從C到PHP,再到Python,到Java、JavaScript,總是會産生一個疑惑,我是否真的學會了程式設計呢?C的應用場景好像涉及到的不多,PHP可以做網站背景,JavaScript互動性很強,而Python簡直大火,各種教育訓練機構開始"Python+人工智能”,許多從未學習過程式設計的人躍躍欲試,做其他開發的人員也蠢蠢欲動,仿佛學會機器學習算法就能年薪百萬,尤其“零基礎”的旗号更是吸人眼球。為了實作這個目标,還開設了高等數學等基礎知識課程,一周時間幫你搞定所有數學基礎。還有量化金融,大資料,無一不是如此。真正熱愛程式設計的人有多少?真正能夠克服難題的又有多少?好比學習JavaScript,入門很簡單,好像隻有簡單看一下視訊來個

getElementById()

就能做出一個動态效果了,學習什麼設計模式、函數式程式設計還有什麼用呢?短平快、高收入,如果真的這麼簡單,那還真的就爛大街了。事實上可能很少有人去認真讀完一本技術類的專著吧,也許會覺得根本不需要,哪裡不會搜哪裡,網上總能找到解決的方案,但是這樣卻很容易造成知識體系的不完整。你可以是自學程式設計,也可以是機構教育訓練,但你不能夠隻會做一個網站。這就像是流水線一樣,步驟是明确的,甚至遇到的問題可能都是可窮盡的。我們越是快速的去學習一個東西,就越是容易隻能夠利用這種技術解決一個問題。

程式設計的應用場景

我們應該更多的去思考我們遇到的問題如何編寫一個程式來解決,這個問題經常不是業餘上的時候,實際上生活中。學習中任何時候、任何地點都能夠産生這樣的問題,我們能夠思考如何使用程式來解決呢?我們的問題是什麼呢?這個問題我們需要怎麼轉換為一個設計程式的問題呢?很多時候經常會有人抱怨,沒有應用場景,好像隻有在一個實際的企業上班參與一個項目的時候才能應用。但那已經是把程式設計固化了,好像隻有遇到這些問題的時候才能夠運用我們的程式設計技能。但實際上你自己都明白,不是這樣的。初高中的時候老師經常講要學習知識遷移,對于程式設計我們是否能夠做到呢?

如何看待算法、編譯原理、計算機組成等内容

有時候我們總是繞不開一個問題,我們是否需要除程式設計語言之外的編譯原理、計算機組成原理這些東西呢?答案似乎是不言而喻的,因為大學計算機專業這些内容是必備的。但是經常有人說跟本用不上,盡管能夠增進對程式運作機制的了解,但實際開發中真的有那麼多時間給你去慢慢琢磨嗎?對于這些問題我也想過多次。我們在計算機學科的學習是否需要邊界?因為真的探索原理時一不小心就到了硬體的層面,當然不需要去完全了解硬體又是如何設計的,那麼問題來了,探索編譯原理、計算機組成原理的時候我們又有多少機會親自去接觸這些實體的部件呢?當然很少有機會,那麼實際我們所認為深入學習過的還是一種感性的了解狀态。在很多強類型語言比如C++,Java因為語言設計的規範性和内部處理機制的清晰,很少會産生像JavaScript那樣非常奇觀的問題,比如this指向莫名其妙的變化,變量提升等問題,即便這樣但我仍覺得JS的這種賦予開發者的自由是一種特質。在遇到諸如變量提升這類問題時,我們往往就需要從JS的編譯器入手考慮,函數和變量的聲明先被處理,因為這樣的原因産生了很多意料之外的問題。這個時候編譯的作用就展現出來了,因為我們必須了解JS處理時是如何和我們書寫代碼的順序不同,造成我們了解的困難的。在學習JS時我不斷和其他語言做比較,這些語言都在實作一些功能,但是處理的方式卻又有很大不同,就比如類繼承和原型繼承的問題。

如果說到算法,我們的大腦無時不刻都在進行算法設計和選擇的問題,我們旅遊時對于路線的安排就是一個很好的例子。花在路上的時間最短,而且同時考慮費用的問題,這就是一種算法的問題,隻是當我們需要将它用程式一步一步的設計出來的時候就不那麼容易了。前人為我們總結了很多算法問題,就像我們中學學的各種的幾何證明一樣,有誰還記得起來呢?但是又會有誰覺得它真的沒用呢?它對于我們分析問題、解決問題的思維訓練讓我們在脫離幾何證明之後依然存在。那我們學習程式設計呢?脫離具體做網站、做小程式等之外,程式設計對我們思維的影響是否存在呢?

從一門強類型語言的完整學習塑造程式設計思維

很多時候大學裡的程式設計與算法和資料結構課程是分開的,但其實很多時候認為資料結構困難或者算法難的原因可能也在此。現在很多人都說大學裡應該把C換成Python,因為C在實際工作中用不到,但在大學裡不是在教育訓練班裡,大學裡是來學程式設計訓練自己的程式設計思維,而不是短平快的要去找工作,忽略掉這一點将造成很大的損失。C語言非常的“完整”,因為它相對JavaScript這種語言沒有隐藏很多細節,是以我們自身能夠學習到的才更多,而不是隻學了一門語言,隻能夠做一個網站。強類型語言和弱類型語言相比,強類型語言對于我們思考資料類型等問題有很大幫助,而弱類型語言缺失了這一點,當然也讓我們的開發更加便捷。如果說完整的學習一門語言,達到我們塑造程式設計思維的效果,選擇強類型語言會是一個更好的選擇,是以相對強類型語言,弱類型語言同樣“隐藏”了很多細節。筆者打算學習《精通C++》這本1200多頁的大部頭,因為它非常全面,包含了常用的資料結構以及算法,這樣可以與其他語言形成參照,明白相近的效果在不同語言中是如何處理的,不同的語言又各自具有哪些特質。以一種新的方式去完整的學習這門可以說是對開發者要求作為嚴格的語言,進而更好的鍛煉自己的思維。

願每位熱愛技術的朋友都能努力在正确的方向上,并且保持熱愛。

繼續閱讀