1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        計算機基礎知識對程序員來說有多重要?

        共 2963字,需瀏覽 6分鐘

         ·

        2020-06-06 23:22

        cb4f697843d2de5b33876505f3ce8aa1.webpf42e8653de402af654b3907e219a6aaf.webp


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

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

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


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

        1


        ? ?

        一、數(shù)據(jù)結構與算法

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

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

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

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

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


        81887fd3080cfe2a9ca2310906dd2017.webp

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

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

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

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

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

        • 獲取你的好友列表

        • 獲取你的朋友圈信息

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

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

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

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

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

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

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

        5. ......

        上面這些例子是關于數(shù)據(jù)結構的,我再舉一個算法的例子。

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

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

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

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

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

        2


        ? ?

        二、操作系統(tǒng)

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

        186d77d7c96afeb6be19be45b7f61b46.webp

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

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

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

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

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

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

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

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

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

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

        66ca4e1a6dd85a32c71f64ab60233dad.webp

        3


        ? ?

        三、編譯原理

        眾所周知,編譯技術是計算機科學史上的明珠之一。

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

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

        • 編寫界面模板引擎;

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

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

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

        當然,說實話,編譯原理并非隨隨便便就能入門的!

        換言之,需要準備一些基礎知識在學習。

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

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

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

        4


        ? ?

        四、計算機組成原理

        a0b7842415dfca478ebccc151a1508fe.webp

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

        我們依舊來舉例子:)

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

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

        再來個例子。

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

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

        如果你想更詳細的了解 計算機組成原理 的知識,推薦一本書:《計算機組成:結構化方法》。

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

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

        • 2、微體系結構層

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

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

        • 5、匯編語言層

        • 6、并行體系結構


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


        良許個人微信


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


        → 精選技術資料共享

        → 高手如云交流社群





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

        推薦閱讀:

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

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

        公眾號兩周年!


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


        瀏覽 51
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            四房五月夜夜 | 色偷偷免费 | 91精品人妻一区二区三区果冻 | 公子土匪夹得真紧h男男 | 精久久久久久久91 | 美女骚逼被操舒服网站 | 亚洲精品久久久久久久久久久久久 | 免费的性生活视频 | 女人又爽又黄触手视频 | 大香蕉在线精品 |