鄙人大學電氣自動化專業,非科班出身,對程式設計瞭解不深,但是,經過多年學習以及實踐,對它又有了一番新的認識,在這裡我想把它說一下。
可能適合剛入門或者即將入門的新人。
程式設計其實就是編寫程式,讓計算機解決某個問題並得到想要得到的結果。
重要的是隻要執行起來,就可以離開人自動執行。
程式(計算機程式),一組指令,一組指示計算機或者其他具有訊息處理能力裝置每一步動作的指令,通常用某種程式語言編寫,執行於某種目標體系結構上。
程式是由語言寫出來的,語言分為高階和低階,應對離自然語言的遠近,越自然化的語言,自然越高階。
資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。例如 各種型別,視訊文字。
是組成資料的,有一定意義的基本單位,在計算機中通常作為整體處理。也被稱為記錄。
一個資料物件可以由若干個資料項組成,例如人,眼耳鼻舌身等屬性。
是性質相同的資料元素的集合,是資料的子集。
是相互之間存在一種或多種特定關係的資料元素的集合,分為邏輯結構和物理結構.
邏輯結構:集合,線性,樹形,圖形。
物理結構:線性,鏈式
演演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。
所以,我認為就算是最簡單的一個指令,也算是演演算法。
而大部分外人所說的演演算法,是高深的演演算法或者值錢的演演算法或者效能高的演演算法。
不要對演演算法想象的特別的高深,這樣就不容易深入學習,其實計算機的計算單元只是一個加法計算器就實現了加減乘除。
資料結構是演演算法實現的基礎,演演算法總是要依賴於某種資料結構來實現的。往往是在發展一種演演算法的時候,構建了適合於這種演演算法的資料結構。
演演算法的操作物件是資料結構。資料結構是演演算法設計的基礎。
兩者都是為最終解決問題服務的
所以,程式設計的本質就在於演演算法與資料結構的結合。
下面是我自己總結程式設計的要點。
如果將邏輯和控制有效的分開,那麼,程式碼就變得容易改進和維護。
第一個表示式傾向於資料結構和演演算法,它是想把這兩個拆分,早期都在走這條路。他們認為,如果資料結構設計得好,演演算法也會變得簡單,而且一個好的通用的演演算法應該可以用在不同的資料結構上。
第二個表示式則想表達,資料結構不復雜,複雜的是演演算法,也就是我們的業務邏輯是複雜的。我們的演演算法由兩個邏輯組成,一個是真正的業務邏輯,另外一種是控制邏輯。程式中有兩種程式碼,一種是真正的業務邏輯程式碼,另一種程式碼是控制我們程式的程式碼,叫控制程式碼,這根本不是業務邏輯,業務邏輯不關心這個事情。
所以
程式 = 資料結構 + 控制 + 邏輯
實際上的執行描述應該是這樣的。
大部分的語言都是基於作業系統的,當一個語言的程式執行了讀取檔案的操作,他就會先呼叫作業系統的讀取檔案的方法,這個方法由作業系統這個程式提前內建。
作業系統是由核心,檔案系統,各種驅動,IO,暫存器,硬碟,網路等等組成,實現了對硬體資源的全面掌控或者說是管理。
而,大部分的軟體也是基於對硬體或者對資料的管理。
硬體為執行者
忠實的執行由軟體生成的機器碼,既機器指令,並有條不紊的執行。
對資料進行各種搬移,並行資料按需放到不定的指定位置。
這個其實是我很早就好奇的一件事情,硬體何時與軟體建立了溝通,軟體如何與硬體進行了聯絡,又或,啥時候進入了所謂的Main方法。
這個是嵌入式的組合啟動程式碼,中間的一部分,寫的是,在啟動的過程中,指定了要執行的__main函數。
__main函數程式碼是編譯器自動生成的,你無法直接找到。
__main主要做這麼兩件事:初始化C/C++所需的資源,呼叫main函數
各種程式語言由編譯器或者直譯器,生成組合,再然後生成與當前CPU相匹配的機器碼(機器語言),然後由CPU解釋為之執行,每一條機器語言對應一條指令集。
總而言之,組合直接對應指令集。組合是指令集的簡寫或者名稱形式。
CPU忠實的執行了全部程式碼給的所有指令集合,並完成了工作。
這就是它的本質,很簡單,但是,看書又很枯燥,也許不會有人告訴你,但是,知道了,又感覺那麼的簡單的事情。
瞭解和知道整體,才助於有系統化的知識。
碎片的知識是片面的,只有系統化的知識才是整體的,可以讓你輕鬆看到問題的本質,更有效率的處理完事務,也容易讓你思考。
我們必當寫過一個「作業系統」。
就比如,作業系統裡有一個記憶體管理,我們為了不侷限於單體,就出現了Memcached,Redis,等基於記憶體和硬碟管理的業務型記憶體管理。
然後,從單體的作業系統,延伸到了,分散式,叢集,共用多臺計算機資源,分佈或共同執行。
所以,作業系統也在從無到有,從單到集中再到分佈,合而分之,分而合之。
我曾經面試過一些新人,每個人對問題都有不同的見解,但是,我還是希望有自己的見解,而不是聽聞而已。
就比如,windows安全還是linux安全?
穩定的事物必然是趨向於降低變化的,但是,發展,拓展,擴充套件,都是需要外擴,發展才是硬道理,針對業務的發展,不得不擁抱變化,甚至要主動積極的引入變化,但是,為了保證整體的穩定,又要避免對穩定部分的引入變化,引起整體的震盪。
這種矛盾的局面下,形成了兩個極端,一方面要讓業務活起來,流動起來,一方面又想讓其他核心業務穩定起來,不要影響現有業務。
而這種極端的環境結果,是必然的。
只能針對兩種不同的極端情況,對其採納即可,保持一種平衡。
優秀的語言很多,用的廣泛的語言也很多,市場佔有率高的語言也有很多,工資高的語言也有很多,但是,真到具體選擇的時候,發現還是讓人糾結。
入門語言,儘量選擇交集,這樣,都佔有一定的好處,入門之後,還是不要太在意語言本身了,把它當成一種工具,這樣,工具多少其實無礙。
畢竟,工具好壞都不太影響你真正成果的產出。
每個人對於一些定論都有各自的見解,但是,我還是希望得有自己的深度思考,就比如,windows安全還是linux安全?,如果盡信網上說的,那就是linux安全,畢竟linux漏洞少。
盡信書,不如無書。
如果我剛畢業,可能會說某某能力很重要,咋的咋的,但是,自己工作多年,所以,也不太好說哪個能力重要,但是,揚長避短,才能讓你發展起來。
很多人都會說自己不會啥不會啥,而不會說自己會啥會啥,我想選擇另外一邊會有不同的人生結果。
按照自然發展規律,以後用漢語(自然語言)來程式設計指日可待。
這樣,各種的AI智慧,都是先從理解人類所說的話語的語意開始的,自然語言分析也是一門學科。
勿忘初心,方得始終
為什麼人一定要有夢想或者理想,因為如果你想都不想,放到你面前也不會屬於你自己。
夢想是一定要有的,萬一實現了呢?