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