鄙人大學電氣自動化專業,非科班出身,對編程了解不深,但是,經過多年學習以及實踐,對它又有了一番新的認識,在這里我想把它說一下,
可能適合剛入門或者即將入門的新人,
編程概述
什么是編程
編程其實就是撰寫程式,讓計算機解決某個問題并得到想要得到的結果,
重要的是只要運行起來,就可以離開人自動運行,
程式(計算機程式),一組指令,一組指示計算機或者其他具有訊息處理能力裝置每一步動作的指令,通常用某種程式語言撰寫,運行于某種目標體系結構上,
什么是編程語言
程式是由語言寫出來的,語言分為高級和低級,應對離自然語言的遠近,越自然化的語言,自然越高級,
編程的本質
資料結構
資料
資料是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,并輸入給計算機處理的符號集合,例如 各種型別,視頻文本,
資料的元素 (類)
是組成資料的,有一定意義的基本單位,在計算機中通常作為整體處理,也被稱為記錄,
資料項(屬性)
一個資料物件可以由若干個資料項組成,例如人,眼耳鼻舌身等屬性,
資料物件(物體或集合物體)
是性質相同的資料元素的集合,是資料的子集,
資料結構
是相互之間存在一種或多種特定關系的資料元素的集合,分為邏輯結構和物理結構.
邏輯結構:集合,線性,樹形,圖形,
物理結構:線性,鏈式
演算法
演算法是解決特定問題求解步驟的描述,在計算機中表現為指令的有限序列,并且每條指令表示一個或多個操作,
所以,我認為就算是最簡單的一個指令,也算是演算法,
而大部分外人所說的演算法,是高深的演算法或者值錢的演算法或者性能高的演算法,
不要對演算法想象的特別的高深,這樣就不容易深入學習,其實計算機的計算單元只是一個加法計算器就實作了加減乘除,
演算法的目的
- 能實作想要的結果,比如壓縮演算法,加密演算法,首先得保證資料不失真,
- 高效,空間復雜度,時間復雜度較好(然后保證,使用的資源足夠少,做的事兒足夠多,速度足夠快)
演算法的依賴
資料結構是演算法實作的基礎,演算法總是要依賴于某種資料結構來實作的,往往是在發展一種演算法的時候,構建了適合于這種演算法的資料結構,
演算法的操作物件是資料結構,資料結構是演算法設計的基礎,
兩者都是為最終解決問題服務的
何為編程的本質
所以,編程的本質就在于演算法與資料結構的結合,
下面是我自己總結編程的要點,
- 程式 = 資料結構 + 演算法
- 演算法 = 控制 + 邏輯
如果將邏輯和控制有效的分開,那么,代碼就變得容易改進和維護,
第一個運算式傾向于資料結構和演算法,它是想把這兩個拆分,早期都在走這條路,他們認為,如果資料結構設計得好,演算法也會變得簡單,而且一個好的通用的演算法應該可以用在不同的資料結構上,
第二個運算式則想表達,資料結構不復雜,復雜的是演算法,也就是我們的業務邏輯是復雜的,我們的演算法由兩個邏輯組成,一個是真正的業務邏輯,另外一種是控制邏輯,程式中有兩種代碼,一種是真正的業務邏輯代碼,另一種代碼是控制我們程式的代碼,叫控制代碼,這根本不是業務邏輯,業務邏輯不關心這個事情,
所以
程式 = 資料結構 + 控制 + 邏輯
代碼始終
軟體

實際上的執行描述應該是這樣的,
大部分的語言都是基于作業系統的,當一個語言的程式執行了讀取檔案的操作,他就會先呼叫作業系統的讀取檔案的方法,這個方法由作業系統這個程式提前內置,
作業系統是由內核,檔案系統,各種驅動,IO,暫存器,硬碟,網路等等組成,實作了對硬體資源的全面掌控或者說是管理,
而,大部分的軟體也是基于對硬體或者對資料的管理,
硬體

硬體為執行者
忠實的執行由軟體生成的機器碼,既機器指令,并有條不紊的執行,
對資料進行各種搬移,并發資料按需放到不定的指定位置,
軟體硬體中間發生了什么
這個其實是我很早就好奇的一件事情,硬體何時與軟體建立了溝通,軟體如何與硬體進行了聯系,又或,啥時候進入了所謂的Main方法,

這個是嵌入式的匯編啟動代碼,中間的一部分,寫的是,在啟動的程序中,指定了要執行的__main函式,
__main函式代碼是編譯器自動生成的,你無法直接找到,
__main主要做這么兩件事:初始化C/C++所需的資源,呼叫main函式
代碼始終 總結
各種編程語言由編譯器或者解釋器,生成匯編,再然后生成與當前CPU相匹配的機器碼(機器語言),然后由CPU解釋為之執行,每一潭訓器語言對應一條指令集,
總而言之,匯編直接對應指令集,匯編是指令集的簡寫或者名稱形式,
CPU忠實的執行了全部代碼給的所有指令集合,并完成了作業,
這就是它的本質,很簡單,但是,看書又很枯燥,也許不會有人告訴你,但是,知道了,又感覺那么的簡單的事情,
了解和知道整體,才助于有系統化的知識,
碎片的知識是片面的,只有系統化的知識才是整體的,可以讓你輕松看到問題的本質,更有效率的處理完事務,也容易讓你思考,
作業系統

我們必當寫過一個“作業系統”,
就比如,作業系統里有一個記憶體管理,我們為了不局限于單體,就出現了Memcached,Redis,等基于記憶體和硬碟管理的業務型記憶體管理,
然后,從單體的作業系統,延伸到了,分布式,集群,共用多臺計算機資源,分布或共同執行,
所以,作業系統也在從無到有,從單到集中再到分布,合而分之,分而合之,
常遇到的四個問題(當然只是舉例)
我曾經面試過一些新人,每個人對問題都有不同的見解,但是,我還是希望有自己的見解,而不是聽聞而已,
就比如,windows安全還是linux安全?
對于變化是應該避免還是擁抱
穩定的事物必然是趨向于降低變化的,但是,發展,拓展,擴展,都是需要外擴,發展才是硬道理,針對業務的發展,不得不擁抱變化,甚至要主動積極的引入變化,但是,為了保證整體的穩定,又要避免對穩定部分的引入變化,引起整體的震蕩,
這種矛盾的局面下,形成了兩個極端,一方面要讓業務活起來,流動起來,一方面又想讓其他核心業務穩定起來,不要影響現有業務,
而這種極端的環境結果,是必然的,
只能針對兩種不同的極端情況,對其采納即可,保持一種平衡,
對于編程語言的選擇,我選最火的還是自己用的舒服的
優秀的語言很多,用的廣泛的語言也很多,市場占有率高的語言也有很多,工資高的語言也有很多,但是,真到具體選擇的時候,發現還是讓人糾結,
入門語言,盡量選擇交集,這樣,都占有一定的好處,入門之后,還是不要太在意語言本身了,把它當成一種工具,這樣,工具多少其實無礙,
畢竟,工具好壞都不太影響你真正成果的產出,
對于別人所說的這個好還是不好
每個人對于一些定論都有各自的見解,但是,我還是希望得有自己的深度思考,就比如,windows安全還是linux安全?,如果盡信網上說的,那就是linux安全,畢竟linux漏洞少,
盡信書,不如無書,
哪個能力更加的重要?溝通還是自學
如果我剛畢業,可能會說某某能力很重要,咋的咋的,但是,自己作業多年,所以,也不太好說哪個能力重要,但是,揚長避短,才能讓你發展起來,
很多人都會說自己不會啥不會啥,而不會說自己會啥會啥,我想選擇另外一邊會有不同的人生結果,
對于未來編程語言我的暢想
按照自然發展規律,以后用漢語(自然語言)來編程指日可待,
這樣,各種的AI智能,都是先從理解人類所說的話語的語意開始的,自然語言分析也是一門學科,
總結
勿忘初心,方得始終
為什么人一定要有夢想或者理想,因為如果你想都不想,放到你面前也不會屬于你自己,
夢想是一定要有的,萬一實作了呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/501446.html
標籤:其他
下一篇:商城限時秒殺功能系統
