一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計算機編程領(lǐng)域的知識

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:編程指北 ? 作者:編程指北 ? 2020-10-30 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

為什么突然想寫這個話題呢? 最近有不少新關(guān)注的讀者,在后臺問:大學學 JavaC++ 哪個好找工作,學前端好還是后端好,該學 Vue 還是 React。。。 仿佛看到了自己當年的模樣,所以覺得有必要單獨寫一篇文章,單純以一個計算機應(yīng)屆畢業(yè)生的身份聊聊,我認為大學四年,計算機科班學生應(yīng)該學些什么,哪些才是重點。 同樣大學四年,為什么有些同學畢業(yè)就能成為大廠 Offer 收割機,各種 SP、SSP 拿到手軟,有的同學明明在學校寫了好多網(wǎng)站,項目經(jīng)歷滿滿,經(jīng)歷春秋招,卻找到一份工作都很難。不能說后者沒認真學習,或許是用力的方向不對。話不多說,直接進正題吧。

正文

人類的知識邊界一直在不斷的擴張,俗話說學無止境,這放在計算機領(lǐng)域也同樣適用,計算機本身是一個人造科學,不屬于自然科學。 每年,甚至每個月都不斷有新的編程框架推出,學到頭禿你也學不完,也沒有必要去挨個學。 并且你會發(fā)現(xiàn),很多一二線大廠內(nèi)部用的東西基本都是自己搞一套的,比如服務(wù)發(fā)現(xiàn)、RPC、KV、DB、消息隊列、日志、監(jiān)控等等。 所以一般這些大廠招聘的時候基本不會因沒學過某種框架而掛你,反正很多東西都是要進來重新學的。 他們會更加關(guān)注你的基礎(chǔ)知識、解決問題的經(jīng)驗以及聰明度這種更加通用的能力上。 反而是一些小公司,可能會要求你必須會 Spring、Vue、Redis... 這些框架或者組件。

騰訊JD

阿里JD

某家外包JD 上面分別是騰訊、阿里、某外包公司的招聘 JD(job description),顯然,騰訊阿里看中的是扎實的編程基本功和快速學習能力,這意味著有培養(yǎng)潛力。 而外包公司就要求你會 xx 數(shù)據(jù)庫、Spring 之類。不去評價哪個好,但是如果你想去 BAT,那是不是至少對照著它們的 JD 來提高自己的能力,不失為一種捷徑。 在這里,我粗淺的把計算機編程領(lǐng)域的知識分為三個部分:

基礎(chǔ)知識

特定領(lǐng)域知識

框架和開發(fā)技能

基礎(chǔ)知識是指不管從事任何方向的軟件工程師都應(yīng)該掌握的,比如數(shù)據(jù)結(jié)構(gòu)、算法、操作系統(tǒng)。 特定領(lǐng)域知識就是你從事某個細分方向時需要掌握的知識,比如做游戲引擎的需要掌握圖形學;做前端的需要掌握瀏覽器渲染原理、前端三大件;算法工程師需要更多的數(shù)學知識。 畢竟計算機各種門類挺多的,需要選個細分方向?qū)Q邢氯ィ裁炊紝W只會什么都不精(大佬除外啦。

一、基礎(chǔ)知識

現(xiàn)在大環(huán)境比較浮躁,很少有人愿意花心思在基礎(chǔ)上,喜歡直接學 Python機器學習、寫秒殺、做商城。 找工作的時候都是想看面經(jīng)、總結(jié)速成。 但是作為優(yōu)秀的計算機系學生的你怎么能流于各種編程框架(造框架除外),糾結(jié)學 SpringBoot 還是 SSH 呢? 把時間花在算法、基礎(chǔ)學科上他不香嗎?功利一點講,回報反而會更大。 況且在計算機領(lǐng)域,很多基礎(chǔ)的理論并不十分高深,我們努努力就可以掌握其中的核心知識。

1.1 數(shù)學

首先說明,這里把數(shù)學列出來不是為了顯得高端,而是自己吃過數(shù)學的虧。 如果你是自學轉(zhuǎn)行當程序員,我當然不會推薦數(shù)學,因為轉(zhuǎn)行的大概率是去學 Java、前端這類,對數(shù)學基本沒啥要求。 但是這篇文章主要面向的是還在大學的科班學生,這部分同學以后也許會去做算法(CV、NLP之類)、游戲引擎、信息安全編碼等 這些方向?qū)?shù)學要求就會偏高,在計算機領(lǐng)域,線代、概率論、統(tǒng)計學這些數(shù)學分支相對比較重要,計算機本質(zhì)上還是離散的。 比如在機器學習或數(shù)據(jù)挖掘中常常用線性代數(shù)來降低數(shù)據(jù)維度,很多問題最終都能化為求解線性方程組。 所以為了避免以后想走這些方向卻被數(shù)學卡住,在大一、大二上數(shù)學課的時候就好好的學一下。 書到用時方恨少,不要現(xiàn)在以為沒用處就不好好學,等你需要的時候,就知道后悔了。(默默流下了不學無術(shù)的眼淚┭┮﹏┭┮ 什么?你說以后肯定做開發(fā)方向? 那的確可以把數(shù)學優(yōu)先級放后面一點,用得確實不多,不過上數(shù)學課的時候總該認真聽下吧,拿個高績點也是百利無一害嘛。說不準哪天你又想加入算法內(nèi)卷大軍呢?

1.2 C語言

你也許會很疑惑,這里明明說基礎(chǔ)知識,為什么要把一門編程語言單獨列出來呢? 因為在我看來,沒有比 C 語言更適合用來理解計算機系統(tǒng)了。 我們后面將會提到的操作系統(tǒng)、體系結(jié)構(gòu) 這些東西非常適合用 C 語言去理解或者去實踐。 并且 C 語言本身的語言特性非常少,但是想學好又是不容易,很多人都覺得 C 語言難,難在哪里呢?回想了一下我大一時的感受:

簡陋的標準庫,幾乎沒有可用的數(shù)據(jù)結(jié)構(gòu)和算法,什么都得自己來

指針很難理解和使用

需要了解匯編、鏈接、裝載、內(nèi)存等才能把 C 語言用好

不巧的是,這些東西正是計算機系統(tǒng)知識的一部分,所以用 C 語言作為學習計算機系統(tǒng)知識是最有效率的方式。 真的很難想象用 Java 或是 Python 去給別人講解內(nèi)存,因為這些語言抽象程度都比 C 語言高,意味著離計算機系統(tǒng)也就越遠。 在 TIOBE 編程語言排行榜上,C語言幾乎永遠占據(jù)前三位,其地位自然毋庸置疑。

TIOBE-2020排行榜 而且?guī)缀跄汩_發(fā)中用到的很多東西都是用C語言編寫的,Linux、Nginx、Redis、MySQL、Git......或許你會想要探究下原理,閱讀點這些開源軟件的源碼,那么 C 語言也是你必備的瑞士軍刀。 深入學習 C 語言,能夠了解計算機底層的執(zhí)行原理,是理解程序運行機制的絕佳語言,無出其右。 在這里,不得不引用對C語言最經(jīng)典的總結(jié):

任何比C語言更低級的語言,都不足以完整地抽象一個計算機系統(tǒng);任何比C高級的語言,都可以用C來實現(xiàn)。

這真是極高而中肯的評價! 所以對于計算機科班來說,不管你是做前端還是后端,算法還是開發(fā),C 語言都建議你好好學習。這是無關(guān)方向的一門語言,就是基礎(chǔ)!

1.3 操作系統(tǒng)

我們編程的 IDE、寫出來的程序全部都需要運行在操作系統(tǒng)上,說操作系統(tǒng)是計算機軟件的基石也不為過。 程序運行起來就需要創(chuàng)建進程,這涉及到操作系統(tǒng)的進程管理;寫程序需要定義變量、存儲數(shù)據(jù)吧,這又涉及到內(nèi)存,對應(yīng)內(nèi)存管理;有時候我們還需要讀寫文件,這又離不開和文件系統(tǒng)打交道;你需要學習使用鎖、條件變量、臨界區(qū)來保證程序并發(fā)執(zhí)行時不會錯亂。 而讀寫文件、分配內(nèi)存這些又離不開系統(tǒng)調(diào)用(System call)。 并且當你真正做起工程就會發(fā)現(xiàn),很多問題是和操作系統(tǒng)緊密相關(guān)的,不理解操作系統(tǒng),你連問題的原因都分析不出來。 比如前段時間我們出現(xiàn)的在基于協(xié)程(libco)的框架下,使用多線程的鎖去做同步互斥偶發(fā)死鎖,后來分析才發(fā)現(xiàn)原因: 由于協(xié)程是應(yīng)用層實現(xiàn)的,一個線程內(nèi)多個協(xié)程對于操作系統(tǒng)是感知不到的:

協(xié)程模型 那么當一個協(xié)稱 A 上鎖后發(fā)起網(wǎng)絡(luò) IO 請求,這個時候會被切換到另外一個協(xié)程B,而協(xié)程 B 又去請求這個鎖。 那么這個時候操作系統(tǒng)會認為這個鎖已經(jīng)被上了,因此會將協(xié)程 B 對應(yīng)的線程掛起到等待隊列,這樣的話就導致協(xié)程 A 永遠無法運行,也就無法釋放鎖,導致死鎖。 解決的方法也很簡單,就是將鎖設(shè)置為可重入鎖,可重入意味著同一個線程多次去請求同一個鎖不會導致掛起。這樣當協(xié)程 B 再去請求鎖的時候,操作系統(tǒng)就會認為協(xié)程 B 所在的線程已經(jīng)持有這個鎖了,直接返回,繼續(xù)執(zhí)行。 總之,我們寫程序每時每刻都在和操作系統(tǒng)交互,沒有理由不學好。

1.4 編譯原理

編譯原理可能是我們平時接觸得最少的了,大家也許會覺得自己又不用去造新的編程語言,學編譯原理干啥。 學好編譯原理有啥用? 你會站在更高的角度去審視這些編程語言,看到的不再是表面的語法,更會想到語法背后的實現(xiàn)。 這種感覺很透徹,就像搞懂了操作系統(tǒng)、體系結(jié)構(gòu)你會明白一個程序從雙擊鼠標開始,到底是如何被運行起來的,這種掌握一切細節(jié),透徹的感覺,真的很奇妙,不信你去試試。 說人話! 那學了編譯原理你能干啥? 當你學完有限狀態(tài)機以后,你會發(fā)現(xiàn)以前覺得很牛逼正則表達式似乎自己也能用 DFA、NFA 實現(xiàn)一下了。狀態(tài)機的思想在編程中很多地方都用得上。 比如解析 HTTP 協(xié)議,如果沒學過狀態(tài)機思想,你可能會一行行的 if/else 去做解析,這里最麻煩的地方在于,if/else 需要提前將 HTTP 頭部字段都接收到再來判斷,而我們知道 HTTP 基于 TCP,而 TCP 是流式傳輸,所以你很有可能是幾個字符一組組接收到的,這個時候用 if/else 寫出來就很難看了。 而用狀態(tài)機編寫起來代碼就會非常優(yōu)雅。狀態(tài)的轉(zhuǎn)移是由規(guī)則驅(qū)動的,接收到一個字符就判斷一個,非常的方便。 繼續(xù)學完語法分析,你會掌握遞歸下降分析這樣非常重要的思想,你可以使用遞歸下降快速的實現(xiàn)四則運算計算器。 如果不用遞歸下降你可能需要先中綴表達式轉(zhuǎn)后綴,然后求值,這是我們大一數(shù)據(jù)結(jié)構(gòu)課寫的,當時用棧寫的,有點麻煩。后來學完編譯原理,又用遞歸下降重寫了一遍,區(qū)區(qū)幾十行代碼遍搞定。 還有一類場景在實際開發(fā)中的用的很多,比如淘寶、京東這樣的電商,它們的營銷規(guī)則有很多,比如滿減、直減、跨店等等,這樣的規(guī)則是不可能寫死在代碼里的。 那是怎么做的呢? 一般會實現(xiàn)一個配置系統(tǒng),并設(shè)計一個DSL(領(lǐng)域特定語言)來表達這些規(guī)則,將規(guī)則直接配置到系統(tǒng)中,這樣可以非常方便的修改,那么如何在代碼里去解析 DSL 定義的規(guī)則呢?這就需要為 DSL 寫一個語法解析器,這里就會用到語法分析的方法。 DSL(Domain Specific Language),是一種用于某個特定領(lǐng)域的程序設(shè)計語言。這種特定于某個領(lǐng)域是相對于 C、C++、Python 這種通用語言而言的,通用語言可以在各個領(lǐng)域使用,我們熟悉的大多數(shù)程序設(shè)計語言都是通用語言,它們都是圖靈完備的。 像我們平常經(jīng)常使用的 JSON、SQL、HTML 這些都算是一種 DSL,你甚至可以嘗試用遞歸下降去寫一個 JSON、XML 解析器,這比寫電商網(wǎng)站更有價值的。 繼續(xù)往下學你會了解到抽象語法樹 AST 如何生成、如何轉(zhuǎn)化為中間代碼、如何對中間代碼優(yōu)化、最終又是怎么生成機器指令的。 你會看到貪心算法在寄存器分配中的應(yīng)用,也會看到圖論中的可達性分析又是如何實現(xiàn)死代碼消除。 IDE上面那個綠色的編譯按鈕對你不再是黑魔法。 為啥點一下就能生成可執(zhí)行的程序? 你寫的英文字母又是如何變成一個個二進制指令的? 學完編譯原理,這些通通不是問題,媽媽再也不用擔心你的學習~ 當然完成一個像 GCC、Clang 這樣的編譯器難度太高太高,我們學習編譯原理的目的也不是去造這樣的輪子,而是為了更好的理解和運用編程語言。

1.5 體系結(jié)構(gòu)&組成原理

上面說的都是軟件層面,體系結(jié)構(gòu)則是關(guān)于計算機是如何工作的,你會了解到典型的存儲程序計算機是怎樣運轉(zhuǎn)的。 記得南大有個老師說過 “我們不是學習使用計算機的,而是學習如何造計算機”,雖然造計算機有點夸張,但是至少我們得了解下計算機的實現(xiàn)原理,了解下代碼是怎么被 CPU 執(zhí)行的吧?不然其實你會很困惑,明明一堆英文字母,怎么在 CPU 這種電路上跑起來的,我大一學 C 語言就百思不得其解,直到后來學了組成原理和數(shù)字邏輯。 我們說計算機中一切都是 0、1,0、1 又是通過高低電平來表達的,通過與、或、非等邏輯門電路來表達二進制的數(shù)值運算,再將這些簡單的電路集成在一起,就形成了 ALU 等具有運算能力的處理器。 你會看到一條指令是如何被CPU執(zhí)行的,CPU 從內(nèi)存或 Cache 中取出指令,放入指令寄存器,并對指令譯碼。譯碼就是按照指令的編碼規(guī)則,將指令拆分成一系列的微操作和操作數(shù)。然后發(fā)出各種設(shè)備控制指令,執(zhí)行微操作。這樣就完成一條指令的執(zhí)行。 我們說學完編譯原理,能夠明白寫的英文代碼是如何被變成二進制指令的,學完操作系統(tǒng)能搞懂二進制程序是如何被鏈接在一起,又是如何被操作系統(tǒng)加載、執(zhí)行的。而組成原理則會告訴你二進制指令是如何控制 CPU 跑起來的,我們的操作系統(tǒng)本質(zhì)上也是一個二進制的程序。 當你理解了計算機存儲層次結(jié)構(gòu),理解了多級 Cache,你就會通過優(yōu)化數(shù)據(jù)訪問方式來編寫出速度更快的程序。 你會學到底層體系結(jié)構(gòu)對 C 這些語言的棧幀和參數(shù)傳遞的支持,參數(shù)是如何被傳遞給另外一個函數(shù)的?函數(shù)的返回值又是如何拿到。 這是學習組成原理對于寫代碼的意義。 學這些到底有什么意義? 你會完整的看到寫的代碼如何變成二進制指令,又是如何去控制各種門電路,最后變成屏幕上花花綠綠的程序的(當然這里可能還需要學習顯示器的原理),這就是我們常說的“基礎(chǔ)”和“原理”。 并且計算機體系結(jié)構(gòu)中的很多思想,是能夠廣泛運用于現(xiàn)代軟件開發(fā)的,比如 CPU 的多級 Cache 思想,就是我們現(xiàn)在服務(wù)器開發(fā)中提高并發(fā)度常用的緩存技術(shù),包括緩存的替換策略等等。 當計算機對你不再是黑盒,你了解寫下的代碼到執(zhí)行的每一步,而這也將成為你以后的核心競爭力,作為科班畢業(yè)生不應(yīng)該只會使用 Java、Redis、Mysql、Spring 來寫各種網(wǎng)站。 如果讀者里有半路轉(zhuǎn)行或者從培訓班出來的,也希望你們能夠抽出空余時間去補補這些基礎(chǔ)課,這會讓你在編程這條路上走的更遠和更穩(wěn)。

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

為什么把算法放到最后來講,是不重要嗎?相反,它太重要了,所以才讓它來壓軸。 如果要問我大學什么最后悔?那肯定是沒有從大一就開始好好學算法,去打 ACM。 現(xiàn)在還在大一、大二的同學還不抓緊機會,別等到以后來后悔。當然,不打 ACM,我們也是能夠?qū)W好數(shù)據(jù)結(jié)構(gòu)和算法的。 數(shù)據(jù)結(jié)構(gòu)和算法你能在任何計算機領(lǐng)域里看到,比如在編譯原理中寄存器的分配會用到貪心,死代碼檢測與消除會用到圖論里不可達的知識;操作系統(tǒng)進程、線程調(diào)度會用到多級隊列和調(diào)度算法;組成原理中 Cache 的替換會用到 LRU、FIFO 等算法;開發(fā)必備的數(shù)據(jù)庫也離不開 B+ 樹、LSM 等數(shù)據(jù)結(jié)構(gòu)和查找算法。 很多時候我們需要的算法都被封裝到編程語言的基礎(chǔ)庫里了,以至于很多同學會覺得算法離我們太遠,其實不是的。 如果不學習算法,連什么時候用 Map(紅黑樹實現(xiàn))、什么時候用 HashMap 都分不清。 所以學習算法有助于我們根據(jù)應(yīng)用場景選擇最合適的數(shù)據(jù)結(jié)構(gòu)。 日常開發(fā)中也一定離不開算法,比如小北最近工作中涉及的某種嵌套 TLV(Tag-Length-Value)結(jié)構(gòu)編碼的解析,就需要用到遞歸、多叉樹等知識。如果不學習算法,那么程序中只能見到大量的 if/else、while/for。。??梢哉f不會算法的工程師一定不是一個優(yōu)秀的工程師。

1.7 為什么我不說計網(wǎng)、數(shù)據(jù)庫等

很多人喜歡把計算機網(wǎng)絡(luò)、數(shù)據(jù)庫原理這些也歸為計算機基礎(chǔ)來,我當然也認同,因為一個知識結(jié)構(gòu)完整的計算機科班學生,應(yīng)該了解這些知識。 但是我個人是覺得計算機網(wǎng)絡(luò)、數(shù)據(jù)庫無非就是建立在操作系統(tǒng)、編譯原理、組成原理之上的應(yīng)用層軟件。 什么是數(shù)據(jù)庫?沒有數(shù)據(jù)庫之前你會用文件去存儲數(shù)據(jù),但是不方便查找、修改等,數(shù)據(jù)庫只是提高了這個過程的效率。 網(wǎng)絡(luò)干什么的?網(wǎng)絡(luò)就是讓不在同一臺電腦上的程序互相通信,本質(zhì)上就是進程間通信的手段。 如果你只是開發(fā)單機工業(yè)軟件,甚至真的可以不學網(wǎng)絡(luò),只是由于現(xiàn)在大多數(shù)程序員都是在互聯(lián)網(wǎng)公司工作,所以不管前后端,都離不開和HTTP等網(wǎng)絡(luò)協(xié)議打交道。再次重申:不是計網(wǎng)、數(shù)據(jù)庫不重要,只是我認為它們屬于構(gòu)建在操作系統(tǒng)之上的軟件,不劃在基礎(chǔ)之列。

二、領(lǐng)域知識

這個我不敢說太多,因為各個領(lǐng)域我也不太懂。只簡單提一點,拋磚引玉罷了。 如果你想去騰訊、網(wǎng)易做游戲引擎開發(fā),那么圖形學一定是你繞不開的知識,此外你還得學習渲染管線、著色器、物理、光照等等。 如果你想去 PingCap 這樣的公司做分布式存儲,那么分布式理論知識一定是你繞不開的關(guān)口,包括 CAP 定理、Paxos 算法、Raft 算法、ZAB 協(xié)議等等。 如果你想寫一個數(shù)據(jù)庫,那么你需要去了解磁盤、索引實現(xiàn)、SQL 解析(編譯原理)、事務(wù)、如何用 MVCC 解決讀寫沖突等等一大堆的東西,還得了解一大堆編程語言層面的東西,比如鎖、信號量、并發(fā)編程技巧,不得不說造數(shù)據(jù)庫是一個臟活也是一個累活。 更進一步你想去做分布式數(shù)據(jù)庫,那可能還得去學習數(shù)據(jù)分片的知識,查詢?nèi)蝿?wù)如何做,是集中做,還是將邏輯下推給各個節(jié)點,如何實現(xiàn)分布式事務(wù)等等。 你說你只想去大廠 CRUD?沒毛病,老鐵! 那你得熟悉一門編譯型語言(C/C++、Java、Go),理解語言部分底層原理,比如 C++ 你得看看 STL、看看對象模型吧,你不懂什么虛函數(shù)表、智能指針還想去騰訊寫 C++? Java 的你得背背 JVM,什么垃圾回收算法吧,你不看看ConcurrentHashMap 好意思說你是做Java的? 咱CRUD的對象是數(shù)據(jù)庫吧?那不得學學怎么才能把數(shù)據(jù)庫用好。用戶通過 HTTP 訪問我們得服務(wù),總得了解 HTTP吧?順帶著不看下 TCP 三次握手、四次揮手你好意思說是學計算機的? 用戶把錢、信息放咱們這,總得保證用戶數(shù)據(jù)安全吧?那 XSS、SQL 注入、CSRF 這些常見的 Web 攻擊手段你總得了解吧?HTTPS、RSA、簽名、數(shù)字證書這些安全手段總得知道吧。 雙十一流量太大,老板還讓你必須頂住,那你總得了解下緩存、異步、消息隊列、NoSQL 這些千萬 QPS 必備的大殺器吧? 看看!要想做好CRUD也不是那么容易滴。(上面這段只是換一種方式把做后端的同學要學的知識寫出來,不是吐槽更不是調(diào)侃,純屬娛樂。

技能

這就很多了,包括 VSCode、Jetbrains 全家桶這些 IDE,文檔編寫 Markdown、Git 等版本管理工具。SSH 遠程登錄、端口轉(zhuǎn)發(fā),Ngrok 內(nèi)網(wǎng)穿透等等這些提高你開發(fā)效率的工具,都算是技能,這個沒啥好說的,平時用到多學習多積累就好了。 我只提一點,盡早使用 Linux、類 Unix(Mac)作為主力開發(fā)電腦。我大二的時候,就是看了王 ying 的那篇《完全用 Linux 工作》,直接買了個 SSD 套上 U 盤外殼,做了一個啟動盤,后來用了將近一年的 Ubuntu,只有在選課、提交作業(yè)等需要用的 IE 瀏覽器的時候才會打開 Windows(這里不得不吐槽學校老古董網(wǎng)站?。?當然了,我也不是狂熱的 Linux 愛好者,只是單純覺得做開發(fā)的話,離不開各種環(huán)境安裝、命令行的使用,這點上面類 Unix 系統(tǒng)帶有天然的優(yōu)勢,誰用誰知道!

總結(jié)

寫完才發(fā)現(xiàn),這篇文章連篇幅都是「基礎(chǔ) : 領(lǐng)域知識 : 技能」 接近 7 : 2 : 1。 這也是我推薦你在大學期間分配學習時間的比例,至少學習基礎(chǔ)知識的時間不少于 50%,當然,這些東西你都學完了那可以去找找感興趣的方向?qū)Q幸幌隆?千萬不要大一、大二一上來就扎進 Java Web、Python 爬蟲這種東西,這些可以學,但不是重點。 這篇文章由于篇幅限制,沒有寫到具體該如何去學,有哪些好的資料,我準備把這個單獨再寫一個 《How 篇》,持續(xù)關(guān)注我喲~ 那么如何檢驗學得如何呢? 想必你一定聽說這個計網(wǎng)面試題:“從 URL 輸入到頁面展現(xiàn)到底發(fā)生什么?“ 這個問題換個表達就是「一個數(shù)據(jù)包是如何發(fā)送到另外一臺電腦的」。 如果你能完整的說出整個過程,那么計網(wǎng)你一定是學懂了!這就是為啥面試這么喜歡問這個問題的原因。 那么我們依葫蘆畫瓢提一個問題 “從代碼被寫下到程序運行起來到底發(fā)生了什么?” 這個問題回答得越詳細越好,基本上能說清楚了,你就理解了編譯原理、操作系統(tǒng)、組成原理這三座大三。 這個問題也放在這,后續(xù)發(fā)文總結(jié),請持續(xù)關(guān)注編程指北哦。 唉,當年要是有這么個貼心學長告訴我這些,也不至于在 Andorid 開發(fā)、Java Web、Python 爬蟲這些玩大半年啊。。。 不過還好后來自己意識到了基礎(chǔ)的重要性,開始學匯編、重學 C、搞 mini os、看 Linux 內(nèi)核實現(xiàn)原理,最后成功的把頭發(fā)掉了一把。。。 責任編輯:lq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7154

    瀏覽量

    125647
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141859
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40759

原文標題:怎樣才算一個計算機知識體系完整的畢業(yè)生-- What篇

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    云端超級計算機使用教程

    云端超級計算機是一種基于云計算的高性能計算服務(wù),它將大量計算資源和存儲資源集中在一起,通過網(wǎng)絡(luò)向用戶提供按需的計算服務(wù)。下面,AI部落小編為
    的頭像 發(fā)表于 12-17 10:19 ?557次閱讀

    工業(yè)中使用哪種計算機?

    在工業(yè)環(huán)境中,工控機被廣泛使用。這些計算機的設(shè)計可承受極端溫度、灰塵和振動等惡劣條件。它們比標準消費類計算機更耐用、更可靠。工業(yè)計算機可控制機器、監(jiān)控流程并實時收集數(shù)據(jù)。其堅固的結(jié)構(gòu)和專業(yè)功能
    的頭像 發(fā)表于 11-29 14:07 ?720次閱讀
    工業(yè)中使用哪種<b class='flag-5'>計算機</b>?

    量子計算機與普通計算機工作原理的區(qū)別

    ? 本文介紹了量子計算機與普通計算機工作原理的區(qū)別。 量子計算是一個新興的研究領(lǐng)域,科學家們利用量子力學,制造出具有革命性能力的計算機。雖然
    的頭像 發(fā)表于 11-24 11:00 ?1517次閱讀
    量子<b class='flag-5'>計算機</b>與普通<b class='flag-5'>計算機</b>工作原理的區(qū)別

    新思科技如何應(yīng)對量子計算機的威脅

    隨著技術(shù)發(fā)展的突飛猛進,量子計算機的威脅日益凸顯。盡管量子計算機有望在天氣預報、藥物研發(fā)和基礎(chǔ)物理學等領(lǐng)域帶來革命性的變革,但它也對現(xiàn)行加密體系構(gòu)成了顯著威脅。這種威脅并非僅限于未來;如今截獲的任何
    的頭像 發(fā)表于 11-18 09:33 ?935次閱讀

    工業(yè)計算機類型介紹

    工業(yè)領(lǐng)域沒有計算機的世界就像沒有管弦樂隊的交響樂,缺乏實現(xiàn)最佳性能所需的和諧和精確度。計算機徹底改變了工業(yè)的運作方式,將效率、準確性和創(chuàng)新推向了新的高度。事實上,根據(jù)最近在印度進行的一項研究
    的頭像 發(fā)表于 11-04 15:56 ?676次閱讀
    工業(yè)<b class='flag-5'>計算機</b>類型介紹

    ROM對計算機性能的影響

    是一種非易失性存儲器,即使在斷電的情況下也能保持數(shù)據(jù)不丟失。它通常用于存儲固件,這些固件是計算機啟動和運行操作系統(tǒng)所必需的。ROM的內(nèi)容在制造過程中被寫入,并且通常不能被用戶更改。 ROM的類型 PROM(可編程ROM) :用戶可以通過特殊的
    的頭像 發(fā)表于 11-04 10:31 ?1225次閱讀

    計算機接口位于什么之間

    計算機接口是計算機硬件和軟件之間、計算機與外部設(shè)備之間以及計算機各部件之間傳輸數(shù)據(jù)、控制信息和狀態(tài)信息的硬件設(shè)備和軟件程序。它在計算機系統(tǒng)中
    的頭像 發(fā)表于 10-14 14:02 ?1331次閱讀

    計算機存儲系統(tǒng)的構(gòu)成

    計算機存儲系統(tǒng)是計算機中用于存放程序和數(shù)據(jù)的設(shè)備或部件的集合,它構(gòu)成了計算機信息處理的基礎(chǔ)。一個完整的計算機存儲系統(tǒng)通常包括多個層次的存儲器,從高速緩存(Cache)到主存儲器(Mai
    的頭像 發(fā)表于 09-26 15:25 ?2551次閱讀

    簡述計算機總線的分類

    計算機總線作為計算機系統(tǒng)中連接各個功能部件的公共通信干線,其結(jié)構(gòu)和分類對于理解計算機硬件系統(tǒng)的工作原理至關(guān)重要。以下是對計算機總線結(jié)構(gòu)和分類的詳細闡述,內(nèi)容將涵蓋總線的基本概念、內(nèi)部結(jié)
    的頭像 發(fā)表于 08-26 16:23 ?5202次閱讀

    晶體管計算機和電子管計算機有什么區(qū)別

    晶體管計算機和電子管計算機作為計算機發(fā)展史上的兩個重要階段,它們在多個方面存在顯著的區(qū)別。以下是對這兩類計算機在硬件、性能、應(yīng)用以及技術(shù)發(fā)展等方面區(qū)別的詳細闡述。
    的頭像 發(fā)表于 08-23 15:28 ?3639次閱讀

    晶體管計算機的誕生和特點

    晶體管計算機的誕生標志著計算機技術(shù)的一個重要里程碑,它不僅推動了計算機硬件的革新,還促進了計算機軟件技術(shù)的發(fā)展。以下是對晶體管計算機誕生及其
    的頭像 發(fā)表于 08-23 15:06 ?4264次閱讀

    探索計算機領(lǐng)域PCB板:神秘電路的組合密碼

    計算機的“大功臣”,像舞臺讓電子元器件各顯神通。計算機發(fā)展中,PCB 板從單層進化到多層高密度,為提升性能提供動力,如同城市道路系統(tǒng)的擴建優(yōu)化,計算機進步離不開 PCB 板的創(chuàng)新。 計算機
    的頭像 發(fā)表于 08-14 17:47 ?760次閱讀

    計算機視覺有哪些優(yōu)缺點

    計算機視覺作為人工智能領(lǐng)域的一個重要分支,旨在使計算機能夠像人類一樣理解和解釋圖像和視頻中的信息。這一技術(shù)的發(fā)展不僅推動了多個行業(yè)的變革,也帶來了諸多優(yōu)勢,但同時也伴隨著一些挑戰(zhàn)和局限性。以下是對
    的頭像 發(fā)表于 08-14 09:49 ?2065次閱讀

    計算機系統(tǒng)的組成和功能

    計算機系統(tǒng)是一個復雜而龐大的概念,它涵蓋了計算機硬件、軟件以及它們之間相互作用的所有元素。為了全面而深入地探討計算機系統(tǒng),本文將從定義、組成、功能、發(fā)展歷程以及未來趨勢等方面進行詳細闡述。
    的頭像 發(fā)表于 07-24 17:41 ?2418次閱讀

    DRAM在計算機中的應(yīng)用

    DRAM(Dynamic Random Access Memory,動態(tài)隨機存取存儲器)在計算機系統(tǒng)中扮演著至關(guān)重要的角色。它是一種半導體存儲器,用于存儲和快速訪問數(shù)據(jù),是計算機主內(nèi)存的主要組成部分。以下是對DRAM在計算機中的
    的頭像 發(fā)表于 07-24 17:04 ?3035次閱讀