-
1 # 會技術的葛大爺
-
2 # 硬核說科技
資料結構和演算法,作業系統,編譯原理,計算機組成原理這些課程對普通程式設計師來說是否需要去學習?會帶來哪些幫助?
一、資料結構與演算法
正如 N.Wirth 教授所說的:資料結構+ 演算法=程式。
遇到一個實際問題,充分利用所學的資料結構,將資料及其之間的關係有效地儲存在計算機中,然後選擇合適的演算法策略,並用程式高效實現。
這句話可能有點抽象,我舉個例子給你們解釋一下。
在工作過程中,我們多多少少都接觸過 OAuth2 ,在使用 OAuth2 授權的時候,通常應用會彈出一個類似這樣的資訊:
1) 獲取使用者基本資訊介面2) 獲取使用者列表介面3) 使用者分組管理介面。。。
思考一下,如果讓你設計資料庫,應該怎麼設計資訊儲存許可權?
如何你熟練掌握了各種資料結構的特點的話,那自然而然想到使用 bitmap 來儲存許可權。
我們把許可權劃分成最小粒度之後,每一個 bit 都它的含義, 例如我們把許可權劃分為以下幾種:
獲取你的頭像、性別、暱稱等基本使用者資訊
以你的身份釋出微博
獲取你的好友列表
每勾選一個選項,就代表著這個許可權被授權,為了保證可擴充套件性,我們使用一個 uint64 來儲存這些 bit ,也就是說,我們一共可以劃分 64 種細分許可權,然後對這些許可權進行組合。
例如,第一個 bit 如果設定了,那麼就代表可以獲取你的暱稱、頭像、地區、性別等基本使用者資訊, 第二個 bit 如果設定了,就可以用你的身份髮狀態。
資料結構的實際作用還有挺多,感興趣的可以搜尋以下知識點:
二叉樹搜尋用於中斷處理、登記快取查詢等
雜湊表,用於實現索引節點、檔案系統完整性檢查等
紅黑樹用於排程、虛擬記憶體管理、跟蹤檔案描述符和目錄條目等
Radix 樹,用於記憶體管理、NFS 相關查詢和網路相關的功能
......
上面這些例子是關於資料結構的,我再舉一個演算法的例子。
這個時候採取的策略就是 LRU 快取淘汰演算法。
LRU 的全稱是 Least Recently Used,也就是說我們認為最近使用過的資料應該是是「有用的」,很久都沒用過的資料應該是無用的,記憶體滿了就優先刪那些很久沒用過的資料。
具體的關於 LRU 快取淘汰演算法 的介紹可以看我之前寫的一篇文章。
二、作業系統
先來看一下作業系統都有哪些內容。
現代計算機系統由一個或多個處理器、主存、印表機、鍵盤、滑鼠、顯示器、網路介面以及各種輸入/輸出裝置構成。
說實話,程式設計師不可能會掌握所有計算機系統的細節,所以在硬體的基礎之上,計算機安裝了一層軟體,這層軟體能夠透過響應使用者輸入的指令達到控制硬體的效果,從而滿足使用者需求,這種軟體稱之為 作業系統 ,它的任務就是為使用者程式提供一個更好、更簡單、更清晰的計算機模型。
我們依舊透過一個例子來解釋作業系統在工作中的幫助。
但真做了,你會發現,用一個執行緒處理網路 IO,只要寫對了,那麼哪怕系統壓力很大,只要 CPU 頂得住,就可以保證引入的延遲總是在幾個毫秒之內;但如果用了多執行緒分別處理收/發,那麼只要網路壓力稍大,引入的延遲就會增加,很快額外延遲就可能突破幾十個毫秒(這實際上已經完全不能用了)。
想搞明白這是為什麼,對作業系統排程原理、時間片等概念沒有足夠深刻的理解,是不可能的。
尤其是,當你突然遇到類似“系統壓力一大網路延遲急劇升高”的 bug 時,如果對作業系統沒有深入理解,你連準確描述都做不到,連查資料、求幫助都不知道該往哪個方向努力,更不用說 debug 了。
換句話說,你可以不造輪子,但是你要知道這輪子是怎麼造的,否則你連問問題都不知道如何去描述。
再降維一點,你總要掌握如何安裝 Windows 系統吧,否則妹子讓你去她房間裡修電腦你都只能拒絕掉!
三、編譯原理
眾所周知,編譯技術是計算機科學史上的明珠之一。
對於編譯原理,很多程式設計師的困惑就是:我也不會去設計一門新的程式語言,有必要學習編譯原理嗎?學了有什麼用呢?
實際上,編譯原理不是用於炫耀的屠龍技,程式設計師在工作中經常會碰到需要編譯技術的場景,比如:
編寫介面模板引擎;
為專案編寫各種各樣的 DSL;
深度理解甚至開發出 Spring、Hibernate、阿里巴巴 Druid 這樣的工具。
除此之外,解析使用者輸入,防止程式碼注入,為前端工程師提供像 React 那樣的 DSL,像 TypeScript 那樣把一門語言翻譯成另一門語言,像 CMake 和 Maven 那樣透過配置檔案來靈活工作,運維工程師分析日誌檔案等等高級別的需求,都會用到編譯技術。
當然,說實話,編譯原理並非隨隨便便就能入門的!
換言之,需要準備一些基礎知識在學習。
編譯原理的學習和實踐通常基於對計算機編譯過程、計算機基本工作原理、甚至一定的數學知識有一定積累,這些知識分別分佈並應用在了編譯原理的不同階段。
沒有這些基本知識的積累,很快就會在某個階段由於功底不夠而無法再繼續後面的學習。
所以不要一開始就去啃編譯原理。
四、計算機組成原理
從上面這張圖可以看出來,整個計算機組成原理,就是圍繞著計算機是如何組織運作展開的。
我們依舊來舉例子:)
每個程式設計師應該都知道 Ascii 碼,GB2312,GBK,Utf8,Unicode 等編碼格式,如果你沒接觸過,那總出現過檔案壓縮後解壓亂碼的情況吧?
瞭解了這些編碼的儲存格式,你才會明白為什麼會有中文亂碼問題,靠,我在寫這個回答的時候,我的後端同事發給我的日誌就出現了中文亂碼。。。。
再來個例子。
我們上面舉的關於 LRU 快取演算法 的例子,它的設計也是借鑑計算機組成原理的內容的,
在計算機的世界裡,空間換時間,時間換空間這個概念在複雜的設計中時常出現。
如果你想更詳細的瞭解 計算機組成原理 的知識,推薦一本書:《計算機組成:結構化方法》。
書的內容完全建立在“計算機是由層次結構組成的,每層完成規定的功能”這一概念之上。
1、數字邏輯層
2、微體系結構層
3、指令系統層
4、作業系統層
5、組合語言層
6、並行體系結構
以上就是我對 計算機基礎知識對程式設計師來說有多重要 的一個回答。
-
3 # 程式設計老妖
那要看什麼樣的基礎知識了,要是與非門之類的,對高階語言開發沒嘛用處。但對低階語言開發就有點用處了。若是資料結構之類的基礎知識,那就對高階開發語言有用了。基礎知識並非全有用,只是有適用的環境而已。
回覆列表
非常重要,必須認真學習。
學習基礎知識從來都是枯燥的,而且很多時候會給我們一個錯覺,就是基礎知識沒有用。這主要是因為,我們未來工作以後,更多的是面向應用,更直接的就是面向工具的使用,基礎知識基本是不可能直接拿出來用的,所以,大家就會覺得我只要懂應用方面的知識就好了,基礎知識根本不需要去學。
就拿程式設計師來舉例:
很多的程式設計師培訓機構,他們並不會教任何的基礎知識,直接就是教程式語言,然後設計一些案例做練習,3個月-6個月基本就結束。這樣教出來的程式設計師能夠寫程式碼嗎?當然是能的,不然這些培訓機構早垮了。而很多大學本科4年讀完的應屆生,說不定寫程式碼都沒有這些培訓幾個月的學生強,大學4年對於程式設計師來說難道就是白費嗎?
並不是的。
基礎知識決定的是你未來的高度,可能你作為一個初級、中級程式設計師,你不一定會用到資料結構、演算法、編譯原理。但初中級的程式設計師就是你未來幾十年的全部嗎?
如果是的,在你30多歲的時候,應該就會面對裁員了並且很難找到下一份工作。
程式設計師是一個幹到老學到老的工作,每天都需要去學習一點新的知識,技術也是在不斷的演進,需要去了解未來的技術發展方向,這樣才能夠一直產生價值。而基礎知識是什麼呢,就是當你對技術瞭解越深入時,越需要用到的東西。
例如:你要做大資料的工作時,你需要資料建模,需要在海量的資料中抽取自己需要的資料,還需要不影響系統的效能,運算速度更快。那麼你就必須要了解演算法,瞭解時間複雜度。如果你曾經大學時好好的學習了這些知識,並且時不時會溫習一下,那麼你更高更快的勝任這份工作。
但是,對於一個只是瞭解應用知識的程式設計師來說,他需要想辦法學習你用4年時間堆積起來的知識,而且還不一定有可靠的老師能夠教他。
再舉個例子,現在華為需要一些技術人才,來做他方舟編譯器的迭代,待遇非常可觀。
而這時,對於懂資料結構、懂演算法、懂編譯原理的人來說,查的無非就是一些應用實踐的知識,這些知識只要有基礎、有環境,1-2周就可以上手。
但是對於只懂應用知識的人,他可能就是看都看不懂,華為也就不可能去招聘這樣的人。
所以,程式設計師也是有高低之分的,有的年薪百萬,有的年薪可能就十來萬。誰不想拿百萬年薪呢?可能他們也覺得某些知識沒有用,所以沒有去認真的學吧。