?開始捲起來吧!為讓學習更有趣,這篇文章我會列出電腦科學理論和一些概念,並且用類比的方式和儘量少的技術術語來為你進行解釋。這樣做的目的就是為了讓你快速瞭解計算機,查漏補缺。
?如果對這些概念有任何解釋不妥之處,請及時指正我。
雖然這些概念能夠快速幫助你去理解,但是這並不是一種最好的學習方式,如果你想要完整的理解這些概念,去看相關書籍或者論文。
1. 核心概念:資料結構和演算法
1.1 遞迴
比如你坐在電影院正準備好看電影的時候,這時候剛來電影院的人問你坐的是第幾排,你懶的數就問前面的人,“哥們,你那一排是第幾排?”你只需要從對方口中得知他的行號 + 1 就是你坐的行號,但是你前面那哥們也做了同樣的事情,他也問了他前面的人。。。。。。依此類推,一直問到第一排,他回答:“我這是第一排!” 然後從現在開始,正確的行號將會一直 + 1 直到傳達給剛進電影院的那哥們。
千萬別在電影院這麼做,否則第二排或者第三排的人可能會被第一排的當成傻子。。。。。。因為第二排的人問第一排的人:“哥們,你坐第幾排?” 想象一下這個場景。。。。。。
我給你幾幅圖,讓你理解一下什麼是遞迴
。
1.2 大資料
假設你有一個花園,但是你花園中的水管漏水,你需要拿一些桶和密封材料來解決這個問題,但是過了一會兒,你發現實際洩漏的要大的多,你需要水管工拿更多的工具來處理,同時,你仍在使用水桶排水。 過了一會兒,你發現地下有一條巨大的地下溪流已經開啟。你需要每秒處理數加侖的水。
這時候桶就沒用了,你需要一種全新的方法來解決這個問題,因為水的體積和速度都在增加。為了防止城鎮發生洪水,你需要 zf 建造一座大型水壩,然而這需要大量的土木工程專業知識和複雜的控制系統。
大資料描述了使用傳統資料處理工具無法管理的龐大而複雜的資料集。
1.3 資料結構
關於資料結構,每位程式設計師都應該知道
- 陣列 https://en.wikipedia.org/wiki...
- 樹 https://en.wikipedia.org/wiki...
- 棧 https://en.wikipedia.org/wiki...
- 佇列 https://en.wikipedia.org/wiki...
- 圖 https://en.wikipedia.org/wiki...
- 雜湊表 https://en.wikipedia.org/wiki...
- 連結串列 https://en.wikipedia.org/wiki...
- 堆 https://en.wikipedia.org/wiki...
2. 核心概念 AI
2.1 貪心演算法
想象一下,你要去徒步旅行,而你的目標是儘可能到達最高峰,在開始之前你已經有了地圖,但是地圖上顯示了成千上萬條路,但是你無法評估每一條,所以扔掉了地圖,你從一個看起來很簡單的路開始走,這種方式就是根據感性來選出來的,是一種貪婪和短視的表現,你選擇只走最傾斜向上的路線。
但是旅行結束後,全身痠痛,你檢視地圖卻發現旁邊有一條泥濘的小河,跨過去就好了,而不用一直向上走。
貪心演算法會選擇當下的最佳路線,而不是重新開始考慮評估選擇。
2.2 爬山演算法
這次你要爬另一座山,你決定要找到能夠帶你到達最高峰的那條路。但是很不幸,你的地圖丟了,而且山上霧氣很大,那怎麼辦呢?所以你為了讓旅途更輕鬆,你下載了一個 app ,這個 app 能夠跟蹤你走過的路測量你當前的高度。於是你每次走過的路線都是能夠把你帶到最高峰的路線,但是在中途,你選擇了一條另外的路線,而這個路線也能把你帶到最高峰。
2.3 模擬退火
在你前面的是珠穆朗瑪峰。
這是你所面臨的最大的挑戰。你的目標是登頂,但是一遍又一遍爬珠峰是不切實際的,所以你只有一次機會。你現在非常謹慎,你不會總是向上爬,而是偶爾移動到一個比較低的點來探索其他可能的路徑,以減少出錯的機會,你爬的越高,你移動到較低點進行探索的可能性就越低。
2.4 動態規劃
父親:在一張紙上寫下 “1+1+1+1+1+1+1+1 =”。
父親:那等於什麼?
兒子:三秒後數了數等於 8 。
父親:在左側寫下另一個“ + 1”。
父親:現在等於多少?
兒子:立刻確定了是 9 !
父親:現在為何你數的這麼快?
兒子:因為你剛剛才加了一個!
父親:所以你不需要重新數,而是記住了剛剛那個數字等於 8 !
2.5 P 和 NP 的問題
P vs NP 是電腦科學領域中最流行和最重要的未解決問題之一。
假設我給你一個乘法問題,例如:
Q1:P = 7 * 17
答案是119 。這個很容易算吧?如果我顛倒這個問題怎麼辦:
Q2:P * Q = 119 (P 和 Q 都不能是 1 或者 119)
如果你沒有看到 Q1,你要解決 Q2 ,你可能會從 2 開始嘗試,一直遍歷到 118 為止。所以我們還沒有一種找到一個數因數的高效演算法。
如果我問你,P 可能是 7 嗎?這時候你可以輕鬆驗證答案嗎?你當然可以,只需要將 119 / 7 就可以了。
乘法很容易,但是找到一個數的原始因數卻很難。
所以 Q1 是一個 P(多項式)問題,它很容易得到解決,因為計算機可以輕鬆的將任意兩個數相乘。
但是 Q2 是一個 NP(非多項式)問題,它很難解決,找到 119 的因數對計算機來說還是很容易解決的,但是 500 位數字呢?現在對任何計算機都是不可能的。
這是這個問題的最重要的部分:NP 問題(分解)是否也是 P(乘法),只是我們還沒有發現解決 NP 問題的有效方法?還是人類太笨了?想象一下,存在比人類智慧得多的機器或生命。他們看我們就像我們看螞蟻一樣。我們的智力水平對他們來說太微不足道了。解決 P vs NP 問題就像為他們解決 1 + 1!
那麼為什麼 P vs NP 問題很重要呢?如果我們能夠證明 P=NP,則意味著所有 NP 問題都可以在合理的計算機時間內輕鬆解決。我們將能夠治癒癌症(蛋白質摺疊)、破解密碼(RSA)等。這將會改變世界。
3. 核心概念:併發
前景提要:假設你正在某公司擔任祕書,你所做的工作包括接打電話、安排會議、寫檔案等,你總是需要根據任務的優先順序來停下手頭的工作轉而做其他的(工作),每次電話響起時,你都需要停止正在處理的工作。
3.1 並行
隨著任務越積越多,你無法應對你的工作了,因為有太多的書寫任務,你向老闆抱怨,他願意再僱個人來幫你分擔書寫任務。
並行允許有兩個或者更多的任務同時執行,但是前提是你的 CPU 能夠支援多處理能力,人只有一個 CPU ,所以一心不能二用。這也並不是一件壞事,有的時候單執行緒的工作效率反而更高,而中斷(學習的時候被打斷)是工作的天敵,這種開銷實在是太大了。
所以你和新招的那個僱員一起分擔書寫任務就是一種並行
。
併發概念的引入也引發了很多很多問題,比如下面的競態條件。
3.2 競態條件
這裡就不得不提我們大家都耳熟能詳的銀行轉賬這個例子了:
- 你的銀行賬戶裡有 1000 元。
- 有人轉給你 500 元,而你從 ATM 中提取了 300 元。
- 假設這兩筆交易同時進行,兩筆交易都會看到你當前的餘額是 1000 元(注意這是兩筆交易,這兩筆交易之前彼此不可見,這點很重要)。
- 現在,第一筆交易給你的賬戶增加了 500 元,你現在就有了 1500 元。但是,第二筆交易看到的你的賬戶餘額還是 1000 元,他從 1000 元中扣除了 300 ,變成了 700 元。
- 所以你現在的賬戶餘額會變為
700
元,而不是1200
元,因為第二筆交易覆蓋了第一筆交易。 - 發生這種情況是因為銀行系統不知道其他正在進行的交易。
那麼,你應該如何處理這種情況呢?下面是幾種解決方式。
3.3 互斥
現在我們採用這種方式:只要有正在進行的交易,系統就會鎖定交易中涉及的賬戶。而且系統會認定轉賬開始 -> 轉賬完成是一個完整的事務週期。
所以這一次,當第一筆交易發生的那一刻,你的賬戶會被鎖定,你不能再從你的賬戶中取錢,直到第一筆交易完成為止。
所以互斥是不是就解決問題了?
雖然互斥能解決系統資料安全性的問題,但是卻不符合人的感性認知。但沒有人希望每次有正在進行的交易時都被 ATM 拒絕。
所以我們需要修改一下方案。
3.4 訊號量
二進位制訊號量
現在我們需要為不同型別的交易設定不同的優先順序。假如提現請求的優先順序要高於銀行轉賬的優先順序。所以當你從 ATM 中取款時,這筆交易的優先順序要大於向你賬戶轉賬的優先順序,所以此時轉賬的的交易會暫停,而提現的事務優先進行,因為它具有更高的優先順序,等到提現成功後,轉賬事務再恢復。
二進位制訊號量很簡單,1 = 正在進行的交易, 0 = 等待。
計數訊號量
計數訊號量允許多個程式同時執行。
假設你是一家游泳館的工作人員,有 10 個儲物櫃,每個儲物櫃都有一把鑰匙,每次收到或者分發鑰匙時,你都需要把控所有的鑰匙數量,如果所有儲物櫃都滿了,其他人必須排隊。 每當有人完成時,他會將鑰匙交給佇列中的第一個人。
3.5 死鎖
死鎖是另外一種併發中的共性問題。
還是讓我們拿銀行轉賬來舉例子。請記住,只要有正在進行的事務,就會鎖定對銀行帳戶的訪問。
- 假如你向張阿姨轉賬 500 元(來讓張阿姨高興一下),同時張阿姨向你轉賬 1000 元(讓你補補身子)。
- 於是事務 A 鎖定了張阿姨的賬戶,並且從她的賬戶里扣除了 1000 元。
- 事務B 鎖定你的賬戶,並且從你的賬戶里扣除了 500 元。
- 然後,事務 A 嘗試訪問你的賬戶來新增她給你轉賬的 1000 元。
- 同時,事務 B 嘗試訪問張阿姨的賬戶來新增你給她轉賬的 500 元。
但是,由於兩項交易都沒有完成,因此兩個事務都無法訪問鎖定的帳戶,造成兩個事務都在等待對方事務的結束,這種情況就是死鎖。
還有為什麼談戀愛的過程中男生要主動一些,如果你不主動,可能就死局(死鎖)了。
4. 核心概念:電腦保安
4.1 計算機黑客
計算機黑客類似於強制闖入你的房子裡,下面有幾種流行的黑客技術。
暴力攻擊
這種做法就是嘗試使用成百上千種不同的密碼。有經驗的黑客會先嚐試最常用的密碼。
暴力攻擊會嘗試所有可能的密碼,通常首先猜測常用的密碼,如“123456”、“abcdef”等。
我之前嘗試過用 kali linux 配上專用的裝置跑過包破解過鄰居家的 WI-FI ,結果密碼只是 000000 。
社會工程
這是一項強大的技術!!!我願稱之為網路 Pua!!!
一對夫婦剛搬進隔壁。他們真的很好,樂於助人。他們經常請你吃晚飯。有一天,你說你很快就會去度假兩週。 他們高興地提出要照顧你的狗。你給他們留了一把備用鑰匙。從那以後,你再也沒有聽到關於他們的任何訊息。
社會工程學會誘騙使用者透露他們的私人資訊。
此處應該要有個配圖。
<img src="https://tva1.sinaimg.cn/large/008i3skNly1gvp44j0stej60ha0dkjrp02.jpg" alt="image-20211023120448543" style="zoom:50%;" />
安全漏洞
安全漏洞就是黑客入侵你家能找到的缺口,比如你可能沒關窗戶。
特洛伊木馬
黑客冒充水管工,讓你幫他開門,他修理了你漏水的水管,但是他走後,你發現你的首飾不見了。
特洛伊木馬是假裝有用並在後臺執行惡意程式碼的惡意軟體程式。
RootKit
你的門鎖被卡住了,你打電話給鎖匠。他修理了你的門鎖並偷偷複製了另一把鑰匙。
Rootkit 通過社會工程等多種方式獲得計算機管理員或 root 訪問許可權,然後偽裝成防毒軟體難以檢測到的必要檔案。
DDos
這是一個書店的比喻。
假如你有一個書店,書店裡面能容納 200 多人,某一天突然有 200 多人進入你的書店,你的書店滿了,而且你不能趕走他們,因為他們看起來互相都不認識,而且他們似乎真的都有興趣買書,甚至有人問你 xxx 書在哪裡,然而櫃檯上只有一個人付了幾塊錢。
人們不斷進出幾個小時,但是你賣的書還不到 5 本,你覺得你這個書店還能撐多久?
DDoS 試圖通過大量訪問者來關閉站點或服務。
4.2 密碼學
對稱加密
假設老王和老劉想要互相傳送東西。為了確保沒有人可以看到他們的東西,他們用一個盒子鎖起來。他們為鎖製作了 2 個相同(對稱)的鑰匙,並事先見面共享鑰匙。
非對稱加密
在兩個人之間共享金鑰能夠正常工作,但是如果老王想和老趙交換東西,而且還不想讓老劉知道該怎麼辦?重新共享一個全新的鑰匙嗎?那假如老王想和 10 個不同的人交換東西該怎麼辦?難道要消滅掉解決問題的老王嗎?
所以老王想出了一個絕對fashion的主意:現在老王只維護一把鑰匙(私鑰),她將另一把鑰匙(公鑰)分給他的朋友們,任何人都能夠加密,但是隻有她有開啟(解密)的鑰匙,現在,任何人都能夠使用她發的公鑰進行加密,而且老王不需要再為任何人管理不同的鑰匙。
5. 核心概念:軟體開發方法
5.1 瀑布開發方式
你需要弄清楚所有的事情並記錄下來,就向是瀑布一樣,除非重新開始,否則無法返回。只有當前階段完成後,你才能進入下一階段。
<img src="https://tva1.sinaimg.cn/large/008i3skNly1gvphma9pgcj60wc0ocgo202.jpg" alt="image-20211023195137609" style="zoom:50%;" />
5.2 敏捷開發
這是國內大多數軟體公司採用的軟體開發方式 --- 敏捷開發。
一開始你就弄清楚一些你需要坐的事情,然後隨著開發的進行,不斷改進、發展協作和適應。
就像大多數產品經理或者你的領導說的:先弄一版出來再說。
5.3 現實世界中的軟體開發
現在你畢業了。你編寫了你認為比較漂亮的程式碼,一切都很完美。現在我給你介紹一種 牛仔編碼,這是大學教授沒有教你的開發方法。
你可能想知道為什麼你不會評估開發事件,請看下圖
總結
這篇文章我給你整理了一些電腦科學中的一些常見概念,並且用生動形象的例子來為你闡述這些概念,希望能降低你學這些內容的門檻。
還是那句話,如果你想要完整的理解這些概念,去看相關書籍或者論文。
最後給大家推薦一下我自己的 Github ,裡面有非常多的硬核文章,絕對會對你有幫助。