關於程式設計本質那些事

2022-08-10 09:00:20

鄙人大學電氣自動化專業,非科班出身,對程式設計瞭解不深,但是,經過多年學習以及實踐,對它又有了一番新的認識,在這裡我想把它說一下。

可能適合剛入門或者即將入門的新人。

程式設計概述

什麼是程式設計

程式設計其實就是編寫程式,讓計算機解決某個問題並得到想要得到的結果。
重要的是隻要執行起來,就可以離開人自動執行。

程式(計算機程式),一組指令,一組指示計算機或者其他具有訊息處理能力裝置每一步動作的指令,通常用某種程式語言編寫,執行於某種目標體系結構上。

什麼是程式語言

程式是由語言寫出來的,語言分為高階和低階,應對離自然語言的遠近,越自然化的語言,自然越高階。

程式設計的本質

資料結構

資料

資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。例如 各種型別,視訊文字。

資料的元素 (類)

是組成資料的,有一定意義的基本單位,在計算機中通常作為整體處理。也被稱為記錄。

資料項(屬性)

一個資料物件可以由若干個資料項組成,例如人,眼耳鼻舌身等屬性。

資料物件(實體或集合實體)

是性質相同的資料元素的集合,是資料的子集。

資料結構

是相互之間存在一種或多種特定關係的資料元素的集合,分為邏輯結構和物理結構.

邏輯結構:集合,線性,樹形,圖形。

物理結構:線性,鏈式

演演算法

演演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示一個或多個操作。

所以,我認為就算是最簡單的一個指令,也算是演演算法。

而大部分外人所說的演演算法,是高深的演演算法或者值錢的演演算法或者效能高的演演算法。

不要對演演算法想象的特別的高深,這樣就不容易深入學習,其實計算機的計算單元只是一個加法計算器就實現了加減乘除。

演演算法的目的

  1. 能實現想要的結果,比如壓縮演演算法,加密演演算法,首先得保證資料不失真。
  2. 高效,空間複雜度,時間複雜度較好(然後保證,使用的資源足夠少,做的事兒足夠多,速度足夠快)

演演算法的依賴

資料結構是演演算法實現的基礎,演演算法總是要依賴於某種資料結構來實現的。往往是在發展一種演演算法的時候,構建了適合於這種演演算法的資料結構。

演演算法的操作物件是資料結構。資料結構是演演算法設計的基礎。

兩者都是為最終解決問題服務的

何為程式設計的本質

所以,程式設計的本質就在於演演算法與資料結構的結合。

下面是我自己總結程式設計的要點。

  1. 程式 = 資料結構 + 演演算法
  2. 演演算法 = 控制 + 邏輯

如果將邏輯和控制有效的分開,那麼,程式碼就變得容易改進和維護。

第一個表示式傾向於資料結構和演演算法,它是想把這兩個拆分,早期都在走這條路。他們認為,如果資料結構設計得好,演演算法也會變得簡單,而且一個好的通用的演演算法應該可以用在不同的資料結構上。

第二個表示式則想表達,資料結構不復雜,複雜的是演演算法,也就是我們的業務邏輯是複雜的。我們的演演算法由兩個邏輯組成,一個是真正的業務邏輯,另外一種是控制邏輯。程式中有兩種程式碼,一種是真正的業務邏輯程式碼,另一種程式碼是控制我們程式的程式碼,叫控制程式碼,這根本不是業務邏輯,業務邏輯不關心這個事情。

所以

程式 = 資料結構 + 控制 + 邏輯

程式碼始終

軟體

實際上的執行描述應該是這樣的。

大部分的語言都是基於作業系統的,當一個語言的程式執行了讀取檔案的操作,他就會先呼叫作業系統的讀取檔案的方法,這個方法由作業系統這個程式提前內建。

作業系統是由核心,檔案系統,各種驅動,IO,暫存器,硬碟,網路等等組成,實現了對硬體資源的全面掌控或者說是管理。

而,大部分的軟體也是基於對硬體或者對資料的管理。

硬體

硬體為執行者

忠實的執行由軟體生成的機器碼,既機器指令,並有條不紊的執行。

對資料進行各種搬移,並行資料按需放到不定的指定位置。

軟體硬體中間發生了什麼

這個其實是我很早就好奇的一件事情,硬體何時與軟體建立了溝通,軟體如何與硬體進行了聯絡,又或,啥時候進入了所謂的Main方法。

這個是嵌入式的組合啟動程式碼,中間的一部分,寫的是,在啟動的過程中,指定了要執行的__main函數。

__main函數程式碼是編譯器自動生成的,你無法直接找到。

__main主要做這麼兩件事:初始化C/C++所需的資源,呼叫main函數

程式碼始終 總結

各種程式語言由編譯器或者直譯器,生成組合,再然後生成與當前CPU相匹配的機器碼(機器語言),然後由CPU解釋為之執行,每一條機器語言對應一條指令集。

總而言之,組合直接對應指令集。組合是指令集的簡寫或者名稱形式。

CPU忠實的執行了全部程式碼給的所有指令集合,並完成了工作。

這就是它的本質,很簡單,但是,看書又很枯燥,也許不會有人告訴你,但是,知道了,又感覺那麼的簡單的事情。

瞭解和知道整體,才助於有系統化的知識。

碎片的知識是片面的,只有系統化的知識才是整體的,可以讓你輕鬆看到問題的本質,更有效率的處理完事務,也容易讓你思考。

作業系統

我們必當寫過一個「作業系統」。

就比如,作業系統裡有一個記憶體管理,我們為了不侷限於單體,就出現了Memcached,Redis,等基於記憶體和硬碟管理的業務型記憶體管理。

然後,從單體的作業系統,延伸到了,分散式,叢集,共用多臺計算機資源,分佈或共同執行。

所以,作業系統也在從無到有,從單到集中再到分佈,合而分之,分而合之。

常遇到的四個問題(當然只是舉例)

我曾經面試過一些新人,每個人對問題都有不同的見解,但是,我還是希望有自己的見解,而不是聽聞而已。

就比如,windows安全還是linux安全?

對於變化是應該避免還是擁抱

穩定的事物必然是趨向於降低變化的,但是,發展,拓展,擴充套件,都是需要外擴,發展才是硬道理,針對業務的發展,不得不擁抱變化,甚至要主動積極的引入變化,但是,為了保證整體的穩定,又要避免對穩定部分的引入變化,引起整體的震盪。

這種矛盾的局面下,形成了兩個極端,一方面要讓業務活起來,流動起來,一方面又想讓其他核心業務穩定起來,不要影響現有業務。

而這種極端的環境結果,是必然的。

只能針對兩種不同的極端情況,對其採納即可,保持一種平衡。

對於程式語言的選擇,我選最火的還是自己用的舒服的

優秀的語言很多,用的廣泛的語言也很多,市場佔有率高的語言也有很多,工資高的語言也有很多,但是,真到具體選擇的時候,發現還是讓人糾結。

入門語言,儘量選擇交集,這樣,都佔有一定的好處,入門之後,還是不要太在意語言本身了,把它當成一種工具,這樣,工具多少其實無礙。

畢竟,工具好壞都不太影響你真正成果的產出。

對於別人所說的這個好還是不好

每個人對於一些定論都有各自的見解,但是,我還是希望得有自己的深度思考,就比如,windows安全還是linux安全?,如果盡信網上說的,那就是linux安全,畢竟linux漏洞少。

盡信書,不如無書。

哪個能力更加的重要?溝通還是自學

如果我剛畢業,可能會說某某能力很重要,咋的咋的,但是,自己工作多年,所以,也不太好說哪個能力重要,但是,揚長避短,才能讓你發展起來。

很多人都會說自己不會啥不會啥,而不會說自己會啥會啥,我想選擇另外一邊會有不同的人生結果。

對於未來程式語言我的暢想

按照自然發展規律,以後用漢語(自然語言)來程式設計指日可待。

這樣,各種的AI智慧,都是先從理解人類所說的話語的語意開始的,自然語言分析也是一門學科。

總結

勿忘初心,方得始終

為什麼人一定要有夢想或者理想,因為如果你想都不想,放到你面前也不會屬於你自己。

夢想是一定要有的,萬一實現了呢?