什麼是程式設計師?編程本質是什麼?

java鬥帝之路 發佈 2022-08-10T04:42:25.829280+00:00

關於編程本質那些事鄙人大學電氣自動化專業,非科班出身,對編程了解不深,但是,經過多年學習以及實踐,對它又有了一番新的認識,在這裡我想把它說一下。可能適合剛入門或者即將入門的新人。編程概述什麼是編程編程其實就是編寫程序,讓計算機解決某個問題並得到想要得到的結果。

關於編程本質那些事

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

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

編程概述

什麼是編程

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

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

什麼是程式語言

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

編程的本質

數據結構

數據

數據是描述客觀事物的符號,是計算機中可以操作的對象,是能被計算機識別,並輸入給計算機處理的符號集合。例如 各種類型,視頻文本。

數據的元素 (類)

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

數據項(屬性)

一個數據對象可以由若干個數據項組成,例如人,眼耳鼻舌身等屬性。

數據對象(實體或集合實體)

是性質相同的數據元素的集合,是數據的子集。

數據結構

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

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

物理結構:線性,鏈式

算法

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

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

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

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

算法的目的

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

算法的依賴

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

算法的操作對象是數據結構。數據結構是算法設計的基礎。

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

何為編程的本質

所以,編程的本質就在於算法與數據結構的結合。

下面是我自己總結編程的要點。

  1. 程序 = 數據結構 + 算法
  2. 算法 = 控制 + 邏輯

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

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

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

所以

程序 = 數據結構 + 控制 + 邏輯

代碼始終

軟體

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

大部分的語言都是基於作業系統的,當一個語言的程序執行了讀取文件的操作,他就會先調用作業系統的讀取文件的方法,這個方法由作業系統這個程序提前內置。

作業系統是由內核,文件系統,各種驅動,IO,寄存器,硬碟,網絡等等組成,實現了對硬體資源的全面掌控或者說是管理。

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

硬體

硬體為執行者

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

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

軟體硬體中間發生了什麼

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

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

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

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

代碼始終 總結

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

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

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

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

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

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

作業系統

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

盡信書,不如無書。

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

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

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

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

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

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

總結

勿忘初心,方得始終

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

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

關鍵字: