<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          計算機(jī)基礎(chǔ)知識對程序員來說有多重要?

          共 2963字,需瀏覽 6分鐘

           ·

          2020-06-06 23:22

          cb4f697843d2de5b33876505f3ce8aa1.webpf42e8653de402af654b3907e219a6aaf.webp


          點擊「閱讀原文」查看良許原創(chuàng)精品視頻。

          數(shù)據(jù)結(jié)構(gòu)和算法,操作系統(tǒng),編譯原理,計算機(jī)組成原理這些課程對普通程序員來說是否需要去學(xué)習(xí)?會帶來哪些幫助?

          這是一個知乎上的熱門問題,以下是我的回答。


          我們依次來了解這幾門課程是在工作中有啥用,回答有點長,請保持耐心:)

          1


          ? ?

          一、數(shù)據(jù)結(jié)構(gòu)與算法

          正如 N.Wirth 教授所說的:數(shù)據(jù)結(jié)構(gòu)+ 算法=程序

          遇到一個實際問題,充分利用所學(xué)的數(shù)據(jù)結(jié)構(gòu),將數(shù)據(jù)及其之間的關(guān)系有效地存儲在計算機(jī)中,然后選擇合適的算法策略,并用程序高效實現(xiàn)。

          這句話可能有點抽象,我舉個例子給你們解釋一下

          在工作過程中,我們多多少少都接觸過 OAuth2 ,在使用 OAuth2 授權(quán)的時候,通常應(yīng)用會彈出一個類似這樣的信息:

          1) 獲取用戶基本信息接口
          2) 獲取用戶列表接口
          3) 用戶分組管理接口
          。。。


          81887fd3080cfe2a9ca2310906dd2017.webp

          思考一下,如果讓你設(shè)計數(shù)據(jù)庫,應(yīng)該怎么設(shè)計信息存儲權(quán)限?

          如何你熟練掌握了各種數(shù)據(jù)結(jié)構(gòu)的特點的話,那自然而然想到使用 bitmap 來存儲權(quán)限。

          我們把權(quán)限劃分成最小粒度之后,每一個 bit 都它的含義, 例如我們把權(quán)限劃分為以下幾種:

          • 獲取你的頭像、性別、昵稱等基本用戶信息

          • 以你的身份發(fā)布微博

          • 獲取你的好友列表

          • 獲取你的朋友圈信息

          每勾選一個選項,就代表著這個權(quán)限被授權(quán),為了保證可擴(kuò)展性,我們使用一個 uint64 來保存這些 bit ,也就是說,我們一共可以劃分 64 種細(xì)分權(quán)限,然后對這些權(quán)限進(jìn)行組合。

          例如,第一個 bit 如果設(shè)置了,那么就代表可以獲取你的昵稱、頭像、地區(qū)、性別等基本用戶信息, 第二個 bit 如果設(shè)置了,就可以用你的身份發(fā)狀態(tài)。

          數(shù)據(jù)結(jié)構(gòu)的實際作用還有挺多,感興趣的可以搜索以下知識點:

          1. 二叉樹搜索用于中斷處理、登記緩存查找等

          2. 哈希表,用于實現(xiàn)索引節(jié)點、文件系統(tǒng)完整性檢查等

          3. 紅黑樹用于調(diào)度、虛擬內(nèi)存管理、跟蹤文件描述符和目錄條目等

          4. Radix 樹,用于內(nèi)存管理、NFS 相關(guān)查找和網(wǎng)絡(luò)相關(guān)的功能

          5. ......

          上面這些例子是關(guān)于數(shù)據(jù)結(jié)構(gòu)的,我再舉一個算法的例子。

          同樣的也來思考一個問題:計算機(jī)的緩存容量無論再大,緩存滿了還是要刪除一些內(nèi)容,給新內(nèi)容騰位置。

          那么刪除哪些內(nèi)容呢?我們肯定希望刪掉哪些沒什么用的緩存,而把有用的數(shù)據(jù)繼續(xù)留在緩存里,方便之后繼續(xù)使用。那么,什么樣的數(shù)據(jù),我們判定為「有用的」的數(shù)據(jù)呢?

          這個時候采取的策略就是 LRU 緩存淘汰算法

          LRU 的全稱是 Least Recently Used,也就是說我們認(rèn)為最近使用過的數(shù)據(jù)應(yīng)該是是「有用的」,很久都沒用過的數(shù)據(jù)應(yīng)該是無用的,內(nèi)存滿了就優(yōu)先刪那些很久沒用過的數(shù)據(jù)。

          具體的關(guān)于 LRU 緩存淘汰算法 的介紹可以看我之前寫的一篇文章。

          2


          ? ?

          二、操作系統(tǒng)

          先來看一下操作系統(tǒng)都有哪些內(nèi)容。

          186d77d7c96afeb6be19be45b7f61b46.webp

          現(xiàn)代計算機(jī)系統(tǒng)由一個或多個處理器、主存、打印機(jī)、鍵盤、鼠標(biāo)、顯示器、網(wǎng)絡(luò)接口以及各種輸入/輸出設(shè)備構(gòu)成。

          說實話,程序員不可能會掌握所有計算機(jī)系統(tǒng)的細(xì)節(jié),所以在硬件的基礎(chǔ)之上,計算機(jī)安裝了一層軟件,這層軟件能夠通過響應(yīng)用戶輸入的指令達(dá)到控制硬件的效果,從而滿足用戶需求,這種軟件稱之為 操作系統(tǒng)它的任務(wù)就是為用戶程序提供一個更好、更簡單、更清晰的計算機(jī)模型

          我們依舊通過一個例子來解釋操作系統(tǒng)在工作中的幫助。

          例子來源于 知乎大佬 @invalid s 。

          比如說,做一個網(wǎng)絡(luò)代理軟件,不過是從 socket 上收一個包然后轉(zhuǎn)發(fā)給另一個 socket 而已,這好像和操作系統(tǒng)沒多大關(guān)系吧?

          但真做了,你會發(fā)現(xiàn),用一個線程處理網(wǎng)絡(luò) IO,只要寫對了,那么哪怕系統(tǒng)壓力很大,只要 CPU 頂?shù)米。涂梢员WC引入的延遲總是在幾個毫秒之內(nèi);但如果用了多線程分別處理收/發(fā),那么只要網(wǎng)絡(luò)壓力稍大,引入的延遲就會增加,很快額外延遲就可能突破幾十個毫秒(這實際上已經(jīng)完全不能用了)。

          想搞明白這是為什么,對操作系統(tǒng)調(diào)度原理、時間片等概念沒有足夠深刻的理解,是不可能的。

          尤其是,當(dāng)你突然遇到類似“系統(tǒng)壓力一大網(wǎng)絡(luò)延遲急劇升高”的 bug 時,如果對操作系統(tǒng)沒有深入理解,你連準(zhǔn)確描述都做不到,連查資料、求幫助都不知道該往哪個方向努力,更不用說 debug 了。

          換句話說,你可以不造輪子,但是你要知道這輪子是怎么造的,否則你連問問題都不知道如何去描述。

          再降維一點,你總要掌握如何安裝 Windows 系統(tǒng)吧,否則妹子讓你去她房間里修電腦你都只能拒絕掉!

          66ca4e1a6dd85a32c71f64ab60233dad.webp

          3


          ? ?

          三、編譯原理

          眾所周知,編譯技術(shù)是計算機(jī)科學(xué)史上的明珠之一。

          對于編譯原理,很多程序員的困惑就是:我也不會去設(shè)計一門新的編程語言,有必要學(xué)習(xí)編譯原理嗎?學(xué)了有什么用呢?

          實際上,編譯原理不是用于炫耀的屠龍技,程序員在工作中經(jīng)常會碰到需要編譯技術(shù)的場景,比如:

          • 編寫界面模板引擎;

          • 為項目編寫各種各樣的 DSL;

          • 深度理解甚至開發(fā)出 Spring、Hibernate、阿里巴巴 Druid 這樣的工具。

          除此之外,解析用戶輸入,防止代碼注入,為前端工程師提供像 React 那樣的 DSL,像 TypeScript 那樣把一門語言翻譯成另一門語言,像 CMake 和 Maven 那樣通過配置文件來靈活工作,運維工程師分析日志文件等等高級別的需求,都會用到編譯技術(shù)。

          當(dāng)然,說實話,編譯原理并非隨隨便便就能入門的

          換言之,需要準(zhǔn)備一些基礎(chǔ)知識在學(xué)習(xí)。

          編譯原理的學(xué)習(xí)和實踐通常基于對計算機(jī)編譯過程、計算機(jī)基本工作原理、甚至一定的數(shù)學(xué)知識有一定積累,這些知識分別分布并應(yīng)用在了編譯原理的不同階段。

          沒有這些基本知識的積累,很快就會在某個階段由于功底不夠而無法再繼續(xù)后面的學(xué)習(xí)。

          所以不要一開始就去啃編譯原理。

          4


          ? ?

          四、計算機(jī)組成原理

          a0b7842415dfca478ebccc151a1508fe.webp

          從上面這張圖可以看出來,整個計算機(jī)組成原理,就是圍繞著計算機(jī)是如何組織運作展開的

          我們依舊來舉例子:)

          每個程序員應(yīng)該都知道 Ascii 碼,GB2312,GBK,Utf8,Unicode 等編碼格式,如果你沒接觸過,那總出現(xiàn)過文件壓縮后解壓亂碼的情況吧?

          了解了這些編碼的存儲格式,你才會明白為什么會有中文亂碼問題,靠,我在寫這個回答的時候,我的后端同事發(fā)給我的日志就出現(xiàn)了中文亂碼。。。。

          再來個例子。

          我們上面舉的關(guān)于 LRU 緩存算法 的例子,它的設(shè)計也是借鑒計算機(jī)組成原理的內(nèi)容的,

          在計算機(jī)的世界里,空間換時間,時間換空間這個概念在復(fù)雜的設(shè)計中時常出現(xiàn)。

          如果你想更詳細(xì)的了解 計算機(jī)組成原理 的知識,推薦一本書:《計算機(jī)組成:結(jié)構(gòu)化方法》。

          書的內(nèi)容完全建立在“計算機(jī)是由層次結(jié)構(gòu)組成的,每層完成規(guī)定的功能”這一概念之上。

          • 1、數(shù)字邏輯層

          • 2、微體系結(jié)構(gòu)層

          • 3、指令系統(tǒng)層

          • 4、操作系統(tǒng)層

          • 5、匯編語言層

          • 6、并行體系結(jié)構(gòu)


          以上就是我對 計算機(jī)基礎(chǔ)知識對程序員來說有多重要 的一個回答。


          良許個人微信


          添加良許個人微信即送3套程序員必讀資料


          → 精選技術(shù)資料共享

          → 高手如云交流社群





          本公眾號全部博文已整理成一個目錄,請在公眾號里回復(fù)「m」獲取!

          推薦閱讀:

          一個騷命令防止你的文件被誤刪除!

          我刪刪刪庫了,要跑路嗎?

          公眾號兩周年!


          5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲取!!


          瀏覽 51
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲午夜电影网 | 韩国一级无码 | 国产v欧美v亚洲v精品v | 欧美影院屄 | 狠狠色777 |