前言
Hi , 各位大佬、小佬們,我是CrazyCodes,本來打算在年初奉上本篇,但因諸多原因延遲了
以下是我往年的文章
- 2021 PHP程式設計師修煉祕籍 https://segmentfault.com/a/11...
- 2020 PHP程式設計師修煉祕籍 https://segmentfault.com/a/11...
- 2019 PHP程式設計師修煉祕籍 https://segmentfault.com/a/11...
計算機基礎
資料結構
是相互之間存在一種或多種特定關係的資料元素的集合
以上的學術性解釋有點晦澀難懂哈,首先為什麼要創造那麼多資料結構,其最核心的原因就是“需求”,不同的需求要求的關鍵點不同,這裡著重強調時間與空間的擇優,不同的資料結構,實際都是在權衡時間與空間的分配上,我們舉個例子
以順序表(陣列)和單連結串列來說
首先順序表,顧名思義是順序儲存,那麼順序儲存的優勢是訪問速度快,因為它的儲存是連續性的,我們只需要在當前地址+1,就可以訪問到下一個陣列元素,但是呢,就是因為它的地址是連續性的,我們在對陣列進行刪除和增加時,麻煩就比較大了,當我們想刪除或增加某個陣列元素,那麼就需要移動在刪除或增加的位置之後的所有元素,保證其儲存是連續性的。
那麼我們就可以認為,陣列這樣的資料結構適用於要求查詢速度快,佔用空間小,但更新速度稍微慢一點的需求。
反觀單連結串列
單連結串列的每一個結點由內容和指向下一個結點(next)的地址指標組成,每一個next指向他下一個結點的地址,這時對比陣列來說,因為每個內容都需要兩個地址塊去儲存,那麼儲存同樣數量的單連結串列與陣列對比,佔用的空間是陣列的兩倍,我們繼續看單連結串列的更新和刪除操作,因為單連結串列每個元素通過next來維繫,所以我們只需要將要插入的結點的next指向要插入結點後一個的結點的地址,再將要插入的前一個結點的next指標指向要插入結點的地址,就可以完成更新操作了。
那麼我們就可以認為,單連結串列這樣的資料結構適用於要求查詢和更新速度快,但可以接受犧牲一部分儲存的需求。
那麼回到現實需求中,陣列和單連結串列的特性對映了很多現實中的需求點,例如
- 要求查詢速度快,更新速度可以慢一點的獎勵規則的計算
- 要求更新速度快,空間可以佔用多一點的使用者支付結果的實時更新
推薦入門書籍 《大話資料結構(溢彩加強版)》 清華大學出版社
推薦線上課程 王爭老師的《資料結構與演算法之美》
演算法
好的演算法與資料結構息息相關
為什麼說演算法與資料結構相關,首先理解下為什麼需要演算法,那麼演算法是什麼?
演算法是為了更好的解決問題,那麼解決什麼問題? 與資料結構一樣,平衡時間與空間的問題
一道小學的數學題舉例
(15 + 4) * 3 = ?
你的數學老師肯定是這樣教你的
(15 * 3) + (4 * 3) = 57
那麼為什麼要這樣做?原公式我們也可以做出來,因為第二種方法計算能更快的速度計算出來,這就是上述我們說的解決時間問題
舉一個簡單的例子,分而治之是演算法內常見的方式,例如二分查詢,我們將一個陣列分成兩部分,分別同時去檢索要查詢的資料,那麼就要比從頭一個一個查詢速度要快一倍(忽略極端情況,第一個或者最後一個命中),這樣對比二分查詢和簡單的檢索,那麼二分查詢提高了效率(也就是縮短了檢索時間)
當然,有一些演算法是需要使用在特定的資料結構中的,例如熟知的二叉樹,樹的查詢是經典的分而治之的案例,如果是一顆有序的樹,那麼他的查詢時間複雜度是 O(Log2n),意味著我們平均查詢時間會比正常按序檢索快1倍甚至更高(忽略極端情況),但二叉樹的構造是由連結串列組成,一棵樹的左子結點指標和右子結點指標分別佔用空間,這說明一個樹結點至少佔用三個空間,並且保持樹一直是有序狀態需要犧牲更新成本,那麼樹的查詢我們可以認為主要目的是為了提高查詢的速度,對更新和空間佔用可以有一定的容忍。
推薦入門書籍 《趣學演算法》 人民郵電出版社
推薦線上課程 王爭老師的《資料結構與演算法之美》
資料庫系統
資料庫與資料結構息息相關
正規化就是前輩通過不斷的驗證給到的為了建立冗餘較小、結構合理的資料庫,是設計資料庫必須遵循的一定規則,在關係型資料庫中這種規格叫做正規化,本篇不僅說明正規化設計,也會給到一些例子,帶著各位一起分析給到的資料表設計屬於第幾正規化。
關於正規化具體可以看我這篇 https://segmentfault.com/a/11...
為什麼說資料結構與資料庫系統息息相關,以如何提高查詢效率為例,如果我們的資料儲存在文字檔案(屬於順序儲存),那麼我們向在文字中查詢某一段資料,我們只能從檔案頭部或者尾部開始查詢,類似於連結串列的順序查詢,那麼如果將 O(N)的查詢效率提高到O(log2n)的查詢效率呢,這裡就使用了樹結構,MySQL中使用的是紅黑樹,紅黑樹的具體原理就不在本文中過多描述了。
推薦線上課程 丁奇老師的《MySQL實戰45講》
計算機組成
從根上理解計算機
這裡以上述資料庫為例,除了使用特定資料結構解決效率問題,這僅僅在應用層,在物理層,機械硬碟和SSD也會影響資料的查詢效率,冷資料適合放在機械硬碟中,SSD則更適合放一些頻繁操作的資料,那麼SSD不能放冷資料嗎?回答當然是可以的,但到了硬體層面,我們就要考慮費用問題了,一般冷資料都是在做數倉,上億的資料放入SSD硬碟,卻不頻繁使用,那麼成本會提高很多。
除非之外還有CPU,記憶體,GPU等等知識都會在計算機組成中看到。
推薦線上課程 徐文浩老師的《深入淺出計算機組成原理》
計算機網路
上圖列出需要了解的一些核心知識點,可google依次學習。
作業系統
推薦線上課程 劉超老師的《趣談 Linux 作業系統》
編譯原理
推薦線上課程 宮文學老師的《編譯原理之美》
開發語言
C語言
C語言作為大部分高階語言的根基,就不必多言了。
PHP
PHP 新徵程
https://blog.jetbrains.com/ph...
不知不覺 PHP 已經走過了 26 個年頭了,在這個過程中,有大量非常優秀的人才一直積極地在為 PHP 的研發、發展默默付出著,比如 Rasmus Lerdorf, Zeev Suraski, Andi Gutmans, Nikita Popov 等等非常多的人。2021年,PHP將迎來新一輪的發展。
就在2021年11月22日Phpstorm 的開發商 JetBrains 宣佈,將與 Automattic、Laravel、Laravel、Acquia 等多家公司共同成立 PHP 基金會。據介紹,PHP 基金會將是一個非營利組織,其使命是確保 PHP 語言的活力和繁榮。
PHP基金會將是一個非盈利組織,其使命是確保PHP語言的長壽和繁榮。同時,該基金會將通過 Open Collective 來實現。Open Collective 是一家處理法律和會計方面的基金會服務提供商,Vue.js、Open Web Docs、webpack、Yii Framework 等多個開源專案都採用其服務。
此外,PHP 基金會預計每年將籌集約 300000 美元,其中,JetBrains 將每年捐款 100000 美元,任何 php-src 的貢獻者都可以向基金會申請資助。在基金會成立初期,將設立一個臨時管理機構,臨時管理機構包括的成員有:Rasmus Lerdorf、Dmitry Stogov、Joe Watkins、Sara Golemon、Derick Rethans、Sebastian Bergmann 和 Nikita Popov。同時,當前的 RFC 流程不會改變,語言決定將始終留給 PHP Internals 社群。
PHP 基金會的官網 https://opencollective.com/ph...
總結
本來下面還有將近1k字的描述,個人感覺展開講解的必要性不大,這裡就以總結方式呈現
- 語言僅僅是開發工具,但也要適應行業現狀,適當擴充套件自己的技術棧(例如go)
- 有興趣可以參與一些開源程式
- 架構不是一次形成的,逐步積累
- 軟技能:英語水平、文件撰寫、圖表設計
- 如果你未來想成為leader,至少現在對自己文件和程式碼要有一定規範自我約束
- 戰功 vs 內功,戰功代表你都做哪些事,內功在於你在事上積累了什麼
- 覆盤、覆盤、覆盤、定期覆盤,重要的事情說三遍
致謝
感謝你看到這裡,希望本篇對你有幫助,謝謝